给NTFS权限时继承的权限丢失了。

6

我试图为特定用户在UNC路径上提供NTFS权限,但我发现UNC路径不同会导致不同的行为。以下是我用于授予权限的代码(来自MSDN),以及每种情况下的结果:

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”的文件夹。 场景1: 当我调用以下命令时,
GiveNTFSPermissions(@"\\sri-devpc\RootShare",
                    @"domain\username",
                    FileSystemRights.Write);

继承权限在共享路径上丢失,

场景2:当我调用时,

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

继承权限保持完好无损。

我尝试了不同的FileSystemAccessRule构造函数,但没有运气。

这种行为背后的原因是什么,有没有解决方法?


你尝试过使用以"InheritanceFlags"为参数的构造函数吗?此外,"AddNTFSPermission"比"GiveNTFSPermissions"更合理,因为它试图向现有的访问规则添加一个新的访问规则。 - Nawaz
请参考此话题:http://stackoverflow.com/questions/243995/setting-folder-permissions-on-vista - Nawaz
@Nawaz:我已经尝试了所有的构造函数,但结果都一样。感谢您的建议 :) - sri
你使用了哪些标志组合?在 SetAccessControl 之前和之后,你能看到访问规则吗?请检查它们是否只相差一个规则(即被添加的规则)。 - Nawaz
@Nawaz:我已经尝试了InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,PropagationFlags.None。并且我已经检查了scenario2,它只有一个不同。在scenario1中,我只能看到添加的那个,其他所有内容都丢失了。如果您想在自己的机器上尝试,请直接执行以上代码。 - sri
1个回答

5

在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");
    }

我找到了原始链接,以解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接