用C#编辑注册表,但用regedit找不到更改

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


我通过 C# 使用以下代码更改了注册表:

RegistryKey regKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
RegistryKey openSubKey = regKey.OpenSubKey(@"SOFTWARE\ASA\Suite", true);
openSubKey?.SetValue("Password", encryptedString, RegistryValueKind.String);
openSubKey?.SetValue("UserName", UserNameTextBox.Text, RegistryValueKind.String);
openSubKey?.SetValue("DomainName", DomainNameTextBox.Text, RegistryValueKind.String);
openSubKey?.Close();
regKey.Close();

这些条目确实已经存在,只是被替换了。当我使用相同类型的代码读取设置时,我得到了正确的设置,但是当我使用 regedit.exe 打开注册表并手动搜索它时,我只找到旧值。在regedit.exe中它是这个路径:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ASA\Suite
我已经研究过没有 WOW6432Node 的路径(甚至在 HKCU 中),但根本没有 ASA 条目。
有人知道那可能是什么吗?为什么我看不到我所做的更改?我在这里完全困惑......

编辑:我将项目从anyCPU更改为x86,没有任何更改,但是一旦我将其更改为x64,读取的键就是regedit.exe显示的键。但我打开注册表配置单元的 32 位变体,当我在这里写东西时,问题仍然存在......为什么我看不到所做的更改? x64 Windows 下的 x86 应用程序应该自动写入 WOW6432Node,不是吗?

EDIT2:我在 x86 Windows 上测试了 x86 版本。我更改了注册表并且可以读取它,但是使用 regedit 我看不到更改... 这是什么鬼?

EDIT3:我在 HKCR\VirtualStore\MACHINE\SOFTWARE\ASA\Suite 下找到了更改的密钥,我还不知道为什么,但我搜索答案并将其发布在这里。

c# .net registry regedit
2个回答
3
投票

可能是其他人覆盖了它,这个可以帮助!

Wow6432Node
注册表项表示您正在运行 64 位 Windows 版本。

操作系统使用此键为在 64 位 Windows 版本上运行的 32 位应用程序显示单独的

HKEY_LOCAL_MACHINE\SOFTWARE
视图。当 32 位应用程序在
HKEY_LOCAL_MACHINE\SOFTWARE\<company>\<product>
子项下写入或读取值时,应用程序会从
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\<company>\<product>
子项读取。

注册表反射器在 32 位和 64 位注册表视图之间复制某些值(主要用于 COM 注册),并使用“last-writer-wins”方法解决任何冲突。


1
投票

好的,我有答案了。我不想使用清单,所以我删除了它,因此没有被问到是否必须提升应用程序。因此,因为普通用户(即使登录的用户具有管理员权限)无法写入 HKLM,所以它向 HKCU\VirtualStore 写入了一个密钥...这样我的应用程序也可以读取密钥,但在 regedit 中。 exe 它不是预期的位置。 为了解决这个问题,我实现了一个清单并更改了 requestExecutionLevel 的行:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

现在我什至不必构建 x64 和 x86 版本,但可以使用任何 CPU,并让我的应用程序完成工作(即:查看是否使用

RegistryView.Registry32
RegistryView.Registry64

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