无法从HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run获取getValueNames()

时间:2016-12-30 18:42:33

标签: c# registry registrykey

我想读取

中注册表中的所有值

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

我正在尝试使用以下代码执行此操作:

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

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

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

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

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

有人可以告诉我为什么我的第一个CodeExample不起作用吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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