UUID (Universal Unique Identifier) — это уникальный идентификатор, который используется для идентификации оборудования и программного обеспечения. В конфигурационных файлах VMware можно найти UUID BIOS в формате:
uuid.bios = "56 4d ed cf 3c cd 63 20-53 78 95 86 26 92 22 c8"
Почти каждое физическое устройство BIOS имеет подобный UUID. Вопрос, который часто задают, заключается в том, существует ли какой-либо вызов Windows API, который позволяет получить этот идентификатор?
Одним из возможных подходов является использование WMI-класса Win32_ComputerSystemProduct.UUID, но полученное значение отличается от значения uuid.bios. Также отличается значение ключа реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid.
Однако, существует альтернативный подход, который заключается в использовании WMI-класса Win32_BIOS и свойства SerialNumber. Пример кода на Object Pascal (Delphi) для получения UUID BIOS через этот класс приведен ниже:
uses
SysUtils,
ActiveX,
ComObj,
Variants;
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.
Этот код возвращает значение свойства SerialNumber класса Win32_BIOS, которое совпадает с значением uuid.bios из файла конфигурации VMware, за исключением префикса VMware-. Например: VMware-56 4d af ac d8 bd 4d 2c-06 df ca af 89 71 44 93.
Although RFC 4122 recommends network byte order for all fields, the PC industry, including the ACPI, UEFI, and Microsoft specifications, has consistently used little-endian byte encoding for the first three fields: time_low, time_mid, time_hi_and_version. The same encoding, also known as wire format, should also be used for the SMBIOS representation of the UUID.
В заключение, можно сказать, что для получения UUID BIOS через Windows API можно использовать WMI-класс Win32_BIOS и свойство SerialNumber. Если вам нужно получить значение UUID без префикса VMware-, то придется читать SMBIOS-таблицы напрямую.
в одном предложении 'Описывается процесс получения уникального идентификатора UUID BIOS через Windows API, в том числе с использованием WMI-класса `Win32_BIOS` и свойства `SerialNumber`, а также чтения SMBIOS-таблиц на
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS