2012-09-10 61 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