¿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.
Funciona perfectamente sin tener que saber el nombre de la computadora, ¡gracias! –