在系统设计过程中,我想将某个用户绑定在某一台电脑上面,也就是说某个用户(如A用户)在登陆系统的时候只能在绑定的那一台电脑上使用系统,如果换到另一台机器则会禁止登陆(或是需要管理员重开登陆权限),这里是否有一种真正意义上的取"计算机唯一标识"的方法?
MAC可以更改,CPU序列号现在在赛扬系列产品中又大都相同,Inter产品中也只有P3,P4才会有```但也有相同的情况存在```
所以在此想请各位大虾帮下忙,思路或是代码都可以..小弟在线等待答复~`~
PS:一定要是取得一台计算机的唯一标识```任何其他电脑都不会有相同的情况存在的```

解决方案 »

  1.   

    一台计算机可以有多个使用者,但一台计算机只能有一个名字得到计算机器的名字用GetHostByName函数GetHostByName(buffer);
      

  2.   

    var
      buffer : array [0..63] of Char;
      phe: PHostEnt;
    begin
      GetHostName(buffer,SizeOf(buffer));
      phe := GetHostByName(buffer);
    end;
      

  3.   

    可用cpu\硬盘序列号\网卡序列号。重复的可能性为零,特别是在使用你的系统有限的用户内。
      

  4.   

    主板ID+CPUID+硬盘ID+IPID+自定义的标识
      

  5.   

    根据我的经验,可选择参数:
    1、网卡MAC地址
    2、CPU参数
    3、硬盘序列号
    4、主板BIOS参数
    5、IP地址
    使用选择其中三个,偶合起来,构成该计算机的机器码。这就是"计算机唯一标识"。
      

  6.   

    用硬盘硬件序列号function TForm1.GetIdeSerialNumberA: pchar;
    const IDENTIFY_BUFFER_SIZE = 512;
    type
      TIDERegs = packed record
        bFeaturesReg: BYTE;
        bSectorCountReg: BYTE;
        bSectorNumberReg: BYTE;
        bCylLowReg: BYTE;
        bCylHighReg: BYTE;
        bDriveHeadReg: BYTE;
        bCommandReg: BYTE;
        bReserved: BYTE;
      end;
      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;
      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: DWORD;
        wMultSectorStuff: Word;
        ulTotalAddressableSectors: DWORD;
        wSingleWordDMA: Word;
        wMultiWordDMA: Word;
        bReserved: array[0..127] of BYTE;
      end;
      PIdSector = ^TIdSector;
      TDriverStatus = packed record
        bDriverError: BYTE;
        bIDEStatus: BYTE;
        bReserved: array[0..1] of BYTE;
        dwReserved: array[0..1] of DWORD;
      end;
      TSendCmdOutParams = packed record
        cBufferSize: DWORD;
        DriverStatus: TDriverStatus;
        bBuffer: array[0..0] of BYTE;
      end;
    var hDevice: THandle;
      cbBytesReturned: DWORD;
      ptr: pchar;
      SCIP: TSendCmdInParams;
      aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of BYTE;
      IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;
      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 := '';
      if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then
      begin
        hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
      end else
        hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
      if hDevice = INVALID_HANDLE_VALUE then Exit;
      try
        FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
        FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
        cbBytesReturned := 0;
        with SCIP do
        begin
          cBufferSize := IDENTIFY_BUFFER_SIZE;
          with irDriveRegs do
          begin
            bSectorCountReg := 1;
            bSectorNumberReg := 1;
            bDriveHeadReg := $A0;
            bCommandReg := $EC;
          end;
        end;
        if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
          @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
      finally
        CloseHandle(hDevice);
      end;
      with PIdSector(@IdOutCmd.bBuffer)^ do
      begin
        ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
        (pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;
        Result := pchar(@sSerialNumber);
      end;
    end;
      

  7.   

    要是在局域网中可以根据“电脑名称”,
    广域网的话就必须用“MAC地址做为统一的标识符”