2013-03-27 156 views
4

在我的應用程序中,我需要檢查是否有權寫入文件夾。我用下面的方法:如何檢查應用程序是否有權訪問目錄?

public bool IsAvailable(string path) 
     { 
      bool hasPermissions = false; 

      if (Directory.Exists(path)) 
      { 
       var permission = new FileIOPermission(FileIOPermissionAccess.Write, path); 
       try 
       { 
        permission.Demand(); 
        hasPermissions = true; 
       } 
       catch(SecurityException e) 
       { 
        hasPermissions = false; 
       } 
      } 

      return hasPermissions; 
     } 

當我把它送給我知道某些文件夾的路徑沒有人訪問它(我已經刪除了的文件夾的安全選項卡所有用戶的所有權限屬性),它不會拋出任何異常。它只是沿着try塊繼續。

任何想法爲什麼或如何做到這一點檢查更好?

我發現在其他問題上的AppDomain.PermissionSet屬性相關答案沒有成功。

預先感謝您。

+0

代碼訪問安全構建你使用是在.NET運行時的級別實施的,並且是更高級別的,並且完全獨立於操作系統訪問控制所使用的安全描述符。也就是說,phresnel的答案是正確的 - 任何檢查你執行的操作都會隨着你嘗試一些I/O而過時,所以更好的方法就是嘗試I/O並且爲因權限問題導致失敗做好準備。 – shambulator 2013-03-27 10:12:38

回答

2

我用下面的方法來完成它:

public static bool HasWritePermissionOnDir(string path) 
    { 
     var writeAllow = false; 
     var writeDeny = false; 
     var accessControlList = Directory.GetAccessControl(path); 
     if (accessControlList == null) 
      return false; 
     var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)); 
     if (accessRules == null) 
      return false; 

     foreach (FileSystemAccessRule rule in accessRules) 
     { 
      if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) continue; 

      if (rule.AccessControlType == AccessControlType.Allow) 
       writeAllow = true; 
      else if (rule.AccessControlType == AccessControlType.Deny) 
       writeDeny = true; 
     } 

     return writeAllow && !writeDeny; 
    } 

請讓我知道,如果它幫助你,如果是將其標記過

+0

這工作...現在瞭解代碼...我知道競爭條件可能發生,但這是有助於的代碼。謝謝。 – 2013-03-27 10:29:47

+0

我歡迎@羅伯特拉加爾 – 2013-03-28 05:30:38

+0

你好,你能告訴我如何做以上代碼的路徑列表我的意思是在參數路徑列表,而不是隻有一個路徑。 – Neel 2014-04-09 05:18:43

1

此方法(詢問是否可訪問,然後執行某些操作)容易出現競爭狀況。在您的支票和實際訪問該目錄中的內容之間,權限可能會改變。

更好的是嘗試讀取/寫入該目錄中的內容,並捕獲潛在的異常。

所以不要

if(IsAvailable(path)) { 
    try { 
     doSomething(); 
    } catch (...) { 
    } 
} 

而是

try { 
    doSomething(); 
} catch (...) { 
} 

格雷斯料斗報價:

「它總是更容易請求原諒比它要得到許可。「

+0

或者我可以嘗試寫入臨時文件到該文件夾​​,如果失敗,返回false,否則返回true並刪除臨時文件... – 2013-03-27 10:15:01

+0

但這並不能解決比賽。確實是 – 2013-03-27 10:16:48

+0

。我可能需要重新考慮這個系統...... – 2013-03-27 10:19:33

0
var permissionSet = new PermissionSet(PermissionState.None);  
var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename); 
permissionSet.AddPermission(writePermission); 

if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet)) 
{} 
+0

當我預計它會返回false時,'if'語句也返回true ... – 2013-03-27 10:12:33

+0

也許你可以讓它成爲在你的答案中提供解釋的習慣。這也將使你獲得更多的讚揚;) – 2013-03-27 11:09:41

相關問題