【问题标题】:How to read Windows Server 2008 in c#如何在 C# 中读取 Windows Server 2008
【发布时间】:2014-03-10 15:29:19
【问题描述】:

我正在尝试使用以下代码读取注册表值。

    Label1.Text = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Myweb\\ConnectionManager", "ID", null).ToString();

当我在 windows xp 中尝试时它工作正常,但我从不在 windows server 2008 中工作。 请帮忙

【问题讨论】:

  • 服务器上的密钥是如何创建的? (它不会自动出现)。
  • @Richard 我已经创建了密钥。
  • @rene 不,我没有从 IIS 尝试过。我相信这与 64 位和 32 位操作系统有关。
  • @rene 通过 regedit
  • @rene 它在 windows xp 中工作得非常好,但在 windows server 2008 中却不行。

标签: c# asp.net registry


【解决方案1】:

您可能遇到了WOW redirector 的问题。

您可以使用 Microsoft.Win32 中的更多 specialized classes 来获取配置单元的 64 位或 32 位部分。

 var root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine
                                   ,RegistryView.Registry32); // or Registry64
 var flk = root.OpenSubKey("SOFTWARE");
 var slk = flk.OpenSubKey("Myweb");
 var tlk = slk.OpenSubKey("ConnectionManager");
 var val = tlk.GetValue("ID");

 Label1.Text = val.ToString();

或者更通用的方法来获取注册表值:

object GetValue64Or32(string path, string ValueKey)
{
     var parts = path.Split('\\');
     RegistryHive hive = RegistryHive.LocalMachine;
     switch(parts[0])
     {
        case "HKEY_LOCAL_MACHINE":
            hive = RegistryHive.LocalMachine;
        break;
        default:
           throw new NotImplementedException();
     }
     foreach(var view in Enum.GetValues(typeof(RegistryView)))
     {
        var key = RegistryKey.OpenBaseKey(hive, (RegistryView) view);
        for(var partIndex=1; partIndex<parts.Length;partIndex++)
        {
           key = key.OpenSubKey(parts[partIndex]);
           if (key == null) break;
        }
        if (key!=null) return key.GetValue(ValueKey);
     }
     return null;
}

用法:

var value = GetValue64Or32(
               "HKEY_LOCAL_MACHINE\\SOFTWARE\\Myweb\\ConnectionManager"
             , "ID");
Label1.Text = value!=null?value.ToString():"no value found";

如果我使用此注册表文件,此代码适用于 32 位配置单元:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyWeb\]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyWeb\ConnectionManager\]
"ID"="id 1"

这适用于 64 位配置单元:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\MyWeb\]

[HKEY_LOCAL_MACHINE\SOFTWARE\MyWeb\ConnectionManager\]
"ID"="id 1"

您可以使用命令提示符中的REG 来验证您的注册表路径是否存在:

reg query HKLM\Software\MyWeb\ConnectionManager /s

【讨论】:

  • 感谢您的回答。我试过你回答,但它给我的对象引用没有设置为实例。在这一行 var val = tlk.GetValue("ID");我尝试了 Registery32 和 64
  • 优秀。非常感谢工作,两者都是完美的答案。 RegistryView.Registry64 成功了。
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多