Delphi获取硬盘物理号与CPU序列号的实现方法
在 IT 开发中,获取硬件信息,如硬盘物理号和CPU序列号,是常见的需求。将介绍如何在 Delphi 中实现这些功能。
获取硬盘物理号
硬盘物理号是硬盘的唯一标识,不同于逻辑卷 ID。它通常由硬盘固件提供,并在格式化或操作系统重装时保持不变。使用 WMI(Windows Management Instrumentation)可以获取硬盘的物理号。以下是 Delphi 获取硬盘物理号的示例代码:
uses ComObj, SysUtils;
function GetHDDPhysicalNumber: string;
var
WbemLocator, WbemService: Variant;
EnumWbemObjectSet: Variant;
WbemObject, WbemObjectPath: Variant;
Counter: Integer;
begin
Result := '';
try
WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
WbemService := WbemLocator.ConnectServer('.', 'rootCIMV2', '');
EnumWbemObjectSet := WbemService.ExecQuery('SELECT * FROM Win32_DiskDrive');
for Counter := 0 to EnumWbemObjectSet.Count - 1 do
begin
WbemObject := EnumWbemObjectSet.ItemIndex(Counter);
WbemObjectPath := WbemObject.Path_;
Result := Result + Format('硬盘物理号: %s (%s)%s', [WbemObject.DeviceID, WbemObject.SerialNumber, sLineBreak]);
end;
except
on E: Exception do Result := '错误: ' + E.Message;
end;
end;
这段代码通过 WMI 查询 Win32_DiskDrive
类,提取硬盘的 DeviceID 和 SerialNumber。
获取 CPU 序列号
CPU序列号是 CPU 的唯一标识符。通过调用 CPUID
指令可以获取 CPU 信息。以下是 Delphi 获取 CPU 序列号的示例代码:
uses Windows;
function GetCPUSerialNumber: string;
var
CPUInfo: array[0..1] of DWORD;
RegHandle: DWORD;
begin
Result := '';
if not GetCPUID(@CPUInfo, 0) then Exit;
// CPUID 返回信息中并未直接包含序列号,需要进一步处理
if CPUInfo[0] > 0 then
Result := Format('CPU序列号: %X-%X', [CPUInfo[1], CPUInfo[2], CPUInfo[3], CPUInfo[4]]);
end;
function GetCPUID(var CPUInfo: array of DWORD; FuncID: DWORD): Boolean;
asm
MOV EDX, FuncID
CPUID
MOV EAX, [CPUInfo]
MOV [EAX], EAX
MOV [EAX + 4], EBX
MOV [EAX + 8], ECX
MOV [EAX + 12], EDX
end;
CPU序列号的获取方式可能会因厂商或架构的不同而有所变化,需要根据具体情况调整。
总结
通过 Delphi,使用 WMI 可以轻松获取硬盘的 物理号,而获取 CPU序列号 则需要通过底层的 CPUID
指令与硬件交互。开发者应确保遵循相关的隐私和安全法律要求。
194.9KB
文件大小:
评论区