从Win32 API C 获取OS构建版本

Getting OS build version from Win32 Api C++

本文关键字:OS 构建 版本 获取 Win32 API      更新时间:2023-10-16

我正在尝试找到Windows Server 2016机器的构建版本,例如RS1或RS3。有一个API可以做到这一点-GetVersionEx()-但现在已弃用。

MSDN表示使用版本助手功能。

我想要构建版本,for ex:1607对于RS1。

是否有API可以得到?

选项0 :(每个rbmm)从驱动程序开发套件中使用[rtlgetversion]。

选项1:[更新]抓住像kernel32.dll这样的系统dll的版本号。MSDN曾经祝福这种方法,说:

要获取操作系统的完整版本号,请在一个系统dll上拨打getFileVersionInfo函数,例如kernel32.dll,然后致电VerqueryValue获取文件版本信息的 stringfileinfo \ productversion子block。[来自2017年MSDN的Internet档案快照]

看起来像这样的东西:

// Quick hack without error checking.
#include <cassert>
#include <iomanip>
#include <iostream>
#include <vector>
#include <Windows.h>
int main() {
  const auto system = L"kernel32.dll";
  DWORD dummy;
  const auto cbInfo =
      ::GetFileVersionInfoSizeExW(FILE_VER_GET_NEUTRAL, system, &dummy);
  std::vector<char> buffer(cbInfo);
  ::GetFileVersionInfoExW(FILE_VER_GET_NEUTRAL, system, dummy,
                          buffer.size(), &buffer[0]);
  void *p = nullptr;
  UINT size = 0;
  ::VerQueryValueW(buffer.data(), L"\", &p, &size);
  assert(size >= sizeof(VS_FIXEDFILEINFO));
  assert(p != nullptr);
  auto pFixed = static_cast<const VS_FIXEDFILEINFO *>(p);
  std::cout << HIWORD(pFixed->dwFileVersionMS) << '.'
            << LOWORD(pFixed->dwFileVersionMS) << '.'
            << HIWORD(pFixed->dwFileVersionLS) << '.'
            << LOWORD(pFixed->dwFileVersionLS) << 'n';
  return 0;
}

请注意,原始MSDN链接现在将其重定向到不提及此方法的较新文档集。我想这意味着这不再是一项受支持的技术,大概,所有旧代码的兼容性黑客攻击可能会阻止应用程序获得实际答案。

选项2:特别是查询注册表:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion

具有CurrentMajorVersionNumberCurrentMinorVersionNumberCurrentBuildNumber的值。

我找不到这些值的官方文档,因此可能不会被MSDN批准或未来。

选项3:如果可用,请使用getProductInfo,如果不是。