哪位大侠帮忙写个组件以获得客户端硬盘的序列号?

解决方案 »

  1.   

    //取硬盘序列号
    var
         VolumeSerialNumber : DWORD;
         MaximumComponentLength : DWORD;
         FileSystemFlags : DWORD;
    begin
         GetVolumeInformation('c:\',nil,0,@VolumeSerialNumber,MaximumComponentLength,FileSystemFlags,nil,0);
         showmessage(inttostr(Volumeserialnumber));
    end;
      

  2.   

    //取得硬盘序号
    function GetHDSerialNumber:LongInt;
    {$IFDEF WIN32}
    var
      pdw : pDWord;
      mc, fl : Dword;
    {$ENDIF}
    begin
      {$IFDEF WIN32}
      New(pdw);
      GetVolumeInformation(nil,nil,0,pdw,mc,fl,nil,0);
      Result := pdw^ ;
      Dispose(pdw);
      {$ELSE}
      Result := GetWinFlags;
      {$ENDIF}
    end;
      

  3.   

    做成ActiveX获取,然后再传给服务器。
      

  4.   

    GetVolumeInformation 获得的序列号在格式化硬盘后就变了,因为这不是真正意义的出厂序列号
      

  5.   

    GetVolumeInformation 获得的序列号在格式化硬盘后就变了,因为这不是真正意义的出厂序列号
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Button2: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function GetIdeDiskSerialNumber:shortString;
    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
    edit1.text:=GetIdeDiskSerialNumber;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
    VolumeSerialNumber : DWORD;
    MaximumComponentLength : DWORD;
    FileSystemFlags : DWORD;
    SerialNumber : string;
    begin
    GetVolumeInformation('d:\',
    nil,
    0,
    @VolumeSerialNumber,
    MaximumComponentLength,
    FileSystemFlags,
    nil,
    0);
    SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) +
    '-' +
    IntToHex(LoWord(VolumeSerialNumber), 4);
    Memo1.Lines.Add(SerialNumber);
    end;
    end.//应该没问题了
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Button2: TButton;
        Label1: TLabel;
        Button3: TButton;
        procedure Button3Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button3Click(Sender: TObject);
    var
       a,b:dword;
       serialNum:Dword;
    begin
       GetVolumeInformation('c:\',nil,0,@SerialNum, a, b, nil, 0);
       Edit1.Text:=inttohex(SerialNum,8);
    end;procedure TForm1.Button1Click(Sender: TObject);const
      N=33;
      e=3;
      d=7;
    var
      i,Y,tem_y:integer;
      str,str1:string;
    begin
      str:=inttostr(strtoint('$'+edit1.text));
      while not(str='') do
        begin
          tem_y:=strtoint(copy(str,1,2));
          if tem_y>=N then
           begin
             tem_y:=strtoint(copy(inttostr(tem_y),1,1));
             str:=copy(str,2,length(str));
           end
           else
           begin
            str:=copy(str,3,length(str));
           end;
           y:=1;
           for i:=1 to e do
           begin
             y:=y*tem_y;
           end;
           y:=y mod N;
           str1:=trim(str1)+inttostr(Y);
        end;
        edit1.text:=str1;
    end;procedure TForm1.Button2Click(Sender: TObject);
    const
      N=33;
      e=3;
      d=7;
    var
      i,x,x1,x2,tem_x:integer;
      str,str1:string;
    begin
      str:=edit1.text;
      while not(str='') do
        begin
          tem_x:=strtoint(copy(str,1,2));
          if tem_x>=N then
           begin
             tem_x:=strtoint(copy(inttostr(tem_x),1,1));
             str:=copy(str,2,length(str));
           end
           else
           begin
            str:=copy(str,3,length(str));
           end;
           x1:=1;
           x2:=1;
           for i:=1 to 4 do
           begin
             x1:=x1*tem_x;
           end;
           x1:=x1 mod N;
           for i:=1 to 3 do
           begin
             x2:=x2*tem_x;
           end;
           x2:=x2 mod N;
           x:=(x1*x2) mod N;
           str1:=trim(str1)+inttostr(x);
        end;
        edit1.text:=inttohex(strtoint(str1),8);
    end;end.
    procedure TForm1.FormShow(Sender: TObject);
    var
      Reg: TRegistry;
      iCount:integer;
    begin
      RegStr:='未注册';
      Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_CURRENT_USER;    if  (Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\RunOnce\AppTest', false))=false then
        if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\RunOnce', True) then
        begin
          Reg.CreateKey('AppTest');
          Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\RunOnce\AppTest', True);
          Reg.WriteString('AppCount','1');
        end;
          iCount:=strtoint(Reg.ReadString('AppCount'));
          Reg.CloseKey;
      finally
        Reg.Free;
        inherited;
    end;
      if (iCount>=5) then
      begin
         showmessage('试用次数已到!');
         close;
      end;
       if (iCount=0) then
         self.RegStr:='已注册';
       self.Caption:='注册表的操作实例(Delphi 6.0)--'+RegStr ;end;