我想使用 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 构建版本、修订号?
答案检测 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 上是正确的。PowerShell5.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 声明为已弃用,不应再在新的编写代码中使用.