【问题标题】:Registry.GetValue always return nullRegistry.GetValue 始终返回 null
【发布时间】:2012-03-18 12:23:14
【问题描述】:

我的注册表中有以下键:

under: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 的值始终为空。

有什么想法吗?

【问题讨论】:

  • 我试试这个,它也返回 Null

标签: c# registry


【解决方案1】:

在 C# 中访问 HKEY_LOCAL_MACHINE 配置单元的方式与在批处理脚本中不同。你打电话给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

【讨论】:

  • 您有管理权限吗?本地计算机配置单元需要管理权限才能写入。我不确定阅读是否需要管理权限,但它们可能是您的空字符串的原因。 JK,对我来说也是空的。
  • 我以管理员身份运行 Visual Studio
  • 成功了!!谢谢 !是什么原因?
  • 也更新了我的帖子,原因。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我的路径开头有多余的“\”,请确保设置正确。

    【讨论】:

      【解决方案4】:

      Jasonstatement是对的,是操作系统的问题,下面的代码帮你解决。

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

      【讨论】:

      • 无需为“任何 CPU”编译的出色修复.. 这应该是最佳答案。
      • @Ignatius,我没有检查 .NET 4.0 以下。感谢您的信息:)
      • 很好的修复。如果您需要 .NET 4.0 之前的支持,请查看此 answer 到另一篇文章。
      • 这就是解决方案。
      • 我对这样的事情很偏执,所以我在调用“localKey.OpenSubKey...”之前添加了这个:if (localKey.GetSubKeyNames().Contains("RSA") && localKey.OpenSubKey("RSA").GetValueNames().Contains("WebExControlManagerPth")) value = localKey.OpenSubKey("RSA").GetValue("WebExControlManagerPth").ToString();
      【解决方案5】:

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

      【讨论】:

      • 如果您还提供一些解决方案,这将是一个更好的答案。如果没有,请将此作为对问题的评论。
      • 这仅适用于 32 位应用程序,在这种情况下,64 位操作系统将重定向 HKLM\SOFTWARE\Wow6432Node 下的读取和写入。如果应用程序是 64 位应用程序,则 64 位 Windows 不会重定向写入。
      【解决方案6】:

      这里的解决方案都不适合我,我的注册表读取仍然返回 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();
          }
      }
      

      【讨论】:

        【解决方案7】:

        继上面的帕拉尼库马尔评论之后(我还没有足够的代表来评论他的帖子,抱歉!)但是我在我的构建选项中取消了“首选 32 位”,这对我的问题进行了排序。当我读取注册表值(在 32 位注册表配置单元中)时,当它设置为 0 时,对于特定的 DWORD 值,它总是以 1 的形式返回!把我赶到墙上弄清楚这一点,尝试重新启动,更改密钥并没有解决它,直到我取消选中此框。现在得到正确的 0 值!太棒了!

        string keyValue = key.GetValue("ChangeMeToKeyName").ToString();
        
                            if (keyValue == "0")
                            {
                                //DoThings
                            }
        

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题;我找到了这个帖子。

          对我来说,解决方案是:

          1. VS2019 > 项目 > 应用程序属性 > 构建 > 常规 > 我的平台目标:已选择“任何 CPU”
          2. *取消选中 -- 首选 32 位

          仅 Registry.SetValue 需要管理员

          更新: 我今天学到了其他东西。

          1. 被 Registry.GetValue 赋值的变量必须是静态的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-31
            • 2015-08-15
            • 2016-11-04
            • 2016-07-28
            • 2010-11-08
            • 2017-11-26
            • 2015-02-23
            • 2017-11-16
            相关资源
            最近更新 更多