C#在注册表Local Machine中创建值

25
以下代码对我不起作用:
public bool createRegistry()
{
    if (!registryExists())
    {
        Microsoft.Win32.Registry.LocalMachine.CreateSubKey("Software\\xelo\\");

        Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\xelo").SetValue("hostname", (string)hostname, Microsoft.Win32.RegistryValueKind.String);


        return true;
    }
    else
    {
        return updateRegistry();
    }
}

异常:

System.UnauthorizedAccessException | “无法写入注册表键”

5个回答

28

非管理员以及未提升权限的管理员用户无法修改HKEY_LOCAL_MACHINE键。请以“管理员身份”运行程序。


15
尝试将OpenSubKey调用的第二个参数传递为true,或使用CreateSubKey的返回值。 http://msdn.microsoft.com/zh-cn/library/microsoft.win32.registrykey.opensubkey.aspxhttp://msdn.microsoft.com/zh-cn/library/ad51f2dx%28v=VS.100%29.aspx - Kyle Alons
2
谢谢Kyle,你需要执行OpenSubKey("KeyName", true),其中true表示可写入:D,请编辑你的答案并包含这个信息。 - Angel.King.47
@segfault,遇到了同样的问题,需要在该函数上拥有写入权限。 - Angel.King.47
答案目前还是不完整/错误的。评论是正确的。 - TaW

12

以下代码用于在注册表中创建密钥。

Microsoft.Win32.RegistryKey key;
key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey("Software\\Wow6432Node\\Names");
key.SetValue("Name", "Isabella");
key.Close();

2
运行代码片段时,我收到了一个“附加信息:拒绝访问注册表键'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Names'”的错误。请给予建议。 - Cole
以管理员身份运行应用程序,它应该可以工作。 - PandaNL
如果我想使用数字怎么办?我是不是要这样写 key.SetValue("Name", "1"); - Nullify
@Nullify 你可以尝试像这个例子中展示的那样 https://learn.microsoft.com/en-us/dotnet/api/microsoft.win32.registrykey.setvalue?view=net-7.0 - Dinesh Haraveer

10

即使是管理员,我认为您也无法在LocalMachine上创建新密钥。确保您这样做

Registry.LocalMachine.CreateSubKey(@"SOFTWARE\YourCompanyName\SomeNewKey");
并且不是。
Registry.LocalMachine.CreateSubKey("SomeNewKey");

1
在 VS 中运行此代码片段或通过转到/bin/Debug/App.exe并以管理员身份运行它会导致以下错误:mscorlib.dll中发生了未处理的类型为'System.UnauthorizedAccessException' 的异常。附加信息:拒绝访问注册表键'HKEY_LOCAL_MACHINE\SOFTWARE\YourCompanyName\SomeNewKey'。 - Cole
@Cole:你可能需要发布一个新问题,其中包含特定于你的问题的详细信息。这种写入注册表的方法是经过验证的,我已经在商业软件中使用了多年。如果你发布你的代码,我们可以帮助你找出为什么会出现这个异常。我的典型模式是:RegistryKey rk = Registry.LocalMachine.OpenSubKey(path, true); if (rk == null) { rk = Registry.LocalMachine.CreateSubKey(path);} if(rk!=null){ .. do stuff .. rk.Close(); } - nothingisnecessary
1
string path = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers"; RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(path, true);which throws`An unhandled exception of type 'System.Security.SecurityException' occurred in mscorlib.dllAdditional information: Requested registry access is not allowed.` - Cole
兄弟,如果你需要帮助,请发布一个新问题。我尝试了这条路线,对我来说运行良好。你需要发布一个新问题,并提供与你的问题相关的详细信息(操作系统、架构:32位还是64位)。你可能会遇到UAC/权限升级方面的问题。此外,尝试在特定异常上进行搜索,例如:https://dev59.com/CHRB5IYBdhLWcg3wpYqo - nothingisnecessary

0

你已经得到了答案 - 我猜测你正在运行 Vista 或 Windows 7 (或 Server 2008) 并且运行该应用程序的进程/用户没有修改注册表的权限。

因此,这不是一个代码问题,而是系统管理员的问题。以管理员身份构建应用程序并运行,看看是否有效。


我可以确认,根据上述代码片段和被接受的答案所建议的以管理员权限编程方式更新HKEY_LOCAL_MACHINE是无效的。 - Cole

-1

将权限检查位设置为true...

Microsoft.Win32.Registry.LocalMachine.CreateSubKey("Software\\xelo\\", true);

:)


2
Registry.LocalMachine中没有包含任何重载方法,允许使用CreateSubKey(String,Bool) - WiiMaxx
OpenSubkey() 使用布尔型第二参数打开可写键。你需要的是这个:.CreateSubKey(r,RegistryKeyPermissionCheck.ReadWriteSubTree) - jrypkahauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接