我想从
中的注册表中读取所有值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();
有人能告诉我为什么我的第一个代码示例不起作用吗?谢谢!
最佳答案
您没有提供有关您的 C# 应用程序是 32 位 (x86) 还是 64 位 (x64) 的详细信息。如果应用程序是在 64 位 Windows 上运行的 32 位应用程序,则对 HKLM\Software
的注册表调用将重定向到 HKLM\Software\Wow6432Node
。微软称之为 Registry Redirector .只有某些键被重定向,详细信息在链接的文章中。
如果您的应用程序是 64 位的,则不会重定向这些注册表调用。
您可以通过将“TestWOW”这样的单个 REG_SZ 条目手动添加到 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
来测试它。您的 32 位代码应该读取此值(即使您实际上要求另一个注册表项!)。
如果可以,请将您的应用程序重新编译为 64 位。现在,相同的代码将从 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
返回预期值。
不幸的是,对于在 64 位操作系统上运行的 32 位应用程序,我不知道有一种机制可以强制 Windows 不将您的注册表调用重定向到 Wow64 节点。
关于c# - 无法从 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 获取值名称(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41401116/