2009-09-17 119 views
8

我在不在域上的計算機上運行的Windows窗體應用程序需要能夠將文件從本地文件系統移動到UNC路徑。我有該路徑的用戶名和密碼。我想知道是否有任何方法可以直接執行此操作,而不執行net.exe命令?如何以編程方式訪問文件共享

理想情況下,我不必映射驅動器。

回答

4

在這個問題上接受的答案here似乎是值得一看的;它建議使用Win32 API函數WNetUseConnection

從MSDN:

WNetUseConnection功能使得 連接到網絡資源。功能 可以將本地設備 重定向到網絡資源。

這看起來完成了你在找什麼,沒有提到net.exe。這有幫助嗎?

+0

謝謝你的提示,我會看看到它。我不得不想知道爲什麼在.NET中沒有類似的東西。 – Mykroft 2009-09-17 21:35:43

1

我想你需要映射驅動器。我還沒有找到解決辦法。但是,看到這個帖子:

Asp.net Access To Network Share

別人的答案被接受,但我有代碼,另一個答案張貼簡化網絡驅動器。

0

看看this的帖子。它使用P/Invoke來調用Win32 API LogonUser()和朋友。還提供了一些示例代碼。

11

您可以使用WNetAddConnection來完成此操作。你將不得不pInvoke。下面的代碼在我設置pInvoke聲明後爲我工作。第二個代碼塊(下面)包含pInvoke聲明 - 只需將其粘貼到類中即可。

 

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

 

您需要將以下支持代碼粘貼到類中(取自pInvoke.Net)。確保一個使用statment添加到您的代碼:

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 
     }; 
 
相關問題