【问题标题】:Registry.LocalMachine.OpenSubKey() returns nullRegistry.LocalMachine.OpenSubKey() 返回 null
【发布时间】:2009-08-12 21:02:34
【问题描述】:

我从这次访问 Windows 注册表的尝试中得到一个空值:

using (RegistryKey registry = Registry.LocalMachine.OpenSubKey(keyPath))

keyPath 是SOFTWARE\\TestKey

密钥在注册表中,为什么在本地机器配置单元下找不到?

【问题讨论】:

  • 您是否正确地转义了 KeyPath?是“SOFTWARE\\TestKey”,而不是“SOFTWARE\TestKey”?
  • 是的,我发错了。它实际上设置为使用 \\
  • 所以这在我老板的电脑上运行得很好。没有理由不应该在这里。因为我正在运行 VS Web 服务器,所以我给了它的 asp.net 帐户访问权限,但仍然返回 null。

标签: c# registry


【解决方案1】:

如果您使用的是 64 位计算机,则可能会发生这种情况。首先创建一个助手类(需要 .NET 4.0 或更高版本):

public class RegistryHelpers
{

    public static RegistryKey GetRegistryKey()
    {
        return GetRegistryKey(null);
    }

    public static RegistryKey GetRegistryKey(string keyPath)
    {
        RegistryKey localMachineRegistry
            = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                      Environment.Is64BitOperatingSystem
                                          ? RegistryView.Registry64
                                          : RegistryView.Registry32);

        return string.IsNullOrEmpty(keyPath)
            ? localMachineRegistry
            : localMachineRegistry.OpenSubKey(keyPath);
    }

    public static object GetRegistryValue(string keyPath, string keyName)
    {
        RegistryKey registry = GetRegistryKey(keyPath);
        return registry.GetValue(keyName);
    }
}

用法:

string keyPath = @"SOFTWARE\MyApp\Settings";
string keyName = "MyAppConnectionStringKey";

object connectionString = RegistryHelpers.GetRegistryValue(keyPath, keyName);

Console.WriteLine(connectionString);
Console.ReadLine();

【讨论】:

  • 需要注意的是,这个答案需要.NET 4.0或更高版本。
  • 谢谢!你刚刚拯救了我的一天!
  • 在 64 位 Windows 上有两个 regedit 实用程序。 C:\Windows\System32\regedt32.exe 和 C:\Windows\SysWOW64\regedt32.exe。每个都为您提供不同的 RegistryView
  • 在 .NET 3.5 中有没有办法做到这一点?
  • 不需要 64 位检查。来自 MSDN:If you request a 64-bit view on a 32-bit operating system, the returned keys will be in the 32-bit view.
【解决方案2】:

在您对 Dana 的评论中,您说您授予了 ASP.NET 帐户访问权限。但是,您是否确认这是该网站运行时使用的帐户?冒充和匿名访问用户很容易被忽视。

未经测试的代码:

Response.Clear();  
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);  
Response.End();

【讨论】:

  • 我怎样才能知道网站在哪个帐户下运行而无需编写代码来公开?
  • 以上是我解决帐户问题的一般方法,尽管我确实添加了一个检查,它来自我的 IP 地址,这样不仅每个人都能看到它。
【解决方案3】:

只需要改变它从

using (RegistryKey registry = Registry.LocalMachine.OpenSubKey(keyPath))

using (RegistryKey registry = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default).OpenSubKey(keyPath))

(使用RegistryKey代替Registry,添加RegistryView,并将hive-Local Machine作为方法参数。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2020-06-19
    相关资源
    最近更新 更多