Получить BIOS UUID из C или Delphi из Win32 - PullRequest
4 голосов
/ 30 марта 2012

Файлы конфигурации VMWare содержат строку, подобную

uuid.bios = "56 4d ed cf 3c cd 63 20-53 78 95 86 26 92 22 c8"

И у большинства (каждого?) Физического BIOS такой UUID есть.Есть ли какой-либо вызов Windows API для получения этого идентификатора?

Я пробовал свойство Win32_ComputerSystemProduct.UUID класса WMI, но значение отличается от значения uuid.bios.Значение HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Cryptography \ MachineGuid также отличается.

1 Ответ

5 голосов
/ 30 марта 2012

Это значение называется Universal Unique ID number и является частью таблиц SMBIOS. Если вы используете свойство SerialNumber класса WMI Win32_BIOS, вы получите тот же идентификатор uuid.bios (из vmx файл), плюс префикс VMware- (пример: VMware-56 4d af ac d8 bd 4d 2c-06 df ca af 89 71 44 93)

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;

// The Win32_BIOS class represents the attributes of the computer system's basic input/output services (BIOS) that are installed on the computer.

procedure  GetWin32_BIOSInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT SerialNumber FROM Win32_BIOS','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, FWbemObject, iValue) = 0 then
    Writeln(Format('SerialNumber    %s',[String(FWbemObject.SerialNumber)]));// String
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_BIOSInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.

Если вы хотите вернуть тот же uuid без префикса VMware-, вы должны непосредственно прочитать таблицы SMBIOS (проверьте тип 1 таблицы сведений о системе и поле UUID), попробуйте эту статью Reading the SMBios Tables using Delphi который включает в себя пример кода для перечисления этого значения.

Формат UUID

Из System Management BIOS (SMBIOS) Reference Specification

UUID - это идентификатор, который разработан уникальным как во времени, так и в пространстве. Это не требует центрального процесса регистрации. UUID имеет длину 128 бит. Его формат описан в RFC 4122, но фактическое содержимое поля непрозрачно и несущественно для спецификации SMBIOS, которая касается только порядка байтов. Таблица 10 показывает имена полей; эти имена полей, особенно для мультиплексированных полей, следуют исторической практике.

enter image description here

Хотя RFC 4122 рекомендует порядок сетевых байтов для всех полей, отрасль ПК (включая спецификации ACPI, UEFI и Microsoft) последовательно использует байтовое кодирование с прямым порядком байтов для первых трех полей: time_low, time_mid, time_hi_and_version. Такое же кодирование, также известное как проводной формат, также следует использовать для представления UUID в SMBIOS.

UUID {00112233-4455-6677-8899-AABBCCDDEEFF}, таким образом, будет представлен как: 33 22 11 00 55 44 77 66 88 99 AA BB CC DD EE FF.

Если все значение равно FFh, идентификатор в настоящее время отсутствует в системе, но его можно установить. Если все значение равно 00h, идентификатор отсутствует в системе.

...