Я пытаюсь добавить правило доступа к RegistryKey
примерно так:
using ( RegistryKey registry = OpenOrCreateMyKey() )
{
RegistrySecurity security = registry.GetAccessControl();
security.AddAccessRule( new RegistryAccessRule(
new SecurityIdentifier( WellKnownSidType.BuiltinUsersSid, null ),
RegistryRights.WriteKey,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow ) );
registry.SetAccessControl( security );
}
Однако, если реестр искажен, AddAccessRule
выдает исключение (Reflector показывает, что вызов GetAccessControl
определяет, что они не являются каноническими заранее, и вы отключаете систему безопасности, когда вы пытаетесь выполнить запись, когда RegistrySecurity
экземпляр находится в этом состоянии):
System.InvalidOperationException: This access control list is not in canonical form and therefore cannot be modified.
Запуск regedt32 (и, вероятно, regedit) затем показывает всплывающее окно, говорящее the permissions on <key> are incorrectly ordered, which may cause some entries to be ineffective <paraphrasing>Do you want to unmangle them now? Y/N</paraprasing>
Самая авторитетная статья, которую я видел по этому вопросу, - http://www.codeproject.com/KB/system/accessctrl3.aspx,, в которой говорится:
Однако флаги управления реализованы как свойства (поговорим о несоответствии!). Вы можете получить настройки автоматического наследования из AreAccessRulesProtected
/ AreAuditRulesProtected
(напомним, если ACL защищен, он не наследуется автоматически). Если вы прочтете часть 2, вы узнаете, что некоторые из API-интерфейсов Windows не поддерживают наследование, поэтому могут повредить параметры наследования вашего компьютера. Хорошая новость заключается в том, что .NET полностью поддерживает механизм наследования и правильно сохраняет параметры наследования. Если вы открыли дескриптор безопасности, который каким-то образом получил неупорядоченный ACL (возможно, из какого-то мошеннического приложения Win32), InvalidOperationException будет выдано, если вы попытаетесь отредактировать его.
Как правило, такие неканонические ACL-списки являются результатом использования [с момента выхода на пенсию] инструмента NewSID , и люди пишут статьи в КБ, чтобы сказать: "Ну, тогда прекратите делать это" .
Но, что важно, это не всегда причина, и иногда код просто должен работать. Какой хороший чистый безопасный способ справиться с этим?
Я дам два ответа, и люди могут голосовать и выбирать дыры, голосовать, комментировать и придираться.