Неверное поведение при использовании GetVersionEx в Windows 2008 R2 SP1 - PullRequest
2 голосов
/ 14 декабря 2011

Я хочу проверить, является ли версия операционной системы 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 с помощью ZeroMemory (& winfo, sizeof (OSVERSIONINFOEX));

Каково ваше мнение?Как вы думаете, не инициализация структуры OSVERSIONINFOEX вызывает такие проблемы?

Заранее спасибо.

1 Ответ

4 голосов
/ 14 декабря 2011

Не могли бы вы уточнить у своего клиента, настроен ли его сервер 2008 R2 в качестве контроллера домена?

Потому что в документации структуры OSVERSIONINFOEX указано, в wProductType / VER_NT_SERVER:

Обратите внимание, что сервер, который также является контроллером домена, указывается как VER_NT_DOMAIN_CONTROLLER, а не VER_NT_SERVER.

И в этом случае ваш код не даст ожидаемого результата.

...