Ключ реестра EditionID имеет неверное значение в WOW6432Node - намеренно или ошибка? Как обойти?

Я использую Windows 10 Professional 1809, сборка 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",

0 ответов

Чтобы получить доступ к 64-битному дереву в реестре из 32-битного приложения, Вы должны открыть раздел реестра, используя параметр 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 или более ранних версий я нашел это: как читать 64-битный реестр из 32-битного приложения

Изменить: код C# (4.x):

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

Я тоже столкнулся с этой проблемой, но, следуя предложению Ральфа, editionID также подходит для профессиональной версии.

Код C#:

var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
var editionID = key.GetValue("EditionID");
Другие вопросы по тегам