C# 无法从HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run获取ValueNames()

C# 无法从HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run获取ValueNames(),c#,registry,registrykey,C#,Registry,Registrykey,我想从注册表中读取 HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 我正在尝试使用以下代码执行此操作: RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false); string[] values = key.GetValueNames(

我想从注册表中读取

HKEY\U LOCAL\U 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();

有人能告诉我为什么我的第一个代码示例不起作用吗?谢谢

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

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

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

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


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

无法重现这种情况。你的第一个例子很适合我。你在一个独立的测试程序中测试过吗?也许在你的真实代码中有一些奇怪的情况…就是这么做的。同样的问题再次出现。但是谢谢你的回答。