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;