2010-09-13 37 views
18

¿Cómo proporciono la credencial para poder conectarme a una unidad de red en .NET?Conectar a la unidad de red con nombre de usuario y contraseña

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

+0

Creo que hay una manera más universal: http://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when-connecting- to-a-network-share/39540451 # 39540451 –

+0

Consulte esta solución http://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when-connecting-to-a -network-share/39540451 # 39540451 –

Respuesta

0

puede usar system.diagnostocs.process para llamar a 'net use .... with userid and password' o a un shell de comandos que los toma.

+0

Puede, pero ¿le gustaría? –

+0

¿Por qué no si logra el objetivo de su caso de uso? Entonces es completamente válido. Es una línea de código que logra el resultado deseado. Tiene incorporado todo el manejo de errores y se prueba y prueba. Parece tonto para reescribir la funcionalidad. –

+1

"si logra el objetivo de su caso de uso, entonces es completamente válido" - esa es una declaración muy radical, y su respuesta aquí es un contraejemplo en mi opinión. Comenzar un nuevo proceso para hacer algo que se puede hacer en una única P/Invoke (no es necesario reescribir) es usar un mazo para romper una nuez. –

12

La mejor manera de hacerlo es p/invoke 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 
     ); 

Example code here.

+2

Todavía me pregunto por qué C# simplemente no tiene un método así .. –

5

Puede usar la clase WindowsIdentity (con logon token) para suplantar mientras lee y escribe archivos.

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

Solo funciona bien en un entorno Windows. Cuando comienzas a ir a AS400, Solaris y Linux se vuelven problemáticos, especialmente si los recursos compartidos requieren una credencial distinta a la que estás ejecutando. – Riaan

+0

La solución de bzlm funciona, pero realmente no lo resolvió. Obtener un código de https://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx, es decir, la clase safeTokenHandle y dependencias. –

6

solución muy elegante inspirado 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 una pronta referencia:

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

¿Eso funcionó para ti? Obtengo una excepción no autorizada – VladL

+0

@VladL ¿puede acceder al recurso compartido de red manualmente usando el explorador de Windows? ¿Tiene los permisos necesarios para el usuario? – zendu

+0

por supuesto que sí :) – VladL

-2

Puede utilizar la clase WebClient para conectar con el controlador de red utilizando credenciales. Incluir el siguiente espacio de nombres:

using System.Net; 

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

Directory.GetDirectories no tiene nada que ver con WebClient; simplemente son líneas de código adyacentes en su ejemplo – alastairtree

Cuestiones relacionadas