C#Registry SetValue抛出UnauthorizedAccessException

在您尝试使用“快速Google搜索”进行回答之前。 我想指出我已经。 这是情况,我有以下方法尝试修改注册表项值。 我得到的问题是,当执行时,它会抛出一个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调用设置为可写? 我试过这个,仍然犯同样的错误……

在你的密钥的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"; 

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

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

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

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

特别感谢Sorceri以及帮助我​​研究这么多。

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

只为dword设置授权。 您必须打开注册表并在最后一个文件夹路径上,单击它并设置Grants,然后选择All Aplications并选中Total Control。 我希望能帮助你。

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

例:

 Registry.SetValue( @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "MyApp", Application.ExecutablePath);