Registry.GetValue始终返回null

时间:2012-02-29 00:30:18

标签: c# registry

我的注册表中有以下密钥:

下:HKEY_LOCAL_MACHINE\SOFTWARE\RSA我有值对象调用 - WebExControlManagerPath,其值为c:\

我正在尝试这样做:

var r = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\RSA", "WebExControlManagerPth",null);

if(r!=null)
    ProcessAsUser.Launch(ToString());

r值始终为空。

enter image description here

有什么想法吗?

7 个答案:

答案 0 :(得分:42)

statementJason是正确的,操作系统是问题,下面的代码将帮助您解决。

RegistryKey localKey;
if(Environment.Is64BitOperatingSystem)
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
else
    localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);

string value = localKey.OpenSubKey("RSA").GetValue("WebExControlManagerPth").ToString();

答案 1 :(得分:19)

您不像在批处理脚本中那样访问HKEY_LOCAL_MACHINE配置单元,就像在C#中一样。你打电话给Registry.LocalMachine

        RegistryKey myKey = Registry.LocalMachine.OpenSubKey( @"Software\RSA", false);
        String value = (String)myKey.GetValue("WebExControlManagerPth");

        if (!String.IsNullOrEmpty(value))
        {
            ProcessAsUser.Launch(ToString());
        }

<强>更新

如果返回null,请将构建体系结构设置为 Any CPU 。操作系统可以不同地虚拟化32位和64位注册表。请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspxReading 64bit Registry from a 32bit applicationhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx

答案 2 :(得分:3)

如果您使用的是64位操作系统,那么当您尝试获取时 HKEY_LOCAL_MACHINE\SOFTWARE\RSA它实际上在寻找HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\RSA 这就是为什么你得到null

答案 3 :(得分:1)

使用regedt32.exe查看注册表项的安全权限;检查您是否以管理员身份运行并关闭了UAC。根据opensubkey文档,在访问任何密钥之前需要先打开它; http://msdn.microsoft.com/en-us/library/z9f66s0a.aspx

答案 4 :(得分:1)

我在路径的开头有额外的“\”,确保设置正确。

答案 5 :(得分:0)

这里没有一个解决方案对我有用,我仍然从读取的注册表中返回null。根据以上答案的结合,我终于找到了对我有用的解决方案。感谢所有人为我指出正确的方向。

我很高兴参加晚会,但是我认为,如果上述解决方案不适合其他人,这可能会对其他人有所帮助。

此函数是类的一部分:

/// <summary>
/// Gets the specified setting name.
/// </summary>
/// <param name="settingName">Name of the setting.</param>
/// <returns>Returns Setting if the read was successful otherwise, "undefined".</returns>
public static string get(string settingName)
{
    RegistryKey key;

    if (Environment.Is64BitOperatingSystem)
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\MyCompany\MyProductName", false);
    else
        key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyProductName", false);

    try
    {
        String value = (String)key.GetValue(settingName);

        return value;
    }
    catch
    {
        // Null is not returned as in this case, it is a valid value.

        return "undefined";
    }
    finally
    {
        key.Close();
    }
}

答案 6 :(得分:0)

根据 Palanikumar 上面的评论(抱歉,我还没有足够的代表对他的帖子发表评论!),但我在构建选项中取消了“首选 32 位”,这解决了我的问题。当我读取注册表值时(在 32 位注册表配置单元中),当它被设置为 0 时,它总是作为特定 DWORD 值的 1 返回!把我推到墙上想办法解决这个问题,尝试重新启动,更改密钥,但在我取消选中此框之前没有任何修复。现在得到正确的 0 值!太棒了!

string keyValue = key.GetValue("ChangeMeToKeyName").ToString();

                    if (keyValue == "0")
                    {
                        //DoThings
                    }