Conéctese a la unidad de red con nombre de usuario y contraseña

¿Cómo proporciono la credencial para poder conectarme a una unidad de red en .NET?

Estoy tratando de recuperar archivos de una unidad de red y necesito proporcionar credenciales de usuario para acceder a la unidad.

La mejor forma de hacerlo es p / invocar WNetUseConnection .

[StructLayout(LayoutKind.Sequential)] private class NETRESOURCE { public int dwScope = 0; public int dwType = 0; public int dwDisplayType = 0; public int dwUsage = 0; public string lpLocalName = ""; public string lpRemoteName = ""; public string lpComment = ""; public string lpProvider = ""; } [DllImport("Mpr.dll")] private static extern int WNetUseConnection( IntPtr hwndOwner, NETRESOURCE lpNetResource, string lpPassword, string lpUserID, int dwFlags, string lpAccessName, string lpBufferSize, string lpResult ); 

Código de ejemplo aquí .

Solución muy elegante inspirada en http://social.msdn.microsoft.com/Forums/vstudio/en-US/287ca606-86da-4794-baed-2ad5db9bc833/access-to-remote-folder . Este usa solo la biblioteca .Net y no necesita usar ninguna línea de comando o API de Win32.

Código para referencia rápida:

 NetworkCredential theNetworkCredential = new NetworkCredential(@"domain\username", "password"); CredentialCache theNetCache = new CredentialCache(); theNetCache.Add(new Uri(@"\\computer"), "Basic", theNetworkCredential); string[] theFolders = Directory.GetDirectories(@"\\computer\share"); 

Puede usar la clase WindowsIdentity (con un token de inicio de sesión ) para suplantar mientras lee y escribe archivos.

 var windowsIdentity = new WindowsIdentity(logonToken); using (var impersonationContext = windowsIdentity.Impersonate()) { // Connect, read, write } 

puede usar system.diagnostocs.process para llamar a ‘net use …. with userid y password’ o a un shell de comandos que los tome.

Puede usar la clase WebClient para conectarse al controlador de red usando credenciales. Incluye el siguiente espacio de nombre:

 using System.Net; WebClient request = new WebClient(); request.Credentials = new NetworkCredential("domain\username", "password"); string[] theFolders = Directory.GetDirectories(@"\\computer\share");