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

问题描述 投票:2回答:1

我想读取注册表中的所有值

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不起作用吗?谢谢!

c# registry registrykey
1个回答
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位应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.