使用注册表类的结果Regedit查询和C#程序查询的差异

问题描述

我正在尝试使用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位计算机上对此进行检查。