2009-04-15 27 views
3

我在一個經常遇到訪問網絡共享的「問題」的胖客戶端應用程序上工作。在使用服務器執行任何IO之前,我的應用程序會測試共享(通常是\\ server \ share $形式)是否存在。這適用於檢測客戶端與服務器失去連接的情況,但仍存在隱藏共享存在的奇怪場景,但用戶無權從共享內讀取。有人可以共享(不是雙關語意思)測試當前用戶是否可以讀取共享文件所需的C#代碼嗎?我應該查詢共享的ACL還是共享中的文件?如果份額是空的呢?如果用戶是混合環境中的本地非管理員(XP Pro工作站,Novell網絡上沒有域的Windows 2003服務器),該怎麼辦?我的C#應用​​程序如何測試用戶是否具有「讀取」訪問網絡共享的權限?

回答

8

最簡單的方法就是做(例如嘗試讀取文件)。正如賈裏德所說,沒有辦法確保您將來能夠閱讀(網絡故障,更改權限等)。

至於代碼的話,你可以使用DirectoryInfo類對一些企圖答案:

 string remotePath = @"\\server\share$"; 
     bool haveAccess = false; 

     DirectoryInfo di = new DirectoryInfo(remotePath); 
     if (di.Exists) 
     { 
      try 
      { 
       // you could also call GetDirectories or GetFiles 
       // to test them individually 
       // this will throw an exception if you don't have 
       // rights to the directory, though 
       var acl = di.GetAccessControl(); 
       haveAccess = true; 
      } 
      catch (UnauthorizedAccessException uae) 
      { 
       if (uae.Message.Contains("read-only")) 
       { 
        // seems like it is just read-only 
        haveAccess = true; 
       } 
       // no access, sorry 
       // do something else... 
      } 
     } 

有在上面的代碼中的許多不足之處(如硬編碼的「只讀」測試),但它只是一個用來說明你能做什麼的例子。 DirectoryInfo還有一些其他幫助程序方法,可用來列出文件夾中的文件。如果您沒有訪問權限,這些方法將拋出一個UnauthorizedAccessException異常,您可以使用該異常來測試訪問失敗的原因。查看關於GetAccessControl的更多信息,瞭解它所拋出的異常情況。

3

#1最可靠的方法,以確定是否以前有權限從共享閱讀是

  1. 嘗試和讀取共享
  2. 在閱讀可能發生的處理錯誤和認爲這是一個失敗的嘗試

但不幸的是根據您的描述您要確定您是否將有讀取權限分享。沒有辦法可靠地確定這一點。

無論有多少ACL,目錄等等,當你看完它們的時候,你可能會失去通過許多機制訪問共享的機會。最明顯的一個是網絡共享下降。所有你可以確定的是,你曾經有權限的份額。

+0

我明白,只是閱讀並等待錯誤更準確,但對用戶來說不會很煩人嗎?提前閱讀一個ACL可能會節省一些挫折。你能指點我一些示例代碼嗎? – flipdoubt 2009-04-15 19:15:37

+0

@ flipdoubt但ACL的讀取可能會掛起。兩者都需要閱讀份額。你應該總是設計一個FS操作(特別是遠程),假設它會掛起。通常後臺線程是你最好的朋友。你想要什麼類型的示例代碼? – JaredPar 2009-04-15 19:18:35

相關問題