C#Registry SetValue抛出UnauthorizedAccessException

时间:2012-08-01 21:56:07

标签: c# registry registrykey unauthorizedaccessexcepti

在您尝试使用“快速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调用设置为可写?我也尝试了这个,仍然犯了同样的错误...

7 个答案:

答案 0 :(得分:13)

中的密钥

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

更改为

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

答案 1 :(得分:3)

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

Path = @"S-1-5-21-1644491937-1078145449-682003330-5490\Software\Microsoft\Windows\CurrentVersion\Policies\System";

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:0)

我最近遇到了同样的问题。因此,我尝试了一些方法,而不是调用key.SetValue(Key, NewValue)而不是简单地调用create function解决了我的问题。那是

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

CreateSubKey调用不会删除当前条目,但具有无异常写入的功能。希望对您有所帮助。

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

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

示例:

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