2012-09-10 97 views
5

我試圖在特定用戶的UNC路徑上授予NTFS權限,但根據UNC路徑看到了不同的行爲。下面是代碼(從MSDN),我現在用的授予權限,結果在每個場景中,授予NTFS權限時丟失了繼承權限

static void GiveNTFSPermissions(string folderPath, 
           string ntAccountName, 
           FileSystemRights accessRights) 
{ 
    DirectorySecurity dirSecurity = Directory.GetAccessControl(folderPath); 

    FileSystemAccessRule newAccessRule = 
     new FileSystemAccessRule(
       ntAccountName, 
       accessRights, 
       AccessControlType.Allow); 

    dirSecurity.AddAccessRule(newAccessRule); 

    Directory.SetAccessControl(folderPath, dirSecurity); 
} 

假設我有一個名爲「RootShare」我的本地機器上的份額,而另一個文件夾「InsideRootShare「裏面。

Scenario1: 當我打電話,

GiveNTFSPermissions(@"\\sri-devpc\RootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

繼承的權限丟失的共享路徑上,

Scenario2: 當我打電話,

GiveNTFSPermissions(@"\\sri-devpc\RootShare\InsideRootShare", 
        @"domain\username", 
        FileSystemRights.Write); 

繼承權限完好無損。

我嘗試過不同的構造函數FileSystemAccessRule,但沒有運氣。

這種行爲背後的原因是什麼,以及對此的任何解決方法?

+0

您是否嘗試過使用'InheritanceFlags'作爲參數的[構造函數](http://msdn.microsoft.com/zh-cn/library/system.security.accesscontrol.filesystemaccessrule.aspx)?另外,'AddNTFSPermission'比'GiveNTFSPermissions'更合理,因爲它試圖將新的訪問規則添加到現有的訪問規則中。 – Nawaz

+0

看到這個主題:http://stackoverflow.com/questions/243995/setting-folder-permissions-on-vista – Nawaz

+0

@Nawaz:我試過所有的構造函數,並且我得到了相同的結果。感謝您的建議:) – sri

回答

4

在Dropkick的安全模塊上工作時,我們遇到了類似的問題,使用文件系統權限。我們提出的解決方案如下。這將成功設置任何文件夾的權限而不更改文件夾上的繼承規則。

public void SetFileSystemRights(string target, string group, FileSystemRights permission) 
    { 
     if (!IsDirectory(target) && !IsFile(target)) 
      return; 

     var oldSecurity = Directory.GetAccessControl(target); 
     var newSecurity = new DirectorySecurity(); 

     newSecurity.SetSecurityDescriptorBinaryForm(oldSecurity.GetSecurityDescriptorBinaryForm()); 

     var accessRule = new FileSystemAccessRule(group, 
                permission, 
                InheritanceFlags.None, 
                PropagationFlags.NoPropagateInherit, 
                AccessControlType.Allow); 
     bool result; 
     newSecurity.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

     if (!result) Log.AddError("Something wrong happened"); 

     accessRule = new FileSystemAccessRule(group, 
               permission, 
               InheritanceFlags.ContainerInherit | 
               InheritanceFlags.ObjectInherit, 
               PropagationFlags.InheritOnly, 
               AccessControlType.Allow); 

     result = false; 
     newSecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out result); 
     if (!result) Log.AddError("Something wrong happened"); 

     Directory.SetAccessControl(target, newSecurity); 

     if (result) Log.AddGood("Permissions set for '{0}' on folder '{1}'", group, target); 

     if (!result) Log.AddError("Something wrong happened"); 
    } 

Found the link that I originally used to figure this out