2010-04-26 24 views
7

¿Hay alguna forma de autenticarse como usuario local (no de red) para copiar archivos a través de la red en .Net?Copiar archivos a través de la red (requiere autenticación)

net use no es una opción, y no puedo hacer que LogonUser funcione.

¿Alguna idea?


[Editar] Aquí hay un código:

public class UserImpersonator : IDisposable 
{ 
    private WindowsImpersonationContext _impersonationContext; 
    private IntPtr _userHandle = IntPtr.Zero; 

    [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     out IntPtr phToken 
     ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern bool CloseHandle(IntPtr hHandle); 

    public UserImpersonator(string username, string password) 
    { 
     LogonUser(username, "", password, (int)LogonType.LOGON32_LOGON_NETWORK, 
        (int)LogonProvider.LOGON32_PROVIDER_DEFAULT, out _userHandle); 
     _impersonationContext = WindowsIdentity.Impersonate(_userHandle); 
    } 

    public void Dispose() 
    { 
     CloseHandle(_userHandle); 
     _impersonationContext.Undo(); 
    } 

    private enum LogonType : int 
    { 
     LOGON32_LOGON_INTERACTIVE = 2, 
     LOGON32_LOGON_NETWORK = 3, 
     LOGON32_LOGON_BATCH = 4, 
     LOGON32_LOGON_SERVICE = 5, 
     LOGON32_LOGON_UNLOCK = 7, 
     LOGON32_LOGON_NETWORK_CLEARTEXT = 8, 
     LOGON32_LOGON_NEW_CREDENTIALS = 9, 
    } 

    private enum LogonProvider 
    { 
     LOGON32_PROVIDER_DEFAULT = 0, 
    } 
} 

Cuando envuelvo la operación File.Copy en using(new UserImpersonator(username, password)), me sale:

System.IO.IOException: Error de inicio : nombre de usuario desconocido o contraseña incorrecta.

Si, sin embargo, primero intento conectarme al recurso compartido en el explorador (ingresando la información de autenticación cuando lo solicita), el File.Copy funciona. Parece que el código anterior no hace nada en absoluto.

Respuesta

0

Realmente necesita iniciar sesión en una cuenta local que sea miembro de un grupo en el controlador de dominio o simplemente iniciar sesión directamente en una cuenta de DC. Sin más información, sin embargo, no estoy seguro de con qué estás teniendo problemas. ¿Podrías publicar el código?

edición

Ok, veo dos problemas.

El problema principal es que está pasando una cadena vacía para el parámetro de dominio de LogonUser. Intente pasar el nombre de la máquina local o la red DC.

El problema lateral es que debe iniciar sesión usando Batch o Interactive, no Network. El inicio de sesión de red le proporciona un token de suplantación, no un inicio de sesión principal, lo que puede evitar que llegue a los recursos de la red a menos que la delegación esté habilitada.

Además, una vez que lo hagas funcionar, querrás quitar el IntPtr por completo y reemplazarlo con un SafeHandle.

+0

@Steven: ver edición. –

+0

Háganos saber si eso ayuda. –

+0

Y si el nombre de la computadora es desconocido ...? (Solo sé el IP) –

1

¿Puedo dirigir a mi respuesta puse sobre here? Debería funcionar para sus necesidades.

Cuestiones relacionadas