【问题标题】:Cant getValueNames() from HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run无法从 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run getValueNames()
【发布时间】:2016-12-30 18:42:32
【问题描述】:

我想从注册表中读取

中的所有值

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

我正在尝试使用以下代码来做到这一点:

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
        string[] values = key.GetValueNames();

但我的值字符串总是空的。 有趣的是,如果我将代码更改为

 RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion", false);
        string[] values = key.GetValueNames();

我在 CurrentVersion 中获得了正确数量的 ValueName。为什么它在 \Run 中不起作用? 如果我从 LocalMachine 更改为 CurrentUser,则 \Run 路径也可以使用。

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
        string[] values = key.GetValueNames();

谁能告诉我为什么我的第一个 CodeExample 不起作用?谢谢!

【问题讨论】:

  • 无法重现。你的第一个例子对我来说很好。您是否在独立的测试程序中对其进行了测试?也许这是你真实代码中的一些奇怪的情况......
  • 就这么做了。又是同样的问题。不过谢谢你的回答。

标签: c# registry registrykey


【解决方案1】:

您没有提供有关您的 C# 应用程序是 32 位 (x86) 还是 64 位 (x64) 的详细信息。如果应用程序是在 64 位 Windows 上运行的 32 位应用程序,则对 HKLM\Software 的注册表调用将重定向到 HKLM\Software\Wow6432Node。 Microsoft 将此称为Registry Redirector。仅重定向某些键,详细信息在链接的文章中。

如果您的应用程序是 64 位,则这些注册表调用不会被重定向。

您可以通过手动将单个 REG_SZ 条目“TestWOW”添加到HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 来进行测试。您的 32 位代码应该读取此值(即使您实际上要求提供另一个注册表项!)。

如果可以,请将您的应用程序重新编译为 64 位。现在,相同的代码将从HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 返回预期值。

不幸的是,对于在 64 位操作系统上运行的 32 位应用程序,我不知道强制 Windows 不将您的注册表调用重定向到 Wow64 节点的机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-07-30
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多