问题描述
我正在尝试使用C#从注册表中读取名称的值。注册表路径为“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion”
我想要的值为“ RegisteredOrganization”
如果我使用REGEDIT,则可以转到指定的路径并查看名称及其值。
我想使用c#做同样的事情。我使用以下代码:
string rPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
string key = "RegisteredOrganization";
try
{
using (RegistryKey regkey = Registry.LocalMachine.OpenSubKey(rPath))
{
object nameValue = regkey.GetValue(key);
if (nameValue != null)
{ Console.WriteLine($"{key} = {nameValue}"); }
else
{ Console.WriteLine($"{key} not found!"); }
}
}
catch
{
Console.WriteLine($"Error opening key {rPath}");
}
结果是:未找到RegisteredOrganization!在提升权限的情况下运行该程序可以得到相同的结果
如果我重写程序以在路径中显示键,它将仅显示30个REGEDIT中的23个名称。
有人可以给我解释这个差异吗?或者我应该在代码中进行哪些更改才能使其正常工作?
解决方法
古斯曼对原始问题的评论是解决问题的方法。 在64位计算机上,程序应以64位模式而不是32位模式运行。因此,在项目选项的“构建”选项卡中,如果选择“ AnyCPU”,则应取消选中“首选32位”复选框。否则,代码将采用WoW64中的条目,而不是REGEDIT显示的条目。因此,您得到了提到的差异。 它本身的代码是正确的并且可以正常工作。 我无法在32位计算机上对此进行检查。