判断操作系统,除了用API以外,Delphi已经提供了一个简单的方法:SystUtils单元有一个全局变量Win32PlatForm,你可以直接在代码里面判断它的值确认操作系统类型。它的值的含义如下:Value MeaningVER_PLATFORM_WIN32s System is Win32s. VER_PLATFORM_WIN32_WINDOWS System is Windows 95. VER_PLATFORM_WIN32_NT System is Windows NT.
//判断操作系统 function TFuncs.OsIs:Integer; begin case Win32Platform of VER_PLATFORM_WIN32s: Result:=32; VER_PLATFORM_WIN32_WINDOWS: Result:=98; VER_PLATFORM_WIN32_NT: Result:=2000; else Result:=0; end; end;
利用TTL值来鉴别操作系统.abu.一、关于PING的介绍PING命令来检查要到达的目标 IP 地址并记录结果。ping 命令显示目标是否响应以及接收答复所需的时间。如果在传递到目标过程中有错误,ping 命令将显示错误消息。ICMP ECHO(Type 8) 和ECHO Reply (Type 0) 我们使用一个ICMP ECHO数据包来探测主机地址 HOST B 是否存活(当然在主机没有被配置为过滤ICMP形式)通过简单的发送一个ICMP ECHO(Type 8)数据包到目标主机如果ICMP ECHO Reply(ICMP type 0)数据包 HOST A 可以接受到,说明主机是存活状态。如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。 +---------------------------------------------------------------+ | | | +-------+ +-------+ | | | | ICMP Echo Request | | | | | HOST | --------------------------> | HOST | | | | | | | | | | A | | B | | | | | <-------------------------- | | | | | | ICMP Echo Reply | | | | +-------+ +-------+ | | | +---------------------------------------------------------------+ 这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到。典型的例子C:\>ping 192.168.0.1Pinging 192.168.0.1 with 32 bytes of data:Reply from 192.168.0.1: bytes=32 time<10ms TTL=128 Reply from 192.168.0.1: bytes=32 time<10ms TTL=128 Reply from 192.168.0.1: bytes=32 time<10ms TTL=128 Reply from 192.168.0.1: bytes=32 time<10ms TTL=128Ping statistics for 192.168.0.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms二、注意TTLTTL:生存时间指定数据报被路由器丢弃之前允许通过的网段数量。TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。 使用PING时涉及到的 ICMP 报文类型一个为ICMP请求回显(ICMP Echo Request)一个为ICMP回显应答(ICMP Echo Reply) 三、TTL 字段值可以帮助我们识别操作系统类型。UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32当然,返回的TTL值是相同的但有些情况下有所特殊 LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64FreeBSD 4.1, 4.0, 3.4; Sun Solaris 2.5.1, 2.6, 2.7, 2.8; OpenBSD 2.6, 2.7, NetBSD HP UX 10.20 ICMP 回显应答的 TTL 字段值为 255Windows 95/98/98SE Windows ME ICMP 回显应答的 TTL 字段值为 32Windows NT4 WRKS Windows NT4 Server Windows 2000 ICMP 回显应答的 TTL 字段值为 128这样,我们就可以通过这种方法来辨别操作系统 TTL LINUX 64 WIN2K/NT 128 WINDOWS 系列 32 UNIX 系列 255经过测试的操作系统如下: LINUX Kernel 2.2.x, Kernel 2.4t1-6; FreeBSD 4.1,4.0,3.4; OpenBSD 2.7,2.6; NetBSD 1.4.2; Sun Solaris 2.5.1,2.6,2.7,2.8; HP-UX 10.20, 11.0; AIX 4.1, 3.2; Compaq Tru64 5.0; Irix 6.5.3,6.5.8; BSDI BSD/OS 4.0,3.1; Ultrix 4.2-4.5; OpenVMS 7.1-2; Windows 95/98/98SE/ME; Windows NT 4 Workstation SP3, SP4, SP6a; Windows NT 4 Server SP4; Windows 2000 Professional, Server, Advanced Server.附:ICMP报文的类型包括如下:ECHO (Request (Type 8), Reply (Type 0))--回显应答,Time Stamp (Request (Type 13), Reply (Type 14))--时间戳请求和应答,Information (Request (Type 15), Reply (Type16))--信息请求和应答,Address Mask (Request (Type 17), Reply (Type 18))--地址掩码请求和应答等 参考资料来源: WINDOWS 2K 系统帮助文件 http://www.sys-security.com.abu.中华补天网
//下面的是别人帖子里的 分辨Win2000的三个版本(Profession, Server, Advance Server)的操作系统$IFDEF WIN32} function GetVersionEx(lpOs : pointer) : BOOL; stdcall; external 'kernel32' name 'GetVersionExA'; {$ENDIF}procedure GetWindowsVersion(var Major : integer;var Minor :integer); var {$IFDEF WIN32} lpOS, lpOS2 : POsVersionInfo; {$ELSE} l : longint; {$ENDIF} begin {$IFDEF WIN32} GetMem(lpOS, SizeOf(TOsVersionInfo)); lpOs^.dwOSVersionInfoSize := SizeOf(TOsVersionInfo); while getVersionEx(lpOS) = false do begin GetMem(lpos2, lpos^.dwOSVersionInfoSize + 1); lpOs2^.dwOSVersionInfoSize := lpOs^.dwOSVersionInfoSize + 1; FreeMem(lpOs, lpOs^.dwOSVersionInfoSize); lpOS := lpOs2; end; Major := lpOs^.dwMajorVersion; Minor := lpOs^.dwMinorVersion; FreeMem(lpOs, lpOs^.dwOSVersionInfoSize); {$ELSE} l := GetVersion; Major := LoByte(LoWord(l)); Minor := HiByte(LoWord(l)); {$ENDIF} end;procedure TForm1.Button1Click(Sender: TObject); var Major : integer; Minor : integer; begin GetWindowsVersion(Major, Minor); Memo1.Lines.Add(IntToStr(Major)); Memo1.Lines.Add(IntToStr(Minor)); end; -------------------------------------------------------------------- if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then ShowMessage('win9x'); if Win32Platform = VER_PLATFORM_WIN32_NT then ShowMessage('winNT'); -------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var OS : TOSVersionInfo; begin OS.dwOSVersionInfoSize := sizeof(OS); GetVersionEx(OS); with OS do case dwPlatformId of VER_PLATFORM_WIN32s : label1.caption := 'Windows 3.1x/32s'; VER_PLATFORM_WIN32_WINDOWS : Begin if (dwMajorVersion = 4) and (dwMinorVersion > 0) then label1.caption := 'Windows 98' else label1.caption := 'Windows 95'; end; VER_PLATFORM_WIN32_NT : label1.caption := 'Windows NT' ; end; end; -------------------------------------------------------------------- Const cOsUnknown : Integer = -1; cOsWin95 : Integer = 0; cOsWin98 : Integer = 1; cOsWin98SE : Integer = 2; cOsWinME : Integer = 3; cOsWinNT : Integer = 4; cOsWin2000 : Integer = 5; cOsWhistler : Integer = 6;
Function GetOSVersion : Integer; Function GetOSName( OSCode : Integer ) : String; Function GetOSVersion : Integer; Var osVerInfo : TOSVersionInfo; majorVer, minorVer : Integer; Begin Result := cOsUnknown; osVerInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo ); If ( GetVersionEx( osVerInfo ) ) Then Begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; Case ( osVerInfo.dwPlatformId ) Of VER_PLATFORM_WIN32_NT : { Windows NT/2000 } Begin If ( majorVer <= 4 ) Then Result := cOsWinNT Else If ( ( majorVer = 5 ) And ( minorVer= 0 ) ) Then Result := cOsWin2000 Else If ( ( majorVer = 5) And ( minorVer = 1 ) ) Then Result := cOsWhistler Else Result := cOsUnknown; End; VER_PLATFORM_WIN32_WINDOWS : { Windows 9x/ME } Begin If ( ( majorVer = 4 ) And ( minorVer = 0 ) ) Then Result := cOsWin95 Else If ( ( majorVer = 4 ) And ( minorVer = 10 ) ) Then Begin If ( osVerInfo.szCSDVersion[ 1 ] = 'A' ) Then Result := cOsWin98SE Else Result := cOsWin98; End Else If ( ( majorVer = 4) And ( minorVer = 90 ) ) Then Result := cOsWinME Else Result := cOsUnknown; End; Else Result := cOsUnknown; End; End Else Result := cOsUnknown; End; Function GetOSName( OSCode : Integer ) : String; Begin If ( OSCode = cOsUnknown ) Then Result := '(sconosciuto)' Else If ( OSCode = cOsWin95 ) Then Result := 'Microsoft Windows 95' Else If ( OSCode = cOsWin98 ) Then Result := 'Microsoft Windows 98' Else If ( OSCode = cOsWin98SE ) Then Result := 'Microsoft Windows 98 Second Edition' Else If ( OSCode = cOsWinME ) Then Result := 'Microsoft Windows Millennium Edition' Else If ( OSCode = cOsWinNT ) Then Result := 'Microsoft Windows New Technology' Else If ( OSCode = cOsWin2000 ) Then Result := 'Microsoft Windows 2000 / NT 5' Else Result := 'Microsoft Windows'; End;***************************** 看看这个行不行? GetVersion取到的版本信息是一个整体,要取得某个主版本或者次版本很麻烦,用一个记录就可以简单解决了: procedure TForm1.Button1Click(Sender: TObject); Type TVersion = packed record WinVer, WinRev, DosRev, DosVer: byte; end; var V:Dword; begin V:=GetVersion; Label1.Caption :=Format('Windows Version:%d.%d,Dos Version:%d.%d',[TVersion(V).WinVer,TVersion(V).WinRev,Tversion(V).DosVer,TVersion(V).DosRev]); end;其实在Delphi5中有一些系统常量可以使用(在sysutils单元): Win32BuildNumber //Build版本号 Win32Platform //系统平台,2=Win32系统 Win32MajorVersion //主版本号 Win32MinorVersion //次版本号 Win32CSDVersion //其他版本信息,例如"Service Pack 2"
VER_PLATFORM_WIN32_WINDOWS System is Windows 95.
VER_PLATFORM_WIN32_NT System is Windows NT.
function TFuncs.OsIs:Integer;
begin
case Win32Platform of
VER_PLATFORM_WIN32s: Result:=32;
VER_PLATFORM_WIN32_WINDOWS: Result:=98;
VER_PLATFORM_WIN32_NT: Result:=2000;
else Result:=0;
end;
end;
| |
| +-------+ +-------+ |
| | | ICMP Echo Request | | |
| | HOST | --------------------------> | HOST | |
| | | | | |
| | A | | B | |
| | | <-------------------------- | | |
| | | ICMP Echo Reply | | |
| +-------+ +-------+ |
| |
+---------------------------------------------------------------+
这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到。典型的例子C:\>ping 192.168.0.1Pinging 192.168.0.1 with 32 bytes of data:Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128Ping statistics for 192.168.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms二、注意TTLTTL:生存时间指定数据报被路由器丢弃之前允许通过的网段数量。TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。 使用PING时涉及到的 ICMP 报文类型一个为ICMP请求回显(ICMP Echo Request)一个为ICMP回显应答(ICMP Echo Reply) 三、TTL 字段值可以帮助我们识别操作系统类型。UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32当然,返回的TTL值是相同的但有些情况下有所特殊 LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64FreeBSD 4.1, 4.0, 3.4;
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
OpenBSD 2.6, 2.7,
NetBSD
HP UX 10.20
ICMP 回显应答的 TTL 字段值为 255Windows 95/98/98SE
Windows ME
ICMP 回显应答的 TTL 字段值为 32Windows NT4 WRKS
Windows NT4 Server
Windows 2000
ICMP 回显应答的 TTL 字段值为 128这样,我们就可以通过这种方法来辨别操作系统 TTL
LINUX 64
WIN2K/NT 128
WINDOWS 系列 32
UNIX 系列 255经过测试的操作系统如下:
LINUX Kernel 2.2.x, Kernel 2.4t1-6; FreeBSD 4.1,4.0,3.4; OpenBSD 2.7,2.6; NetBSD
1.4.2; Sun Solaris 2.5.1,2.6,2.7,2.8; HP-UX 10.20, 11.0; AIX 4.1, 3.2; Compaq
Tru64 5.0; Irix 6.5.3,6.5.8; BSDI BSD/OS 4.0,3.1; Ultrix 4.2-4.5; OpenVMS 7.1-2;
Windows 95/98/98SE/ME; Windows NT 4 Workstation SP3, SP4, SP6a; Windows NT 4
Server SP4; Windows 2000 Professional, Server, Advanced Server.附:ICMP报文的类型包括如下:ECHO (Request (Type 8), Reply (Type 0))--回显应答,Time Stamp (Request (Type 13), Reply (Type 14))--时间戳请求和应答,Information (Request (Type 15), Reply (Type16))--信息请求和应答,Address Mask (Request (Type 17), Reply (Type 18))--地址掩码请求和应答等 参考资料来源:
WINDOWS 2K 系统帮助文件
http://www.sys-security.com.abu.中华补天网
分辨Win2000的三个版本(Profession, Server, Advance Server)的操作系统$IFDEF WIN32}
function GetVersionEx(lpOs : pointer) : BOOL; stdcall;
external 'kernel32' name 'GetVersionExA';
{$ENDIF}procedure GetWindowsVersion(var Major : integer;var Minor :integer);
var
{$IFDEF WIN32}
lpOS, lpOS2 : POsVersionInfo;
{$ELSE}
l : longint;
{$ENDIF}
begin
{$IFDEF WIN32}
GetMem(lpOS, SizeOf(TOsVersionInfo));
lpOs^.dwOSVersionInfoSize := SizeOf(TOsVersionInfo);
while getVersionEx(lpOS) = false do begin
GetMem(lpos2, lpos^.dwOSVersionInfoSize + 1);
lpOs2^.dwOSVersionInfoSize := lpOs^.dwOSVersionInfoSize + 1;
FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
lpOS := lpOs2;
end;
Major := lpOs^.dwMajorVersion;
Minor := lpOs^.dwMinorVersion;
FreeMem(lpOs, lpOs^.dwOSVersionInfoSize);
{$ELSE}
l := GetVersion;
Major := LoByte(LoWord(l));
Minor := HiByte(LoWord(l));
{$ENDIF}
end;procedure TForm1.Button1Click(Sender: TObject);
var
Major : integer;
Minor : integer;
begin
GetWindowsVersion(Major, Minor);
Memo1.Lines.Add(IntToStr(Major));
Memo1.Lines.Add(IntToStr(Minor));
end;
--------------------------------------------------------------------
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
ShowMessage('win9x');
if Win32Platform = VER_PLATFORM_WIN32_NT then
ShowMessage('winNT');
--------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
OS : TOSVersionInfo;
begin
OS.dwOSVersionInfoSize := sizeof(OS);
GetVersionEx(OS);
with OS do
case dwPlatformId of
VER_PLATFORM_WIN32s :
label1.caption := 'Windows 3.1x/32s';
VER_PLATFORM_WIN32_WINDOWS :
Begin
if (dwMajorVersion = 4) and (dwMinorVersion > 0) then
label1.caption := 'Windows 98'
else
label1.caption := 'Windows 95';
end;
VER_PLATFORM_WIN32_NT :
label1.caption := 'Windows NT' ;
end;
end;
--------------------------------------------------------------------
Const
cOsUnknown : Integer = -1;
cOsWin95 : Integer = 0;
cOsWin98 : Integer = 1;
cOsWin98SE : Integer = 2;
cOsWinME : Integer = 3;
cOsWinNT : Integer = 4;
cOsWin2000 : Integer = 5;
cOsWhistler : Integer = 6;
Function GetOSVersion : Integer;
Function GetOSName( OSCode : Integer ) : String;
Function GetOSVersion : Integer;
Var
osVerInfo : TOSVersionInfo;
majorVer, minorVer : Integer;
Begin
Result := cOsUnknown;
osVerInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
If ( GetVersionEx( osVerInfo ) ) Then Begin
majorVer := osVerInfo.dwMajorVersion;
minorVer := osVerInfo.dwMinorVersion;
Case ( osVerInfo.dwPlatformId ) Of
VER_PLATFORM_WIN32_NT : { Windows NT/2000 }
Begin
If ( majorVer <= 4 ) Then
Result := cOsWinNT
Else
If ( ( majorVer = 5 ) And ( minorVer= 0 ) ) Then
Result := cOsWin2000
Else
If ( ( majorVer = 5) And ( minorVer = 1 ) ) Then
Result := cOsWhistler
Else
Result := cOsUnknown;
End;
VER_PLATFORM_WIN32_WINDOWS : { Windows 9x/ME }
Begin
If ( ( majorVer = 4 ) And ( minorVer = 0 ) ) Then
Result := cOsWin95
Else If ( ( majorVer = 4 ) And ( minorVer = 10 ) ) Then Begin
If ( osVerInfo.szCSDVersion[ 1 ] = 'A' ) Then
Result := cOsWin98SE
Else
Result := cOsWin98;
End Else If ( ( majorVer = 4) And ( minorVer = 90 ) ) Then
Result := cOsWinME
Else
Result := cOsUnknown;
End;
Else
Result := cOsUnknown;
End;
End Else
Result := cOsUnknown;
End; Function GetOSName( OSCode : Integer ) : String;
Begin
If ( OSCode = cOsUnknown ) Then
Result := '(sconosciuto)'
Else If ( OSCode = cOsWin95 ) Then
Result := 'Microsoft Windows 95'
Else If ( OSCode = cOsWin98 ) Then
Result := 'Microsoft Windows 98'
Else If ( OSCode = cOsWin98SE ) Then
Result := 'Microsoft Windows 98 Second Edition'
Else If ( OSCode = cOsWinME ) Then
Result := 'Microsoft Windows Millennium Edition'
Else If ( OSCode = cOsWinNT ) Then
Result := 'Microsoft Windows New Technology'
Else If ( OSCode = cOsWin2000 ) Then
Result := 'Microsoft Windows 2000 / NT 5'
Else
Result := 'Microsoft Windows';
End;*****************************
看看这个行不行?
GetVersion取到的版本信息是一个整体,要取得某个主版本或者次版本很麻烦,用一个记录就可以简单解决了:
procedure TForm1.Button1Click(Sender: TObject);
Type
TVersion = packed record
WinVer,
WinRev,
DosRev,
DosVer: byte;
end;
var
V:Dword;
begin
V:=GetVersion;
Label1.Caption :=Format('Windows Version:%d.%d,Dos Version:%d.%d',[TVersion(V).WinVer,TVersion(V).WinRev,Tversion(V).DosVer,TVersion(V).DosRev]);
end;其实在Delphi5中有一些系统常量可以使用(在sysutils单元):
Win32BuildNumber //Build版本号
Win32Platform //系统平台,2=Win32系统
Win32MajorVersion //主版本号
Win32MinorVersion //次版本号
Win32CSDVersion //其他版本信息,例如"Service Pack 2"
windows 95还是windows 98
(Win32PlatForm=VER_PLATFORM_WIN32_WINDOWS)windows NT还是windows 2000
(Win32PlatForm=VER_PLATFORM_WIN32_NT)主版本号,副版本号以及创建号也有相应的全局量
Win32MajorVersion
Win32MinorVersion
Win32BuildNumber
具体号码多少是95/98 NT/2000我忘了
var ver:integer;//版本号 major:integer;//主版本号 minor:integer;//次版本号
begin
ver:=getversion();//获得版本号
major:=ver and 255;//获得主版本号
minor:=(ver and 255*256)div 256; //获得次版本号
showmessage(‘系统版本号是:’+inttostr(ver)); //显示版本号
showmessage(‘系统主版本号是:'+inttostr(major));//显示主版本号
showmessage(‘系统次版本号是:'+inttostr(minor));//显示次版本号
end;
如下 const SYSUN = -1; // 不知道 SYS31 = 0; // Win 3.1 SYS95 = 1; // Win 95 SYS98 = 2; // Win 98 SYSML = 3; // Windows Millenium SYSNT = 4; // Win NT SYS2K = 5; // WIN 2000 function GetOSVersion: integer;var sysVI: TosversionInfo;begin sysVI.dwOSVersionInfoSize := SizeOf(sysVI); GetVersionEx(sysVI); with sysVI do begin Result := SYSUN; case dwPlatFormID of 0: Result := SYS31; 1: begin case dwMinorVersion of 0: Result := SYS95; 10: Result := SYS98; 90: Result := SYSML; else Result := SYSUN; end; end; 2: case dwMajorVersion of 3, 4: Result := SYSNT; 5: Result := SYS2K; end; end; end;end;