Серийный номер 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.

Ответы (0 шт):