Home » Tipps & Tricks » System » Systemeigenschaften » Windows-Version ermitteln

Windows-Version ermitteln

Dieser Artikel zeigt, wie die verwendete Windows-Version ermittelt werden kann. Dafür wird die Systemfunktion GetVersionEx verwendet. Ab Windows 2000 können weitergehende Informationen mit der Struktur OSVERSIONINFOEX abgerufen werden. Für ältere Windows-Versionen wird auf die Struktur OSVERSIONINFO zurückgegriffen.
Als erstes müssen die neue Struktur, verwendete Konstanten und Systemfunktionen bekannt gemacht werden:

type
  //http://msdn2.microsoft.com/en-us/library/ms724833.aspx
  TOSVersionInfoEx = packed record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion      : DWORD;
    dwMinorVersion      : DWORD;
    dwBuildNumber       : DWORD;
    dwPlatformId        : DWORD;
    szCSDVersion        : array[0..127] of Char;
    wServicePackMajor   : WORD;
    wServicePackMinor   : WORD;
    wSuiteMask          : WORD;
    wProductType        : BYTE;
    wReserved           : BYTE;
  end;

const
  VER_SUITE_PERSONAL  = $00000200;
  VER_NT_WORKSTATION  = $00000001;
  VER_SUITE_WH_SERVER = $00008000;
  SM_SERVERR2         = 89;

function GetOSVersionEx(var lpVersionInformation: TOSVersionInfoEx): BOOL; stdcall; external kernel32 name 
'GetVersionExA';

Eine Hilfsfunktion fragt die Systeminformationen ab:

function GetOSVersionInfoEx : TOSVersionInfoEx;
var
  OSVersionInfo   : TOSVersionInfo absolute Result;
  Done : Boolean;
begin
  FillChar(Result, SizeOf(Result), #0);
  Done := False;
  try
    Result.dwOSVersionInfoSize := SizeOf(TOSVersionInfoEx);
    Done := GetOSVersionEx(Result);
  except
  end;
  if not(Done) then
  begin
    try
      FillChar(Result, SizeOf(Result), #0);
      Result.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
      Done := GetVersionEx(OSVersionInfo);
    except
    end;
  end;
end;

Folgende Funktion ordnet diese Informationen einem entsprechenden Betriebssystem zu:

procedure GetWinVersionAll(var OSVersionInfo: TOSVersionInfoEx;
                           var VersionString: String;
                           var VersionTyp   : TWinVersionTyp);
begin
  VersionString := 'Unbekannte Windows-Version';
  OsVersionInfo := GetOSVersionInfoEx;

  case OsVersionInfo.dwPlatformId of
    VER_PLATFORM_WIN32s:
    begin
      VersionString := 'Win32s';
      VersionTyp    := wvWin32s;
    end;

    VER_PLATFORM_WIN32_WINDOWS:
    begin
      if (OsVersionInfo.dwMajorVersion = 4) and (OsVersionInfo.dwMinorVersion =  0) then
        begin
             VersionString := 'Windows 95';
             VersionTyp    := wvWin95;
        end;
      if (OsVersionInfo.dwMajorVersion = 4) and (OsVersionInfo.dwMinorVersion = 10) then
        begin
             VersionString := 'Windows 98';
             VersionTyp    := wvWin98
        end;
      if (OsVersionInfo.dwMajorVersion = 4) and (OsVersionInfo.dwMinorVersion = 90) then
        begin
             VersionString := 'Windows Millennium Edition';
             VersionTyp    := wvWinME;
        end;
    end;

    VER_PLATFORM_WIN32_NT:
    begin
      if (OsVersionInfo.dwMajorVersion = 4) and (OsVersionInfo.dwMinorVersion = 0) then
        begin
             VersionString := 'Windows NT';
             VersionTyp    := wvWinServerNT;
        end;
      if (OsVersionInfo.dwMajorVersion = 5) and (OsVersionInfo.dwMinorVersion = 0) then
        begin
             VersionString := 'Windows 2000';
             VersionTyp    := wvWin2000;
        end;
      if (OsVersionInfo.dwMajorVersion = 5) and (OsVersionInfo.dwMinorVersion = 1) then
        begin
             VersionString := 'Windows XP';
             VersionTyp    := wvWinXP
        end;

      if (OsVersionInfo.dwMajorVersion = 5) and (OsVersionInfo.dwMinorVersion = 2) then
      begin
        if GetSystemMetrics(SM_SERVERR2)  0 then
          begin
                VersionString := 'Windows Server 2003 "R2"';
                VersionTyp    := wvWinServer2003R2;
          end
         else
           if (OsVersionInfo.wProductType = VER_NT_WORKSTATION) then
             begin
                  VersionString := 'Windows XP x64';
                  VersionTyp    := wvWinXPx64
             end
           else
             if OsVersionInfo.wSuiteMask = VER_SUITE_WH_SERVER then
               begin
                    VersionString := 'Windows Home Server';
                    VersionTyp    := wvWinServerHomeServer;
               end
             else
               begin
                    VersionString := 'Windows Server 2003';
                    VersionTyp    := wvWinServer2003;
               end;
      end;
      if (OsVersionInfo.dwMajorVersion = 6) and (OsVersionInfo.dwMinorVersion = 0) then
      begin
        if (OsVersionInfo.wProductType = VER_NT_WORKSTATION) then
          begin
               VersionString := 'Windows Vista';
               VersionTyp    := wvWinVista
          end
        else
          begin
               VersionString := 'Windows Server 2008';
               VersionTyp    := wvWinServer2008;
          end;
      end;
      if (OsVersionInfo.dwMajorVersion = 6) and (OsVersionInfo.dwMinorVersion = 1) then
      begin
        if (OsVersionInfo.wProductType = VER_NT_WORKSTATION) then
          begin
               VersionString := 'Windows 7';
               VersionTyp    := wvWin7
          end
        else
          begin
               VersionString := 'Windows Server 2008 R2';
               VersionTyp    := wvWinServer2008R2;
          end;
      end;

      if (OsVersionInfo.dwMajorVersion = 6) and (OsVersionInfo.dwMinorVersion = 2) then
      begin
        if (OsVersionInfo.wProductType = VER_NT_WORKSTATION) then
          begin
               VersionString := 'Windows 8';
               VersionTyp    := wvWin8
          end
        else
          begin
               VersionString := 'Windows Server 2012';
               VersionTyp    := wvWinServer2012;
          end;
      end;

      if (OsVersionInfo.wSuiteMask and VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL then
        VersionString := VersionString + ' Home Edition'
      else
        VersionString := VersionString + ' Professional';
    end;
  end;
  VersionString := Trim(VersionString + ' ' + OsVersionInfo.szCSDVersion);
end;

Folgende Funktionen bedienen sich obiger Funktion und liefern verschiedene Datentypen zurück:

Eine Dokumentation zu den verwendeten Versionsnummer befindet sich im MSDN. Diese Liste wird mit neuen Windows-Versionen ergänzt. Damit lässt sich die Funktion GetWinVersion leicht erweitern und vervollständigen.
Alternativ können auch die globalen Variablen aus der Unit SysUtils verwendet werden, worüber sich die Produktlinie (Win32Platform – W9X oder NT), die Major (Win32MajorVersion), Minor (Win32MinorVersion), sowie die Buildnummer (Win32BuildNumber) ermitteln lassen. Eine weitere Variable enthält Informationen über evtl. installierte Servicepacks (Win32CSDVersion). Eine ähnliche Funktion befindet sich auch in der JCL in der Unit JCLSysInfo und trägt den Namen GetWindowsVersion bzw. GetWindowsVersionString.

type
  TWinVersionTyp = (wvWin32s, wvWin95, wvWin98, wvWinME, wvWinServerNT, wvWin2000,
                    wvWinXP, wvWinServer2003, wvWinServer2003R2, wvWinXPx64,
                    wvWinServerHomeServer, wvWinVista, wvWinServer2008, wvWin7,
                    wvWinServer2008R2, wvWin8, wvWinServer2012);


function GetWinVersionStruct : TOSVersionInfoEx;
var
  VersionString : String;
  VersionType : TWinVersionTyp;
begin
  GetWinVersionAll(Result, VersionString, VersionType);
end;


function GetWinVersionString : string;
var
  OSInfo : TOSVersionInfoEx;
  VersionType : TWinVersionTyp;
begin
  GetWinVersionAll(OSInfo, Result, VersionType);
end;


function GetWinVersionType : TWinVersionTyp;
var
  OSInfo : TOSVersionInfoEx;
  VersionString : String;
begin
  GetWinVersionAll(OSInfo, VersionString, Result);
end;

Zudem kann man über folgende Funktion abfragen, ob es sich um einen Windows-Server handelt:

function IsWindowsServer: Boolean;
// returns true, if the program is running on a Windows Server Version
begin
  result := False;
  case GetWinVersionType of
       wvWinServerNT,
       wvWinServer2003, wvWinServer2003R2,
       wvWinServerHomeServer,
       wvWinServer2008, wvWinServer2008R2,
       wvWinServer2012:
       result := True;
  end;
end;
EKON 28