C# и Windows 10 меняют правила доступа к реестру для ключа в HKLM

Может ли кто-нибудь мне помочь - я разработал консольное приложение, которое используется для создания моих собственных ключей реестра в HKLM, а затем изменяет право доступа к этому ключу, чтобы позволить каждой учетной записи NT пользователя иметь возможность чтения / записи в этот ключ.

В app.manifest у меня есть это утверждение, чтобы заставить администратора иметь право на его запуск:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

В 64-разрядной версии Windows 7 все работает нормально, в 64-разрядной версии Windows 10 обнаружена проблема - приложение создает разделы реестра, как и ожидалось, но при попытке изменить свои правила доступа происходит сбой.

Мой код для изменения правил доступа к ключу:

private static bool SetFullAccessForKey(string regKey)
{
    try
    {
        SecurityIdentifier sid = new     SecurityIdentifier(WellKnownSidType.WorldSid, null);
        NTAccount account = sid.Translate(typeof(NTAccount)) as NTAccount;

        using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(regKey, RegistryKeyPermissionCheck.ReadWriteSubTree))
        {
            RegistrySecurity rs = rk.GetAccessControl();

            RegistryAccessRule rar = new RegistryAccessRule(
               account.ToString(),
               RegistryRights.FullControl,
               InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
               PropagationFlags.None,
               AccessControlType.Allow);

            rs.AddAccessRule(rar);
            rk.SetAccessControl(rs);
        }
            return true;
        }
        catch
        {
            return false;
        }
}

Может кто-нибудь, пожалуйста, помогите мне здесь, что здесь может быть не так? Как я уже говорил, на Windows 7 64 все работает как положено.

Спасибо за помощь!

Отредактировано 04-01-2017: некоторые подробности об исключении, которое я получаю при выполнении SetFullAccessForKey(...):

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.RegistrySecurity.AddAccessRule(RegistryAccessRule rule)
at regconfigtest.RegistryTools.SetFullAccessForKey(String regKey)

Спасибо за любую помощь с этим!

1 ответ

Решение

Я могу подтвердить, что решение, представленное здесь:

Как вы программно исправляете неканонический ACL?

исправил мою проблему! Теперь он отлично работает на всех: Win7, Win8 и Win10.

Другие вопросы по тегам