如题!类似windowsXP一样!
要读哪些硬件信息才能做到这一点呢?

解决方案 »

  1.   

    同意楼上,不过CPU只有部分PIII才有一个序列号,而其它类型的需要特殊处理才能获得一个唯一的编号。不过网卡肯定一个全球唯一的序号,硬盘也有一个唯一的编号。
      

  2.   

    网卡可能经常换,不可以的。
    要用CPU和硬盘ID号结合,本人就是用这样来加密我的软件的。
      

  3.   

    (CPU + 硬盘) * 一系算法 := 唯一序列加
      

  4.   

    列位老大能不能告诉我怎么读这些信息在Windows系统里?
      

  5.   

    读硬盘的 序列号!我见过几个 朋友都用这个方法
    源代码
    unit Unit1; interface uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Label1: TLabel; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; var 
    Form1: TForm1; implementation {$R *.dfm} function GetIdeDiskSerialNumber : String; 
    type 
    TSrbIoControl = packed record 
    HeaderLength : ULONG; 
    Signature : Array[0..7] of Char; 
    Timeout : ULONG; 
    ControlCode : ULONG; 
    ReturnCode : ULONG; 
    Length : ULONG; 
    end; 
    SRB_IO_CONTROL = TSrbIoControl; 
    PSrbIoControl = ^TSrbIoControl; 
    TIDERegs = packed record 
    bFeaturesReg : Byte; // Used for specifying SMART "commands". 
    bSectorCountReg : Byte; // IDE sector count register 
    bSectorNumberReg : Byte; // IDE sector number register 
    bCylLowReg : Byte; // IDE low order cylinder value 
    bCylHighReg : Byte; // IDE high order cylinder value 
    bDriveHeadReg : Byte; // IDE drive/head register 
    bCommandReg : Byte; // Actual IDE command. 
    bReserved : Byte; // reserved. Must be zero. 
    end; 
    IDEREGS = TIDERegs; 
    PIDERegs = ^TIDERegs; 
    TSendCmdInParams = packed record 
    cBufferSize : DWORD; 
    irDriveRegs : TIDERegs; 
    bDriveNumber : Byte; 
    bReserved : Array[0..2] of Byte; 
    dwReserved : Array[0..3] of DWORD; 
    bBuffer : Array[0..0] of Byte; 
    end; 
    SENDCMDINPARAMS = TSendCmdInParams; 
    PSendCmdInParams = ^TSendCmdInParams; 
    TIdSector = packed record 
    wGenConfig : Word; 
    wNumCyls : Word; 
    wReserved : Word; 
    wNumHeads : Word; 
    wBytesPerTrack : Word; 
    wBytesPerSector : Word; 
    wSectorsPerTrack : Word; 
    wVendorUnique : Array[0..2] of Word; 
    sSerialNumber : Array[0..19] of Char; 
    wBufferType : Word; 
    wBufferSize : Word; 
    wECCSize : Word; 
    sFirmwareRev : Array[0..7] of Char; 
    sModelNumber : Array[0..39] of Char; 
    wMoreVendorUnique : Word; 
    wDoubleWordIO : Word; 
    wCapabilities : Word; 
    wReserved1 : Word; 
    wPIOTiming : Word; 
    wDMATiming : Word; 
    wBS : Word; 
    wNumCurrentCyls : Word; 
    wNumCurrentHeads : Word; 
    wNumCurrentSectorsPerTrack : Word; 
    ulCurrentSectorCapacity : ULONG; 
    wMultSectorStuff : Word; 
    ulTotalAddressableSectors : ULONG; 
    wSingleWordDMA : Word; 
    wMultiWordDMA : Word; 
    bReserved : Array[0..127] of Byte; 
    end; 
    PIdSector = ^TIdSector; 
    const 
    IDE_ID_FUNCTION = $EC; 
    IDENTIFY_BUFFER_SIZE = 512; 
    DFP_RECEIVE_DRIVE_DATA = $0007c088; 
    IOCTL_SCSI_MINIPORT = $0004d008; 
    IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501; 
    DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE; 
    BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize; 
    W9xBufferSize = IDENTIFY_BUFFER_SIZE+16; 
    var 
    hDevice : THandle; 
    cbBytesReturned : DWORD; 
    pInData : PSendCmdInParams; 
    pOutData : Pointer; // PSendCmdOutParams 
    Buffer : Array[0..BufferSize-1] of Byte; 
    srbControl : TSrbIoControl absolute Buffer; procedure ChangeByteOrder( var Data; Size : Integer ); 
    var 
    ptr : PChar; 
    i : Integer; 
    c : Char; 
    begin 
    ptr := @Data; 
    for i := 0 to (Size shr 1)-1 do 
    begin 
    c := ptr^; 
    ptr^ := (ptr+1)^; 
    (ptr+1)^ := c; 
    Inc(ptr,2); 
    end; 
    end; begin 
    Result := ''; 
    FillChar(Buffer,BufferSize,#0); 
    if Win32Platform=VER_PLATFORM_WIN32_NT then 
    begin // Windows NT, Windows 2000 
    // Get SCSI port handle 
    hDevice := CreateFile( '\\.\Scsi0:', 
    GENERIC_READ or GENERIC_WRITE, 
    FILE_SHARE_READ or FILE_SHARE_WRITE, 
    nil, OPEN_EXISTING, 0, 0 ); 
    if hDevice=INVALID_HANDLE_VALUE then Exit; 
    try 
    srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); 
    System.Move('SCSIDISK',srbControl.Signature,8); 
    srbControl.Timeout := 2; 
    srbControl.Length := DataSize; 
    srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; 
    pInData := PSendCmdInParams(PChar(@Buffer) 
    +SizeOf(SRB_IO_CONTROL)); 
    pOutData := pInData; 
    with pInData^ do 
    begin 
    cBufferSize := IDENTIFY_BUFFER_SIZE; 
    bDriveNumber := 0; 
    with irDriveRegs do 
    begin 
    bFeaturesReg := 0; 
    bSectorCountReg := 1; 
    bSectorNumberReg := 1; 
    bCylLowReg := 0; 
    bCylHighReg := 0; 
    bDriveHeadReg := $A0; 
    bCommandReg := IDE_ID_FUNCTION; 
    end; 
    end; 
    if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, 
    @Buffer, BufferSize, @Buffer, BufferSize, 
    cbBytesReturned, nil ) then Exit; 
    finally 
    CloseHandle(hDevice); 
    end; 
    end else 
    begin // Windows 95 OSR2, Windows 98 
    hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, 
    CREATE_NEW, 0, 0 ); 
    if hDevice=INVALID_HANDLE_VALUE then Exit; 
    try 
    pInData := PSendCmdInParams(@Buffer); 
    pOutData := @pInData^.bBuffer; 
    with pInData^ do 
    begin 
    cBufferSize := IDENTIFY_BUFFER_SIZE; 
    bDriveNumber := 0; 
    with irDriveRegs do 
    begin 
    bFeaturesReg := 0; 
    bSectorCountReg := 1; 
    bSectorNumberReg := 1; 
    bCylLowReg := 0; 
    bCylHighReg := 0; 
    bDriveHeadReg := $A0; 
    bCommandReg := IDE_ID_FUNCTION; 
    end; 
    end; 
    if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, 
    pInData, SizeOf(TSendCmdInParams)-1, pOutData, 
    W9xBufferSize, cbBytesReturned, nil ) then Exit; 
    finally 
    CloseHandle(hDevice); 
    end; 
    end; 
    with PIdSector(PChar(pOutData)+16)^ do 
    begin 
    ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); 
    SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); 
    end; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    Label1.Caption:=GetIdeDiskSerialNumber; 
    end; end. 
      

  6.   

    整理了一个。再贴一下:我的是:T2HQBDLC,不知对不对,在哪里查我的硬盘吗?
    _____________________________________unit Unit1;interface uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; type 
      TForm1 = class(TForm)
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
      { Private declarations }
      public
      { Public declarations }
    end;var
      Form1: TForm1;implementation {$R *.dfm} function GetIdeDiskSerialNumber : String; 
      type
        TSrbIoControl = packed record
          HeaderLength : ULONG;
          Signature : Array[0..7] of Char;
          Timeout : ULONG;
          ControlCode : ULONG;
          ReturnCode : ULONG;
          Length : ULONG;
        end;    SRB_IO_CONTROL = TSrbIoControl;
        PSrbIoControl = ^TSrbIoControl;    TIDERegs = packed record
          bFeaturesReg : Byte; // Used for specifying SMART "commands".
          bSectorCountReg : Byte; // IDE sector count register
          bSectorNumberReg : Byte; // IDE sector number register
          bCylLowReg : Byte; // IDE low order cylinder value
          bCylHighReg : Byte; // IDE high order cylinder value
          bDriveHeadReg : Byte; // IDE drive/head register
          bCommandReg : Byte; // Actual IDE command.
          bReserved : Byte; // reserved. Must be zero.
        end;    IDEREGS = TIDERegs;
        PIDERegs = ^TIDERegs;    TSendCmdInParams = packed record
          cBufferSize : DWORD;
          irDriveRegs : TIDERegs;
          bDriveNumber : Byte;
          bReserved : Array[0..2] of Byte;
          dwReserved : Array[0..3] of DWORD;
          bBuffer : Array[0..0] of Byte;
        end;    SENDCMDINPARAMS = TSendCmdInParams;
        PSendCmdInParams = ^TSendCmdInParams;    TIdSector = packed record
          wGenConfig : Word;
          wNumCyls : Word;
          wReserved : Word;
          wNumHeads : Word;
          wBytesPerTrack : Word;
          wBytesPerSector : Word;
          wSectorsPerTrack : Word;
          wVendorUnique : Array[0..2] of Word;
          sSerialNumber : Array[0..19] of Char;
          wBufferType : Word;
          wBufferSize : Word;
          wECCSize : Word;
          sFirmwareRev : Array[0..7] of Char;
          sModelNumber : Array[0..39] of Char;
          wMoreVendorUnique : Word;
          wDoubleWordIO : Word;
          wCapabilities : Word;
          wReserved1 : Word;
          wPIOTiming : Word;
          wDMATiming : Word;
          wBS : Word;
          wNumCurrentCyls : Word;
          wNumCurrentHeads : Word;
          wNumCurrentSectorsPerTrack : Word;
          ulCurrentSectorCapacity : ULONG;
          wMultSectorStuff : Word;
          ulTotalAddressableSectors : ULONG;
          wSingleWordDMA : Word;
          wMultiWordDMA : Word;
          bReserved : Array[0..127] of Byte;
        end;    PIdSector = ^TIdSector;  const
        IDE_ID_FUNCTION = $EC;
        IDENTIFY_BUFFER_SIZE = 512;
        DFP_RECEIVE_DRIVE_DATA = $0007c088;
        IOCTL_SCSI_MINIPORT = $0004d008;
        IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
        DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
        BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
        W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
      var
        hDevice : THandle;
        cbBytesReturned : DWORD;
        pInData : PSendCmdInParams;
        pOutData : Pointer; // PSendCmdOutParams
        Buffer : Array[0..BufferSize-1] of Byte;
        srbControl : TSrbIoControl absolute Buffer;  procedure ChangeByteOrder( var Data; Size : Integer );
        var
          ptr : PChar;
          i : Integer;
          c : Char;
      begin
        ptr := @Data;
        for i := 0 to (Size shr 1)-1 do
        begin
          c := ptr^;
          ptr^ := (ptr+1)^;
          (ptr+1)^ := c;
          Inc(ptr,2);
        end;
      end;begin 
      Result := '';
      FillChar(Buffer,BufferSize,#0);  if Win32Platform=VER_PLATFORM_WIN32_NT then
      begin // Windows NT, Windows 2000
        // Get SCSI port handle
        hDevice := CreateFile( '\\.\Scsi0:',
                              GENERIC_READ or GENERIC_WRITE,
                              FILE_SHARE_READ or FILE_SHARE_WRITE,
                              nil, OPEN_EXISTING, 0, 0 );    if hDevice=INVALID_HANDLE_VALUE then Exit;    try
          srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
          System.Move('SCSIDISK',srbControl.Signature,8);
          srbControl.Timeout := 2;
          srbControl.Length := DataSize;
          srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
          pInData := PSendCmdInParams(PChar(@Buffer)
          +SizeOf(SRB_IO_CONTROL));
          pOutData := pInData;
          with pInData^ do
          begin
            cBufferSize := IDENTIFY_BUFFER_SIZE;
            bDriveNumber := 0;
            with irDriveRegs do
            begin
              bFeaturesReg := 0;
              bSectorCountReg := 1;
              bSectorNumberReg := 1;
              bCylLowReg := 0;
              bCylHighReg := 0;
              bDriveHeadReg := $A0;
              bCommandReg := IDE_ID_FUNCTION;
            end;
          end;
          if not DeviceIoControl(
                                 hDevice,
                                 IOCTL_SCSI_MINIPORT,
                                 @Buffer,
                                 BufferSize,
                                 @Buffer,
                                 BufferSize,
                                 cbBytesReturned,
                                 nil ) then Exit;
        finally
          CloseHandle(hDevice);
        end;
      end
      else
      begin // Windows 95 OSR2, Windows 98
        hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil,CREATE_NEW, 0, 0 );
        if hDevice=INVALID_HANDLE_VALUE then Exit;    try
          pInData := PSendCmdInParams(@Buffer);
          pOutData := @pInData^.bBuffer;
          with pInData^ do
          begin
            cBufferSize := IDENTIFY_BUFFER_SIZE;
            bDriveNumber := 0;
            with irDriveRegs do
            begin
              bFeaturesReg := 0;
              bSectorCountReg := 1;
              bSectorNumberReg := 1;
              bCylLowReg := 0;
              bCylHighReg := 0;
              bDriveHeadReg := $A0;
              bCommandReg := IDE_ID_FUNCTION;
            end;
          end;
          if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
            pInData, SizeOf(TSendCmdInParams)-1, pOutData,
            W9xBufferSize, cbBytesReturned, nil ) then Exit;
        finally
          CloseHandle(hDevice);
        end;
      end;  with PIdSector(PChar(pOutData)+16)^ do
      begin
        ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
        SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
      end;
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin
      Label1.Caption:=GetIdeDiskSerialNumber;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Label1.Caption:=GetIdeDiskSerialNumber;
    end;end.
      

  7.   

    在感谢楼上的兄弟了读出来了,不过好象跟你的不一样嘛,我的是一串的数字!而且这个unit里还会报一个错误:找不到Variants单元,是不是版本的问题,我用的是Delphi5,不过去掉就好了!多谢!