unreliable
через WinAPI можно так:
Код:

Type TOSVersion=(osUnknown, osUnknown9x, osUnknownNT, osWin95, osWin98, osWin98SE, osWinME, osWinNT, osWin2000, osXP);
function GetOSVersion : TOSVersion;
var osVerInfo : TOSVersionInfo;
*majorVer, minorVer : Integer; *
begin
*result := OsUnknown; *
*osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); *
*if GetVersionEx(osVerInfo) then * *
*begin * *
*majorVer := osVerInfo.dwMajorVersion; *
*minorVer := osVerInfo.dwMinorVersion; *
*case osVerInfo.dwPlatformId of * *
*VER_PLATFORM_WIN32_NT : *
*Case majorVer of *
*4:result := OsWinNT; *
*5:if minorVer=0 then result := OsWin2000 *
*else * *
*if minorVer=1 then result := OsXP else result := osUnknownNT; *
*else result := osUnknownNT; *
*end; {Case majorVer of} *
*
*VER_PLATFORM_WIN32_WINDOWS : *
*case majorVer of *
*4: Case minorVer of *
*0:result := OsWin95; *
*10: if osVerInfo.szCSDVersion[1] = 'A' then result := OsWin98SE else result := OsWin98; *
*90: result := OsWinME; *
*else result := osUnknown9x; * *
*end;{Case minorVer of} * *
*else result := osUnknown9x; * *
*end{case majorVer of} *
*else result := OsUnknown; *
*end;{case osVerInfo.dwPlatformId of} *
*end;{if GetVersionEx(osVerInfo) then} *
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
*case GetOSVersion of *
*osUnknown: Showmessage('Unknown'); *
*osWin95: Showmessage('Win95'); *
*osWin98: Showmessage('Win98'); *
*osWin98SE: Showmessage('Win98SE'); *
*osWinME: Showmessage('WinME'); *
*osWinNT: Showmessage('WinNT'); *
*osWin2000: Showmessage('Win2000'); *
*osXP: Showmessage('XP'); *
*end; *
end;
