如何在 WINAPI 中获取 Windows 10 构建版本、修订号?

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

我想使用 WINAPI 在 Windows 10 上获取构建版本。 当前窗口版本:10.0.19042.685

我尝试使用 WMI 查询来获取它。

select Version, BuildNumber from Win32_OperatingSystem.
-> Version: 10.0.19042, BuildNumber: 19042

我尝试通过调用 RtlGetVersion() 来获取它。

HMODULE hMod = ::GetModuleHandleW(L"ntdll.dll");
if (hMod) {
    typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOEXW);
    RtlGetVersionPtr fxPtr = (RtlGetVersionPtr)::GetProcAddress(hMod, "RtlGetVersion");
    if (fxPtr != nullptr) {
        RTL_OSVERSIONINFOEXW rovi = { 0 };
        rovi.dwOSVersionInfoSize = sizeof(rovi);
        if (0 == fxPtr(&rovi)) {
            printf("dwMajorVersion: %lu\n", rovi.dwMajorVersion);
            printf("dwMinorVersion: %lu\n", rovi.dwMinorVersion);
            printf("dwBuildNumber: %lu\n", rovi.dwBuildNumber);
        }
    }
}

dwMajorVersion: 10
dwMinorVersion: 0
dwBuildNumber: 19042

我无法使用 WMI 查询和 RtlGetVerion() API 获取修订号。

我想从“10.0.19042.685”获取“685”。

如何使用 WINAPI 获取 Windows 构建版本、修订号?

winapi
1个回答
0
投票

答案检测 Windows 10 版本IInspectable提供的代码对于获取 Windows 版本字符串的主要、次要和内部版本号很有用。

这三个数字存储在 Windows 注册表中的

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
项下,在 Windows 10 和Windows 11。Windows 7 仅具有
CurrentMajorVersionNumber
(带有字符串值
REG_DWORD
CurrentMinorVersionNumber
)和
REG_DWORD
(
CurrentBuildNumber
)。
REG_SZ
类型的
CurrentVersion
也存在于 Windows 10/11 上,但具有字符串值
REG_SZ
。因此,建议使用函数
GetModuleHandle
RtlGetVersion
来获取 Windows 版本的前三个数字。
在命令提示符窗口中运行 
6.1
内部命令
CurrentBuildNumber
或在 GUI 窗口中运行
REG_SZ
时显示的 Windows 修订号只能使用函数 RegGetValue 直接从 Windows 注册表中读取,如下所示: CurrentVersion

在 64 位 Windows 上执行的 32 位应用程序应考虑

WOW64 实施详细信息
受 WOW64 影响的注册表项
。在 Windows 7 上,注册表项
REG_SZ
下有注册表值 6.3,但在 Windows 7 上,注册表项

%SystemRoot%\System32\cmd.exe
 下没有 
ver

。在 Windows 11 上,两个注册表项的 %SystemRoot%\System32\winver.exe 具有相同的值23H2. 看起来没有什么比这更好的了,因为 Windows 10 和 Windows 11 的

DWORD dwRevisionNumber;
DWORD dwDataSize = static_cast<DWORD>(sizeof(dwRevisionNumber));
if(::RegGetValue(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",L"UBR",
                 RRF_RT_REG_DWORD,nullptr,&dwRevisionNumber,&dwDataSize) != ERROR_SUCCESS)
{                           // Use the value 0 for the revision number if it
    dwRevisionNumber = 0U;  // could not be read from the Windows registry.
}
UBR
还查询
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
注册表双字值的值,可以在使用
Process Monitor
时看到。

顺便说一下:

类型为

UBR
的注册表值
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion
UBR
开头,即使安装的 Windows 版本是 winver.exe,独立于以前的 Windows 10 安装升级到 Windows 11 或计算机已升级从 Windows 11 开始进行设置,至少是当前最新公开发布的 Windows 11 23H2。这很可能是许多应用程序甚至某些 Windows 内置函数输出不正确的 Windows 11 产品名称的原因。

cmd.exe 输出中的

UBR
在 Windows 11 上是正确的。
PowerShell
5.1.22621.4111 命令行
ProductName
在 Windows 11 上输出

REG_SZ

错误,

Windows 10
是注册表中的
Windows 11

OS Name

源自注册表中的 %SystemRoot%\System32\systeminfo.exe,不是版本某些网页上写的 Windows。

使用 
Win32_OperatingSystem 类
在命令提示符窗口中执行
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
会在 Windows 11 上输出具有正确 Windows 产品名称的
WindowsProductName
WindowsVersion
已被 Microsoft 声明为已弃用,不应再在新的编写代码中使用.
    

© www.soinside.com 2019 - 2024. All rights reserved.