注册表项 EditionID 在 WOW6432Node 下的值错误 - 有意还是错误?如何绕过?
Posted
技术标签:
【中文标题】注册表项 EditionID 在 WOW6432Node 下的值错误 - 有意还是错误?如何绕过?【英文标题】:Registry key EditionID has wrong value under WOW6432Node - by intention or bug? How to bypass? 【发布时间】:2019-06-08 00:45:00 【问题描述】:我正在运行 Windows 10 Professional 1809 build 17763。
HKLM\SOFTWARE\ WOW6432Node\Microsoft\Windows NT\CurrentVersion\EditionID
的值是"Enterprise"
,这是错误的。
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EditionID
是 "Professional"
,这是正确的。
这是我的 Windows 安装的特定问题吗?如果没有,如果你用 32 位开发,你会怎么解决?
我的原始代码是用 C++ 编写的。因为我首先没有理解这个问题,所以我在 C# 中重新实现了它。我会很欣赏 C# 或 C++ 的解决方案,并且我相信如果用另一种语言提供解决方案,我可以用一种语言解决问题。谢谢!
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");
//---- 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"
。
【问题讨论】:
我遇到了完全相同的事情。我相信这与我们注册到企业系统域控制器的原因有关。我有 1803 版。 我在使用 Windows 10 Pro 时遇到了同样的问题。甚至“产品名称”也是“Windows 10 Enterprise”。很奇怪。我认为这是一个从未修复过的错误。 这里也一样。赢得 10、64、1903、Pro(德语)。 【参考方案1】:要从 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).
【讨论】:
【参考方案2】:我也遇到了这个问题,但是根据 Ralph 的建议,专业版的 editionID 也正确。
C#代码:
var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
var editionID = key.GetValue("EditionID");
【讨论】:
以上是关于注册表项 EditionID 在 WOW6432Node 下的值错误 - 有意还是错误?如何绕过?的主要内容,如果未能解决你的问题,请参考以下文章
Wow6432Node(32位程序的注册表内容都在这个节点下,也可直接使用%systemroot%syswow64 egedit进行编辑)