【发布时间】:2011-11-14 19:16:23
【问题描述】:
我有以下代码:
DirectoryInfo directory = new DirectoryInfo(@"C:\Program Files\Company\Product");
if (!directory.Exists) { directory.Create(); }
DirectorySecurity directorySecurity = directory.GetAccessControl();
SecurityIdentifier securityIdentifier = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
directorySecurity.AddAccessRule(
new FileSystemAccessRule(
securityIdentifier,
FileSystemRights.Write,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow));
directory.SetAccessControl(directorySecurity);
对 AddAccessRule 的调用会引发 InvalidOperationException,并带有以下堆栈跟踪:
System.InvalidOperationException: This access control list is not in canonical form and therefore cannot be modified.
at System.Security.AccessControl.CommonAcl.ThrowIfNotCanonical()
at System.Security.AccessControl.CommonAcl.AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, Int32 accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)
at System.Security.AccessControl.DiscretionaryAcl.AddAccess(AccessControlType accessType, SecurityIdentifier sid, Int32 accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)
at System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean& modified)
at System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(AccessRule rule)
at System.Security.AccessControl.FileSystemSecurity.AddAccessRule(FileSystemAccessRule rule)
这只发生在某些系统上(我见过 Windows XP 和 Windows 7)。在发生错误的情况下,使用 Windows 资源管理器查看目录的安全权限通常会导致显示一个消息框,其中包含以下文本:
权限排序不正确,可能 导致某些条目无效。按 OK 继续并排序 正确设置权限,或取消以重置权限。
此时单击“确定”即可解决问题。这里发生了什么?系统是如何进入这种状态的,有没有办法以编程方式检测/修复它(即无需用户手动使用资源管理器来修复它)?
更新
我对 ACL、什么是规范形式以及 why it's necessary 做了更多研究。我仍然不确定文件通常如何进入此状态,但我发现Icacls 工具可用于通过保存权限列表来创建具有非规范 ACL 的目录,将其更改为 out-秩序,并恢复它。现在我只需要一种不需要用户交互的方法来修复它。
【问题讨论】:
-
当您开始寻找 Raymond Chen 的参考资料时,您就知道自己遇到了麻烦。