请问有那位高手知道怎么判断在程序中所在机器的操作系统是win98和win2000?

解决方案 »

  1.   

    判断操作系统,除了用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.
      

  2.   

    //判断操作系统
    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;
      

  3.   

    利用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.中华补天网
      

  4.   

    //下面的是别人帖子里的
    分辨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"
      

  5.   

    恩,再通过具体的主版本号,副版本号,以及创建号来判断是
    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我忘了
      

  6.   

    procedure 2
    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;
      

  7.   

    当前操作系统的版本
    如下 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;