2009-09-17 14 views
8

Tengo una aplicación de formularios de Windows ejecutándose en una máquina que no está en un dominio, que necesita para poder mover un archivo desde el sistema de archivos local a una ruta UNC. Tengo un nombre de usuario y contraseña para esa ruta. Me preguntaba ¿hay alguna manera de hacer esto directamente sin tener que ejecutar el comando net.exe?Cómo accedo a un archivo compartido programáticamente

Idealmente, no tendría que mapear un disco.

Respuesta

4

La respuesta aceptada en esta pregunta here parece que valdría la pena investigar; sugiere utilizar la función de API Win32 WNetUseConnection.

De MSDN:

El función WNetUseConnection hace una conexión a un recurso de red. La función puede redirigir un dispositivo local a un recurso de red.

Lo que parece lograr lo que está buscando, sin mencionar net.exe. ¿Esto ayuda?

+0

Gracias por la punta voy a echar un vistazo en ella. Sin embargo, me pregunto por qué no hay algo similar en .NET. – Mykroft

1

Creo que necesitará asignar una unidad. Todavía no he encontrado una forma de evitarlo. Sin embargo, ver este post:

Asp.net Access To Network Share

de alguien más respuesta fue aceptada, pero tengo código escrito en otra respuesta para la simplificación de una unidad de red.

0

Mira la publicación this. Utiliza P/Invoke para llamar a Win32 API LogonUser() y amigos. También hay algún código de ejemplo proporcionado.

11

Puede usar WNetAddConnection para lograr esto. Tendrás que invocar. el código siguiente funcionó para mí después de configurar las declaraciones pInvoke. El segundo bloque de código (a continuación) contiene las declaraciones de pInvoke: simplemente péguelo dentro de una clase.

 

     public static void CopyFile(string from, string shareName, string username, string password) 
     { 
      NETRESOURCE nr = new NETRESOURCE(); 
      nr.dwType = ResourceType.RESOURCETYPE_DISK; 
      nr.lpLocalName = null; 
      nr.lpRemoteName = shareName; 
      nr.lpProvider = null; 

      int result = WNetAddConnection2(nr, password, username, 0); 
      System.IO.File.Copy(from, System.IO.Path.Combine(shareName, System.IO.Path.GetFileName(from))); 
     } 

 

Deberá pegar el siguiente código de soporte en una clase (tomada de pInvoke.Net). Asegúrese de añadir un DECLARACIÓN usando a su código:

using System.Runtime.InteropServices 
 

     [DllImport("Mpr.dll", EntryPoint = "WNetAddConnection2", CallingConvention = CallingConvention.Winapi)] 
     private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, 
             string lpUsername, System.UInt32 dwFlags); 

     [StructLayout(LayoutKind.Sequential)] 
     private class NETRESOURCE 
     { 
      public ResourceScope dwScope = 0; 
      public ResourceType dwType = 0; 
      public ResourceDisplayType dwDisplayType = 0; 
      public ResourceUsage dwUsage = 0; 
      public string lpLocalName = null; 
      public string lpRemoteName = null; 
      public string lpComment = null; 
      public string lpProvider = null; 
     }; 

     public enum ResourceScope 
     { 
      RESOURCE_CONNECTED = 1, 
      RESOURCE_GLOBALNET, 
      RESOURCE_REMEMBERED, 
      RESOURCE_RECENT, 
      RESOURCE_CONTEXT 
     }; 

     public enum ResourceType 
     { 
      RESOURCETYPE_ANY, 
      RESOURCETYPE_DISK, 
      RESOURCETYPE_PRINT, 
      RESOURCETYPE_RESERVED 
     }; 

     public enum ResourceUsage 
     { 
      RESOURCEUSAGE_CONNECTABLE = 0x00000001, 
      RESOURCEUSAGE_CONTAINER = 0x00000002, 
      RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004, 
      RESOURCEUSAGE_SIBLING = 0x00000008, 
      RESOURCEUSAGE_ATTACHED = 0x00000010, 
      RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), 
     }; 

     public enum ResourceDisplayType 
     { 
      RESOURCEDISPLAYTYPE_GENERIC, 
      RESOURCEDISPLAYTYPE_DOMAIN, 
      RESOURCEDISPLAYTYPE_SERVER, 
      RESOURCEDISPLAYTYPE_SHARE, 
      RESOURCEDISPLAYTYPE_FILE, 
      RESOURCEDISPLAYTYPE_GROUP, 
      RESOURCEDISPLAYTYPE_NETWORK, 
      RESOURCEDISPLAYTYPE_ROOT, 
      RESOURCEDISPLAYTYPE_SHAREADMIN, 
      RESOURCEDISPLAYTYPE_DIRECTORY, 
      RESOURCEDISPLAYTYPE_TREE, 
      RESOURCEDISPLAYTYPE_NDSCONTAINER 
     }; 
 
Cuestiones relacionadas