2009-09-17 61 views
1

所以我試圖修改BUILTIN \ Users組的權限,至少有修改文件系統訪問權限。不幸的是,我嘗試使用下面的代碼生成未更改的ACL。無法修改CommonAppDataPath目錄中的C#中的ACL權限

  SecurityIdentifier usersSecurityIdentifier = ntAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier; 
      DirectorySecurity directorySecurity = Directory.GetAccessControl(source.FullName); 
      FileSystemAccessRule accessRule 
       = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow); 

      directorySecurity.ModifyAccessRule(AccessControlModification.Add, 
       accessRule, 
       out modified); 

      Console.WriteLine(modified); 

修改後的報告在所有情況下均爲true,但在您查看文件夾屬性時不會更新這些修訂。

我也嘗試添加訪問規則對於沒有尚未使用類似的代碼目錄中的ACL只是AddAccessRule,而不是修改的SecurityIdentifier。即使新的SecurityIdentifier顯示在目錄的perms列表中,但它們沒有我指定的訪問權限。

我試圖修改在Environment.SpecialFolders.CommonApplicationData專有目錄管理員帳戶的所有者訪問。我也在嘗試以管理員身份修改ACL。

沒有人有任何的想法有什麼錯瓦特/上面的代碼或有可能導致我使用本地原生.NET類設置ACL的正確方法的任何資源?

+0

我有一位朋友在另一臺Vista機器上確認了這種行爲。它似乎與我正在修改CommonAppData路徑中的數據有關。 – 2009-09-18 03:55:15

+0

所以我發現這個相關的線程,並認爲我會發布[這裏] [1]。要點是,目錄權限應該在創建目錄時由管理帳戶執行的安裝期間設置。我認爲這可以通過自定義操作和安裝程序類來完成。當我編寫代碼並確認這其實是真的時,我會在這裏發佈我的解決方案。 [1]:http://www.vistax64.com/vista-security/165672-how-programmatically-modify-users-full-control。html – 2009-09-18 04:07:07

回答

3

我在一位在微軟工作的朋友的幫助下解決了這個問題。實際上我用來設置ACL的過程是準確的。我錯誤地解釋了結果。基本上,只要您嘗試進行更改時以管理員身份運行ACL,就可以用這種方式在目錄上設置ACL。

該文件夾的準確權限是可用的視圖(在Vista)由:

  1. 右鍵單擊有問題的文件夾,選擇屬性
  2. 選擇安全選項卡
  3. 單擊高級
  4. 點擊編輯
  5. 選擇您希望查看其權限的實體,然後單擊編輯。

這是我缺少的部分。 CommonApplicationData路徑已經爲BUILTIN \ Users實體設置了權限。所以在我運行我的代碼之後,我實際上最終得到了兩個實體。一個說讀取&執行,另一個說特殊權限。當我用特殊權限編輯實體時,我實際上看到BUILTIN \ Users確實可以訪問該目錄。

我真的找BUILTIN \用戶有該目錄訪問和它的所有子文件夾和對象。這是我最終使用的代碼片段。我能夠通過測試工具確認我的代碼,並手動檢查文件和目錄ACL列表。

DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 
FileSystemAccessRule accessRule 
    = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, 
     InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
     PropagationFlags.None, 
     AccessControlType.Allow); 

bool modified=false; 
directorySecurity.ModifyAccessRule(AccessControlModification.Add, 
    accessRule, 
    out modified); 

if (modified) 
{ 
    source.Create(directorySecurity); 
} 
else 
{ 
    source.Create(); 
} 
+0

感謝您發佈此信息。代碼片段中的_source_實例是什麼?這是否需要?另外,我是否正確理解此代碼是爲了讓用戶完全控制所有CommonApplicationData路徑,包括其他應用程序的常見數據? – 2009-11-19 08:21:32

+0

它是一個DirectoryInfo對象。代碼的原因是爲了確保用戶可以讀/寫/刪除對CommonApplicationData路徑的訪問。我發現如果管理員創建了路徑並且是目錄的所有者,那麼用戶無法刪除路徑,所以我基本上編寫了這些代碼,以確保所有用戶都可以訪問該目錄並且可以刪除它。 – 2009-11-19 17:21:26