注册表项 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进行编辑)

Windows 10 的注册表版本值?

访问注册表项会引发异常?

如何从 32 位进程读取 64 位注册表项?

根据 Windows 版本运行的批处理脚本

读取注册表和 Wow6432Node 键