2009-09-17 25 views
8

Ho un'app di Windows Form in esecuzione su una macchina che non si trova su un dominio, che deve essere in grado di spostare un file dal file system locale in un percorso UNC. Ho un nome utente e una password per quel percorso. Mi chiedevo c'è un modo per farlo direttamente senza eseguire il comando net.exe?Come accedere a una condivisione file a livello di codice

Idealmente non avrei dovuto mappare un'unità.

risposta

4

La risposta accettata su questa domanda here sembra che varrebbe la pena di essere esaminata; suggerisce di utilizzare la funzione API Win32 WNetUseConnection.

Da MSDN:

La funzione WNetUseConnection rende una connessione a una risorsa di rete. La funzione può reindirizzare un dispositivo locale a una risorsa di rete.

Che sembra realizzare ciò che stai cercando, senza menzionare net.exe. questo aiuta?

+0

Grazie per il suggerimento mi prendo uno sguardo in esso. Devo chiedermi perché non ci sia qualcosa di simile già in .NET però. – Mykroft

1

I THINK è necessario mappare un'unità. Non ho ancora capito. Tuttavia, vedi questo post: risposta

Asp.net Access To Network Share

Qualcun altro è stato accettato, ma ho il codice scritto in un'altra risposta per la semplificazione un'unità di rete.

0

Dai un'occhiata al post this. Usa P/Invoke per chiamare Win32 API LogonUser() e gli amici. C'è anche qualche codice di esempio fornito.

11

È possibile utilizzare WNetAddConnection per eseguire questa operazione. Dovrai pInvoke. il codice seguente ha funzionato per me dopo aver impostato le dichiarazioni pInvoke. Il secondo blocco di codice (sotto) contiene le dichiarazioni di pInvoke: è sufficiente inserirlo all'interno di una classe.

 

     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))); 
     } 

 

È necessario incollare il seguente codice di supporto in una classe (preso da pInvoke.Net). Assicurarsi di aggiungere un utilizzando statment al codice:

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 
     }; 
 
Problemi correlati