我想读取
中注册表中的所有值 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不起作用吗?谢谢!
答案 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位应用程序。