我想在现有规则旁边添加一些新的 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);
在保留现有规则的同时,我应该如何处理添加新规则?而且,文档是否不正确,我是否误解了它,还是我的代码不正确?