У меня есть следующий код:
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 для продолжения и сортировки. разрешения правильно, или Отменить на reset разрешения.
Щелчок OK в этом месте устраняет проблему. Что здесь происходит? Как система попадает в это состояние и есть ли способ обнаружить/исправить ее программным способом (т.е. Если пользователь не будет вручную использовать Explorer для исправления этого)?
Обновление
Я сделал немного больше исследований ACL, какая каноническая форма и зачем это нужно. Я все еще не уверен, как файл обычно попадает в это состояние, но я обнаружил, что инструмент Icacls может использоваться для создания каталога с неканонический ACL, сохраняя список разрешений, изменяя его, чтобы быть вне порядка, и восстанавливая его. Теперь мне просто нужно исправить это, не требуя взаимодействия с пользователем.