从 Win32_OperatingSystem 获取 Windows 版本 23H2

问题描述 投票:0回答:2

代码:

std::map<CString, CString> mapWindowsVersions
{
    { L"22631", L"23H2" },
    { L"22621", L"22H2" },
    { L"22000", L"21H2" },
    { L"19044", L"21H2" },
    { L"19043", L"21H1" },
    { L"19042", L"20H2" },
    { L"19041", L"2004" },
    { L"18363", L"1909" },
    { L"18362", L"1903" },
    { L"17763", L"1809" },
    { L"17134", L"1803" },
    { L"16299", L"1709" }
};
VARIANT vtProp{};
hres = pclsObj->Get(L"BuildNumber", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L"  Build Number: %s\r\n", mapWindowsVersions[vtProp.bstrVal]);
VariantClear(&vtProp);

这有效。,我从这里收集了发布描述。但是有没有内置的方法来获取这个描述,例如:23H2?

windows visual-c++
2个回答
1
投票

我不知道答案,但我知道从哪里开始寻找:

winver.exe

这是我的关于 Windows 对话框,它忠实地显示了您要查找的“版本 22H2”字符串:

  • 在 WinDbg 或 Ghidra 或其他什么中启动
    winver.exe
    显示
    winver.exe
    只是调用
    Shell32.dll!ShellAboutW
    来完成所有实际工作。
  • ...进而使用(非导出)函数
    AboutDlgProc
    设置对话框资源来驱动 关于 Windows 对话框。
  • ...调用
    _InitAboutDlg
    将数据(字符串、文本等)加载到对话框的标签/占位符中。
  • ...打开
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    注册表项,然后根据某些任意 业务规则提取值:
    • 显然有一个名为
      EnableH2UIVersioning
      的(WinRT?C++/CX?)API 控制是否显示“22H2”样式的版本名称。当这是
      true
      时,“22H2”字符串来自
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DisplayVersion
      ,否则使用
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId
  • 在我的机器上,
    DisplayVersion
    ReleaseId
    都存在,但
    ReleaseId
    包含错误/旧值“2009” - 这意味着
    ReleaseId
    如果存在则不可信。

0
投票

根据评论中的建议,我提出了以下解决方案:

hres = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L"  Edition: %s\r\n", vtProp.bstrVal);
VariantClear(&vtProp);

hres = pclsObj->Get(L"Version", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L"  Version: %s\r\n", vtProp.bstrVal);
VariantClear(&vtProp);

hres = pclsObj->Get(L"BuildNumber", 0, &vtProp, 0, 0);
strSystemInfo.AppendFormat(L"  Version Build Number: %s\r\n", vtProp.bstrVal);
VariantClear(&vtProp);

CSettingsStore store(true, true);
if (store.Open(L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"))
{
    CString strDisplayVersion;
    const auto buildNumber = _ttoi(CString(vtProp.bstrVal));
    if (buildNumber > 19041)
    {
        if (store.Read(L"DisplayVersion", strDisplayVersion))
        {
            strSystemInfo.AppendFormat(L"  Version Codename: %s\r\n", strDisplayVersion);
        }
    }
    else
    {
        if (store.Read(L"ReleaseId", strDisplayVersion))
        {
            strSystemInfo.AppendFormat(L"  Version Codename: %s\r\n", strDisplayVersion);
        }
    }
}

它在我的“关于”窗口上显示以下输出:

Edition: Microsoft Windows 11 Home
Version: 10.0.22631
Version Build Number: 22631
Version Codename: 23H2
© www.soinside.com 2019 - 2024. All rights reserved.