9

在您尝试用“快速 Google 搜索”来回答这个问题之前。我想指出我已经这样做了。这是这种情况,我有以下方法尝试修改注册表项值。我遇到的问题是,在执行时,即使我已将密钥打开为 writeable ,它也会引发 UnauthorizedAccessException 。我以管理员身份运行 Visual Studio,甚至尝试制作一个带有清单文件的小型 .exe,强制它以管理员身份运行,这将不走运地执行代码。密钥已经存在,它不会尝试进入 CreateKey 方法。这是代码块。

Path = "S-1-5-21-1644491937-1078145449-682003330-5490\Software\Microsoft\Windows\CurrentVersion\Policies\System"
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 调用设置为可写?我也试过这个,仍然抛出同样的错误......

4

7 回答 7

16

在您的密钥的 var 中

var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);

改成

var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, RegistryKeyPermissionCheck.ReadWriteSubTree);  
于 2012-08-01T22:21:47.053 回答
4

您是否尝试过设置访问规则和权限?

 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(subKeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
 key.SetAccessControl(security);
于 2012-08-01T22:35:04.797 回答
3

我在您的代码中看到的一个可能问题是该Path变量被设置为一个不会转义\字符的字符串。怎么样:

Path = @"S-1-5-21-1644491937-1078145449-682003330-5490\Software\Microsoft\Windows\CurrentVersion\Policies\System";
于 2012-08-01T22:06:04.727 回答
3

作为弄清楚发生了什么的最后努力,我创建了一个简单的服务来测试这个将作为本地系统帐户运行的代码。这是我能想到的尝试运行代码的最高权限。使用这些权限运行代码有效。

特别感谢0_ _ ___0Charleh 也指出了防病毒软件。我检查了日志,结果发现它正在尝试隔离我的更改。我想即使它也不会阻止系统用户进行这些更改。

特别感谢Sorceri帮助我研究了这么多。

总之,如果您有间歇性、极其奇怪的行为,请检查您的病毒扫描程序和权限。

于 2012-08-02T16:24:28.330 回答
0

我最近遇到了同样的问题。所以我尝试了一些事情,而不是key.SetValue(Key, NewValue)简单地调用 create 函数解决了我的问题。那是;

Microsoft.Win32.RegistryKey key1 = Microsoft.Win32.Registry.Users.CreateSubKey(Path);
key1.SetValue(Key, NewValue);

CreateSubKey 调用不会删除当前条目,但提供了无异常写入的能力。我希望这会有所帮助。

于 2019-11-12T17:04:16.777 回答
-2

只对 dword 设置授权。您必须打开注册表并在最后一个文件夹路径上单击它并设置授予,然后选择所有应用程序并检查总控制。我希望能帮助你。

于 2016-03-10T17:07:34.373 回答
-2

只是Registry.SetValue(sub_key, key, value);

例子:

Registry.SetValue(
            @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",
            "MyApp",
            Application.ExecutablePath);
于 2017-10-06T03:23:06.217 回答