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);