C# Registry SetValue вызывает исключение UnauthorizedAccessException
прежде чем пытаться ответить на этот вопрос, "выполните быстрый поиск в Google.- Я хотел бы отметить, что уже сделал это. Вот ситуация, у меня есть следующий метод, который пытается изменить значение раздела реестра. Проблема, которую я получаю, заключается в том, что при выполнении он выдает UnauthorizedAccessException даже если я открыл ключ как записываемый. Я запускаю Visual Studio как администратор и даже пытался сделать небольшой .exe с файлом манифеста, заставляющим его работать как администратор это не поможет выполнить код. Ключ уже существует, он не пытается войти в метод CreateKey. Вот блок кода.
Path = "S-1-5-21-1644491937-1078145449-682003330-5490SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem"
Key = "DisableTaskMgr"
NewValue = 1
public OperationResult ModifyKey()
{
OperationResult result = new OperationResult();
if (!Path.IsNullOrEmptyTrim())
{
if (!Key.IsNullOrEmptyTrim())
{
try
{
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);
if (key != null)
{
key.SetValue(Key, NewValue);
key.Close();
}
else
{
result = CreateKey();
}
}
catch (Exception ex)
{
result.SetFail("Error accessing registry", ex);
}
}
else
{
result.SetFail("Registry key was null");
}
}
else
{
result.SetFail("Registry path was null");
}
return result;
}
должен ли я вручную ходить по дереву реестра, устанавливая каждый вызов OpenSubKey для записи? Я пробовал это, а также, все еще бросил ту же ошибку...
6 ответов
в var для ключа
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);
заменить на
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, RegistryKeyPermissionCheck.ReadWriteSubTree);
одна возможная проблема, которую я вижу с вашим кодом, заключается в том, что Path
переменная устанавливается в строку, которая не избегает \
символы. Как насчет чего-то вроде:
Path = @"S-1-5-21-1644491937-1078145449-682003330-5490\Software\Microsoft\Windows\CurrentVersion\Policies\System";
вы пытались установить accessrule и разрешения?
string user = Environment.UserDomainName + "\" + Environment.UserName
RegistryAccessRule rule = new RegistryAccessRule(user,
RegistryRights.FullControl,
AccessControlType.Allow);
RegistrySecurity security = new RegistrySecurity();
security.AddAccessRule(rule);
var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
key.SetAccessControl(security);
в качестве последней попытки выяснить, что происходит, я создал простой сервис для тестирования этого кода, который будет работать как учетная запись локальной системы. Это самые высокие привилегии, которые я мог придумать, чтобы попытаться запустить код. Запуск кода с этими разрешениями работал.
особая благодарность go out to 0_____0 и Charleh для указания на антивирус, а также. Я проверил журналы, и оказалось, что он пытался карантин мой изменения. Я думаю, даже это не остановит пользователя системы от внесения этих изменений.
особая благодарность go out to Sorceri а также за то, что помог мне исследовать это так много.
В заключение, если у вас прерывистое, чрезвычайно странное поведение, проверьте свой антивирусный сканер и разрешения.
только установить гранты на dword. Вы должны открыть реестр и на последнем пути к папке, rigth щелкните по нему и установите гранты, и выберите Все приложения и проверьте Total Control. Я надеюсь помочь вам.
просто Registry.SetValue(sub_key, key, value);
пример:
Registry.SetValue(
@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",
"MyApp",
Application.ExecutablePath);