注册表项EditionID在WOW6432Node下的值错误-是出于意图还是由错误引起?如何绕过?

时间:2019-01-14 00:40:44

标签: c# c++ windows registry wow64

我正在运行Windows 10 Professional 1809内部版本17763。

"Enterprise"的值为HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EditionID,这是错误的。 "Professional"using System; using System.Collections.Generic; using Microsoft.Win32; class Program { static void Main(string[] args) { List<string> valueNames = new List<string> { "ProductName", "EditionID" }; foreach (var valueName in valueNames) { string value = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", valueName, "Key not found"); Console.WriteLine($"{valueName}: {value}"); } } } ,这是正确的。

这是Windows安装中的特定问题吗?如果没有,如果您要以32位开发,您将如何解决?

我的原始代码是C ++。因为我首先不了解该问题,所以我在C#中重新实现了它。我希望能用C#或C ++解决方案,并且我相信只要使用另一种语言的解决方案,我就能用一种语言解决该问题。谢谢!

//---- C++ version
#include "Registry.hpp" // Modern C++ Wrappers for Win32 Registry Access APIs by Giovanni Dicanio

const std::wstring subKey{ L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" };
const std::wstring value{ L"EditionID" };
std::wstring ws = win32::RegGetString(HKEY_LOCAL_MACHINE, subKey, value);
this->windowsEdition = std::string(ws.begin(), ws.end());
EditionID

"Professional"应该是"Enterprise",但是应该是body, html { width: 100vw; height: 100vh; margin: 0; padding: 0; } #blog { width: 100vw; height: 100vh; margin: 0; padding: 0; }

2 个答案:

答案 0 :(得分:0)

要从32位应用程序访问注册表中的64位树,必须使用选项 KEY_WOW64_64KEY 打开注册表项。

C / C ++示例:

error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKey);

编辑:

对于.Net 3.5或更早版本,我发现了这一点:how-read-the-64-bit-registry-from-a-32-bit-application

编辑:C#(4.x)代码:

RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).

答案 1 :(得分:0)

我也遇到了这个问题,但是根据Ralph的建议,对于专业版,versionID也可以正确显示。

C#代码:

var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
var editionID = key.GetValue("EditionID");