У меня есть следующий код:
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, что такое каноническая форма и , почему это необходимо . Я до сих пор не уверен, как файл обычно попадет в это состояние, но я обнаружил, что инструмент Icacls можно использовать для создания каталога с неканоническим списком ACL, сохранив список разрешений и изменив его. выйти из строя и восстановить его. Теперь мне просто нужен способ исправить это, не требуя вмешательства пользователя.