2

我想在现有规则旁边添加一些新的 ACL 规则。我目前正在使用SetAccessRule,希望添加新规则也会保留旧规则。根据文档SetAccessRule

SetAccessRule 方法添加指定的访问控制列表 (ACL) 规则或覆盖与规则参数的 FileSystemRights 值匹配的任何相同 ACL 规则。例如,如果 rule 参数指定了 Read 值,并且 SetAccessRule 方法找到了一个相同的 ACL 规则,该规则指定了 Read 值,则相同的规则将被覆盖。如果 SetAccessRule 方法找到了一个相同的 ACL 规则,该规则指定了 Write 值,则不会覆盖相同的规则。

但是,在实践中,我发现添加新规则实际上会覆盖任何以前的规则(属于同一用户/SID?)。这似乎与文档所说的相矛盾。

我目前的意图是分配读取和写入权限,但在单独的调用中。不幸的是,后一个权限会覆盖第一个权限。在下面的示例代码中,结果是仅分配了读取权限。如果我注释掉该块,则只分配写权限。if这可以通过分配两个权限的附加条件来解决,但它仍然会覆盖目录上的任何现有权限,这是不希望的。

DirectoryInfo directory = new DirectoryInfo(abspath);
DirectorySecurity security = directory.GetAccessControl();
security.SetAccessRuleProtection(false, true);

if (perm.Contains("write"))
{
    security.SetAccessRule(new FileSystemAccessRule(user, FileSystemRights.Write, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
}

if (perm.Contains("read"))
{
    security.SetAccessRule(new FileSystemAccessRule(user, FileSystemRights.ReadAndExecute | FileSystemRights.Traverse, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
}

directory.SetAccessControl(security);

在保留现有规则的同时,我应该如何处理添加新规则?而且,文档是否不正确,我是否误解了它,还是我的代码不正确?

4

1 回答 1

2

尝试使用DirectorySecurity.AddAccessRule方法而不是附加/添加权限或替换,请参阅此MSDN 链接了解更多信息

security.AddAccessRule(new FileSystemAccessRule(user, FileSystemRights.Write, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
于 2013-06-11T03:40:35.943 回答