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 类,提取硬盘的 DeviceIDSerialNumber

获取 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 指令与硬件交互。开发者应确保遵循相关的隐私和安全法律要求。

rar 文件大小:194.9KB