Серийный номер SSD
Серийный номер SSD
Не могу получить корректный номер SSD (современных, или NVME или SATA) на Lazarus используя WMI. Выдается серийник вида: 0025_3853_81B1_31EB. , а должен быть: S3ESNX0K368688A Причем, AIDA64 2014 года редакции и wmic выдает тоже 0025_3853_81B1_31EB. , а уже современная AIDA64 и CrystalDiskInfo уже выдают правильный номер - S3ESNX0K368688A. Как-то он по другому получается или преобразуется. Подскажите, пожалуйста, кто знает. Вот код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
comobj, LConvEncoding, LazUTF8, ActiveX, Variants;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
Form1: TForm1;
FWbemObject : OLEVariant;
FWbemObjectSet : OLEVariant;
oEnum : IEnumvariant;
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
iValue : LongWord;
F : TextFile; // файл вывода
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
AssignFile(F, 'testsn.txt');
try
Rewrite(F);
except
ShowMessage('Ошибка создания testsn.txt');
Exit;
end;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery('Select * from Win32_DiskDrive','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
try
Writeln(F, Format('Модель : %s',[FWbemObject.Model]));
except
end;
try
if not (FWbemObject.SerialNumber = Null) then
Writeln(F, Format('Серийный номер : %s',[FWbemObject.SerialNumber]));
except
end;
Writeln(F, '---');
end;
CloseFile(F);
Memo1.Lines.LoadFromFile('testsn.txt');
end;
end.