【问题标题】:Incorrect behavior while using GetVersionEx on Windows 2008 R2 SP1在 Windows 2008 R2 SP1 上使用 GetVersionEx 时行为不正确
【发布时间】:2011-12-14 05:27:56
【问题描述】:

我想检查 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 结构会导致此类问题吗?

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 它工作得很好。对于域控制器 wProductType 返回为 VER_NT_DOMAIN_CONTROLLER。谢谢我现在已经解决了这个问题。
    • @Rahul:显而易见的事情是检查winOSInfo.wProductType != VER_NT_WORKSTATION
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2011-01-17
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多