在Windows 2008 R2 SP1上使用GetVersionEx时错误的行为

Incorrect behavior while using GetVersionEx on Windows 2008 R2 SP1

本文关键字:GetVersionEx 错误 2008 Windows R2 SP1      更新时间:2023-10-16

我想检查一下Windows操作系统的版本是否为Windows 2008或以上。我正在使用下面的代码,它在我的环境中工作得很好,但是有人(客户)报告说它不能在他们的生产操作系统环境中工作,但可以在其他有Windows 2008 R2 SP1的系统上工作。它不工作意味着它返回false,即使在情况下操作系统是Windows 2008 R2 SP1。代码有什么问题?

bool CheckIfOperatingISWindowsServer2K8orAbove()
{
  OSVERSIONINFOEX winOSInfo;
  winOSInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
  GetVersionEx(&winOSInfo);
  //Check if windows version is 6 (i.e longhorn) and its windows server 
  if( winOSInfo.dwPlatformId==VER_PLATFORM_WIN32_NT && winOSInfo.dwMajorVersion == 6 && winOSInfo.wProductType == VER_NT_SERVER)
  {
     if ( winOSInfo.dwMinorVersion == 0 || winOSInfo.dwMinorVersion == 1 ) 
      return true;  
  }
  return false;
}

我认为唯一缺失的部分是不初始化winOSInfo值0使用zerommemory (&winfo, sizeof(OSVERSIONINFOEX));

你的意见是什么?您认为没有初始化OSVERSIONINFOEX结构会导致这种问题吗?

你能和你的客户确认一下他们的服务器2008 R2是否被配置为域控制器吗?

因为在结构OSVERSIONINFOEX的文档中,在wProductType/VER_NT_SERVER:

请注意,作为域控制器的服务器被报告为VER_NT_DOMAIN_CONTROLLER,而不是VER_NT_SERVER。

在这种情况下,您的代码将不会给出预期的结果。