How to get motherboard id or serial number in Delphi?

前端 未结 2 955
粉色の甜心
粉色の甜心 2020-12-15 11:02

How do I get the motherboard ID or serial number from Delphi code?

Is there any example code or articles that I can look at?

相关标签:
2条回答
  • 2020-12-15 11:24

    I got another solution:

    function TForm1.GetSerialMotherBoard: String;
    var
      a, b, c, d: LongWord;
    begin
      asm
        push EAX
        push EBX
        push ECX
        push EDX
    
        mov eax, 1
        db $0F, $A2
        mov a, EAX
        mov b, EBX
        mov c, ECX
        mov d, EDX
    
        pop EDX
        pop ECX
        pop EBX
        pop EAX
    
      end;
      result := inttohex(a, 8) + '-' +
                inttohex(b, 8) + '-' +
                inttohex(c, 8) + '-' +
                inttohex(d, 8);
    end;
    

    Best Regards Wellington

    0 讨论(0)
  • 2020-12-15 11:38

    try using the WMI Win32_BaseBoard Class .

    see theses samples:

    Option 1) before execute you need import the Microsoft WMIScripting Library from Component->Import Component and then select Import type library

    program GetWMI_MotherBoardInfo;
    
    {$APPTYPE CONSOLE}
    
    uses
      ActiveX,
      Variants,
      SysUtils,
      WbemScripting_TLB in '..\..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas';//
    
    
    Function  GetMotherBoardSerial:string;
    var
      WMIServices : ISWbemServices;
      Root        : ISWbemObjectSet;
      Item        : Variant;
    begin
      WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
      Root  := WMIServices.ExecQuery('Select SerialNumber From Win32_BaseBoard','WQL', 0, nil);
      Item := Root.ItemIndex(0);
      Result:=VarToStr(Item.SerialNumber);
    end;
    
    
    begin
      try
        CoInitialize(nil);
        Writeln('Serial MotherBoard '+GetMotherBoardSerial);
        Readln;
        CoUninitialize;
      except
        on E:Exception do
        Begin
            CoUninitialize;
            Writeln(E.Classname, ': ', E.Message);
            Readln;
        End;
      end;
    end.
    

    Option 2) using OLEVariant, IBindCtx Interface and IMoniker Interface

    program GetWMI_MotherBoardSerial;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils
      ,ActiveX
      ,ComObj
      ,Variants;
    
    
    function GetMotherBoardSerial:String;
    var
      objWMIService : OLEVariant;
      colItems      : OLEVariant;
      colItem       : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    
      function GetWMIObject(const objectName: String): IDispatch;
      var
        chEaten: Integer;
        BindCtx: IBindCtx;
        Moniker: IMoniker;
      begin
        OleCheck(CreateBindCtx(0, bindCtx));
        OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
        OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
      end;
    
    begin
      Result:='';
      objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
      colItems      := objWMIService.ExecQuery('SELECT SerialNumber FROM Win32_BaseBoard','WQL',0);
      oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
      if oEnum.Next(1, colItem, iValue) = 0 then
      Result:=VarToStr(colItem.SerialNumber);
    end;
    
    
    begin
     try
        CoInitialize(nil);
        try
          Writeln('Serial MotherBoard '+GetMotherBoardSerial);
          Readln;
        finally
        CoUninitialize;
        end;
     except
        on E:Exception do
        Begin
            Writeln(E.Classname, ': ', E.Message);
            Readln;
        End;
      end;
    end.
    
    0 讨论(0)
提交回复
热议问题