2009-09-17 25 views
8

Mam aplikację formularzy systemu Windows działającą na komputerze, który nie znajduje się w domenie, która musi mieć możliwość przeniesienia pliku z lokalnego systemu plików do ścieżki UNC. Mam nazwę użytkownika i hasło dla tej ścieżki. Zastanawiam się, czy istnieje sposób, aby zrobić to bezpośrednio bez wykonywania polecenia net.exe?Jak programowo uzyskać dostęp do udziału pliku

Idealnie nie musiałbym mapować dysku.

Odpowiedz

4

Przyjęta odpowiedź na to pytanie here wydaje się, że warto byłoby się przyjrzeć; sugeruje użycie funkcji Win32 API WNetUseConnection.

Od MSDN:

WNetUseConnection funkcja sprawia połączenia do zasobu sieciowego. Funkcja może przekierować urządzenie lokalne do zasobu sieciowego.

Który wydaje się osiągnąć to, czego szukasz, bez wzmianki o net.exe. czy to pomaga?

+0

Dzięki za cynk wezmę na nią patrzeć. Zastanawiam się, dlaczego nie ma czegoś podobnego już w .NET. – Mykroft

1

MYŚLI, że będziesz musiał zmapować dysk. Nie udało mi się jeszcze tego obejść. Jednak zobaczyć ten post:

Asp.net Access To Network Share

Ktoś innego odpowiedź została zaakceptowana, ale mam kod pisał w innym odpowiedź na uproszczenie dysk sieciowy.

0

Spójrz na numer this. Używa P/Invoke do wywoływania Win32 API LogonUser() i znajomych. Podano także przykładowy kod.

11

Do tego celu można użyć narzędzia WNetAddConnection. Będziesz musiał zadzwonić. poniższy kod pracował dla mnie po przygotowaniu deklaracji pInvoke. Drugi blok kodu (poniżej) zawiera deklaracje pInvoke - po prostu włóż je do klasy.

 

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

 

Będziesz musiał wkleić następujący kod pomocniczy do klasy (pobranej z pInvoke.Net). Upewnij się, aby dodać korzystając statment do kodu:

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 
     }; 
 
Powiązane problemy