在Windows 2008 R2 SP1上使用GetVersionEx时出现不正确的行为

时间:2011-12-14 05:27:56

标签: c++ windows winapi visual-c++ windows-server-2008-r2

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

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;
}

我认为只有缺少的部分不是使用ZeroMemory(& winfo,sizeof(OSVERSIONINFOEX))将winOSInfo初始化为值0;

你有什么看法?你认为不初始化OSVERSIONINFOEX结构会导致这类问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

您是否可以与您的客户核实他们的服务器2008 R2是否配置为域控制器?

因为在结构OSVERSIONINFOEX的文档中指出了它,在wProductType / VER_NT_SERVER中:

  

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

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