c# - 无法从 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 获取值名称()

标签 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();

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

最佳答案

您没有提供有关您的 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/

相关文章:

windows - 如何以编程方式为某些 USB 设备禁用 "Enhanced Power Management"?

c++ - 监视内核注册表更改

c# - 错误 : System. IO.IOException:找不到网络路径

uwp - 如何访问 UWP 应用中的注册表项?

c++ - 如何使用RegCopyTree

c# - 如何为长时间运行的 Azure 函数创建启动代码?

java - 尝试使用java中的资源和异常

c# - 如何在 Windows Phone 8 中获取设备分辨率?

c# - 安装程序自定义操作 - 注册 COM dll - C#

c# - xamarin forms 如何将枚举值传递给 XAML 并在 switch 语句中使用它?