2010-09-13 152 views
18

如何提供證書以便我可以連接到.NET中的網絡驅動器?使用用戶名和密碼連接到網絡驅動器

我試圖從網絡驅動器檢索文件,並需要提供用戶憑據來訪問驅動器。

+0

我相信這是一個更普遍的方式:http://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when-connecting- to-a-network-share/39540451#39540451 – 2016-09-16 21:42:01

+0

請查看此解決方案http://stackoverflow.com/questions/295538/how-to-provide-user-name-and-password-when-connecting-to-a -network-share/39540451#39540451 – 2017-01-04 19:57:48

回答

0

您可以使用system.diagnostocs.process調用'net use .... with userid and password'或命令外殼。

+0

你可以,但你想嗎? – 2010-09-13 13:39:07

+0

爲什麼不能達到你的用例的目標,那麼它是完全有效的。它的一行代碼實現了預期的結果。它內置了所有的錯誤處理,並且經過測試。似乎愚蠢地重寫功能。 – 2010-09-13 13:41:56

+1

「如果它實現了你的用例的目的,那麼它是完全有效的」 - 這是一個非常廣泛的陳述,你的答案在我看來是一個反例。啓動一個新的流程來完成一個可以在單個P/Invoke中完成的事情(不需要重寫)就是使用大錘來破解一個螺母。 – 2010-09-13 14:01:59

12

執行此操作的最佳方法是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

我仍然想知道爲什麼c#根本沒有這個方法.. – 2016-06-30 15:03:42

5

您可以使用WindowsIdentity類(與logon token)在讀取和寫入文件時模擬。

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

只適用於Windows環境。當你開始使用AS400,Solaris和Linux時,會變得很麻煩,特別是如果共享需要的憑證不是你正在運行應用程序的憑證。 – Riaan 2010-09-13 13:45:14

+0

bzlm的解決方案有效,但他並沒有真正充實它。得到https://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx一些代碼,即safeTokenHandle類和依賴。 – 2018-01-08 16:00:34

6

非常優雅的解決方案靈感來自http://social.msdn.microsoft.com/Forums/vstudio/en-US/287ca606-86da-4794-baed-2ad5db9bc833/access-to-remote-folder。這個只使用.Net庫,不需要使用任何命令行或Win32 API。

代碼隨時參考:

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

是否爲你工作?我遇到了未經授權的異常 – VladL 2014-03-17 11:49:45

+0

@VladL您可以使用Windows資源管理器手動訪問網絡共享嗎?你對用戶有必要的權限嗎? – zendu 2014-03-20 08:36:36

+0

當然我:) – VladL 2014-03-20 08:37:37

-2

您可以使用WebClient類連接到使用證書的網絡驅動程序。包括下面的命名空間:

using System.Net; 

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

Directory.GetDirectories與WebClient無關 - 它們恰好是您示例中相鄰的代碼行 – alastairtree 2017-11-14 15:55:55

相關問題