Доступ к RegistrySecurity запрещен.C # - PullRequest
6 голосов
/ 23 июня 2011

У меня сейчас проблема при написании приложения для установки разрешений для некоторых ключей Legacy. Устаревшие ключи довольно заблокированы, и для того, чтобы действительно изменить их в regedit, вы должны стать владельцем, а затем добавить себя с полным контролем. При попытке повторить это в коде я не могу получить ключ для записи с ошибкой «Доступ запрещен». Пример кода:

RegistrySecurity rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule("Administrators", RegistryRights.FullControl, AccessControlType.Allow));
rs.SetOwner(new NTAccount("Administrators"));
return LocalMachine.CreateSubKey(post, RegistryKeyPermissionCheck.ReadWriteSubTree, rs);

Любые идеи будут с благодарностью. Я также пробовал OpenSubKey с запрошенным доступом для записи, и я просто не могу получить ключ.

Спасибо, ребята.

Ответы [ 5 ]

7 голосов
/ 27 июня 2011

Я наконец нашел решение.Вы должны были открыть ключ с помощью «ChangePermissions», а затем изменить разрешение для себя ... Затем повторно открыть ключ с полным контролем, чтобы сменить владельца.Вот как.

RegistryKey rk = LocalMachine.OpenSubKey(subkey, RegistryKeyPremissionsCheck.ReadWriteSubTree, RegistryRights.ChangePermissions | RegistryRights.ReadKey);//Get the registry key desired with ChangePermissions Rights.
RegistrySecurity rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule("Administrator", RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));//Create access rule giving full control to the Administrator user.
rk.SetAccessControl(rs); //Apply the new access rule to this Registry Key.
rk = LocalMachine.OpenSubKey(subkey, RegistryKeyPremissionsCheck.ReadWriteSubTree, RegistryRights.FullControl); // Opens the key again with full control.
rs.SetOwner(new NTAccount("Administrator"));// Set the securitys owner to be Administrator
rk.SetAccessControl(rs);// Set the key with the changed permission so Administrator is now owner.

Это работает для меня.Дайте мне знать, если это работает для вас:)

Очевидно, смените Администратора на другого пользователя, если вы не вошли в систему как администратор или если вам нужны права для другого пользователя.

0 голосов
/ 04 февраля 2016
        RegistryKey rkey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Norton\SecurityStatusSDK", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions);
        if (rkey == null)
            throw new Exception("Not Open");
        //-------
        RegistrySecurity _registrySecurity = new RegistrySecurity();//Or rkey.GetAccessControl();
        WindowsIdentity _windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
        RegistryAccessRule _accessRule = new RegistryAccessRule(_windowsIdentity.Name, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
        _registrySecurity.AddAccessRule(_accessRule);
        _registrySecurity.SetAccessRuleProtection(false, true);
        try
        {
            rkey.SetAccessControl(_registrySecurity);// <---"Attempted to perform an unauthorized operation."
        }
        catch (UnauthorizedAccessException e)
        {

        }

        //--------Now, Set owner

        _registrySecurity.SetGroup(new NTAccount("Administrators"));  //This is optional
        var SID = new System.Security.Principal.NTAccount("XXX\\Users");
        _registrySecurity.SetOwner(SID);
        rkey.SetAccessControl(_registrySecurity);

Я установил Norton Internet Security

0 голосов
/ 31 октября 2015

Microsoft Visual Studio 2015 (администратор)

_subKey = SOFTWARE\Wow6432Node\Norton

rkey.SetAccessControl(_registrySecurity);-> "Попытка выполнить несанкционированную операцию." `

0 голосов
/ 01 февраля 2015
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.Win32;

Сначала необходимо установить разрешение с правом FULL-ACCESS на подраздел

RegistryKey rkey = LocalMachine.OpenSubKey(_subKey, RegistryKeyPermissionCheck.ReadWriteSubTree, gistryRights.ChangePermissions);
if (rkey == null)
 throw new Exception("Not Open");
//-------
RegistrySecurity _registrySecurity =new RegistrySecurity();//Or rkey.GetAccessControl();
WindowsIdentity _windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
RegistryAccessRule _accessRule = new RegistryAccessRule(_windowsIdentity.Name, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
_registrySecurity.AddAccessRule(_accessRule);
_registrySecurity.SetAccessRuleProtection(false, true);
 rkey.SetAccessControl(_registrySecurity);

//--------Now, Set owner

_registrySecurity.SetGroup(new NTAccount("Administrators"));  //This is optional
var SID = new System.Security.Principal.NTAccount("XXX\\Users");
_registrySecurity.SetOwner(SID);
rkey.SetAccessControl(_registrySecurity);

XXX: имя вашей учетной записи

0 голосов
/ 26 июня 2011

Когда вы запускаете свое приложение с этим кодом, вы щелкаете правой кнопкой мыши по exe и выбираете «Запуск от имени администратора»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...