Доступ к RegistrySecurity запрещен. С#
в настоящее время у меня проблема при написании приложения для установки разрешений на некоторые устаревшие ключи. Устаревшие ключи довольно заблокированы и фактически изменить их в 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 ответов
Я, наконец, нашел решение. Вы должны были открыть ключ с помощью "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.
это работает для меня. Дайте мне знать, если это работает для вас :)
очевидно, измените администратора на другого пользователя, если вы не вошли в систему как администратор или если вам нужны права для другого пользователя.
когда вы запускаете приложение с этим кодом, вы щелкаете правой кнопкой мыши exe и выбираете "Запуск от имени администратора"?
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.Win32;
сначала необходимо установить разрешение с правом полного доступа к подразделу
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: имя вашего аккаунта
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
Microsoft Visual Studio 2015 (Администратор)
_subKey = SOFTWARE\Wow6432Node\Norton
rkey.SetAccessControl(_registrySecurity);->
"попытка выполнить несанкционированную операцию."`