在系统设计过程中,我想将某个用户绑定在某一台电脑上面,也就是说某个用户(如A用户)在登陆系统的时候只能在绑定的那一台电脑上使用系统,如果换到另一台机器则会禁止登陆(或是需要管理员重开登陆权限),这里是否有一种真正意义上的取"计算机唯一标识"的方法?
MAC可以更改,CPU序列号现在在赛扬系列产品中又大都相同,Inter产品中也只有P3,P4才会有```但也有相同的情况存在```
所以在此想请各位大虾帮下忙,思路或是代码都可以..小弟在线等待答复~`~
PS:一定要是取得一台计算机的唯一标识```任何其他电脑都不会有相同的情况存在的```
MAC可以更改,CPU序列号现在在赛扬系列产品中又大都相同,Inter产品中也只有P3,P4才会有```但也有相同的情况存在```
所以在此想请各位大虾帮下忙,思路或是代码都可以..小弟在线等待答复~`~
PS:一定要是取得一台计算机的唯一标识```任何其他电脑都不会有相同的情况存在的```
解决方案 »
- 嵌入汇编 db 怎么写入字符串变量
- listview 的问题
- 高分调查!你正在使用Delphi2005吗?(一周后结贴,每日置顶)
- 关于数据备份
- 怎样用程序在一个窗体上创建bitbtn组件
- dbgrid的查询问题(急等)
- 100分,关于RS232串口通信的问题,最好有源码。
- 让我们共同开发一个画图应用软件,我已完成了一部分功能,难得还在后面呢,delphi高手们,还等什么,进来吧,一起研究吧。
- TForm1.FormClose是在什么时候产生的事件?
- 怎么引用用vb编的activeX DLL文件?
- 有关Delphi 2007用Database控件的问题?
- 如何让windows自动扩展桌面?程序实现。
buffer : array [0..63] of Char;
phe: PHostEnt;
begin
GetHostName(buffer,SizeOf(buffer));
phe := GetHostByName(buffer);
end;
1、网卡MAC地址
2、CPU参数
3、硬盘序列号
4、主板BIOS参数
5、IP地址
使用选择其中三个,偶合起来,构成该计算机的机器码。这就是"计算机唯一标识"。
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;
广域网的话就必须用“MAC地址做为统一的标识符”