2010-03-23 6 views

ответ

16

попробуйте использовать WMI Win32_BaseBoard Class.

см диссертаций образцы:

Вариант 1) перед тем выполнить вам нужно импортировать Microsoft WMIScripting Library из Component ->Import Component, а затем выберите 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. 

Вариант 2) использованием OLEVariant, IBindCtx Interface и 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. 
+2

ур человека RRUZ, выучит некоторые вещи :) – radick

+0

@PRUZ, вы можете объяснить второй код ... Он работает но мне нужно какое-то объяснение .. – Himadri

+0

Единственное, что я не понял, это «winmgmts: \\ localhost \ root \ cimv2» – Himadri

0

я получил еще одно решение:

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; 

С наилучшими пожеланиями Wellington

+0

Можете ли вы объяснить, что делает ваш код? Вы уверены, что он возвращает серийный номер материнской платы, но не CPUID? –

+0

Я прочитал много вопросов об этом и сделаю вывод, что нет идентификатора для ЦП и изменить мое предложение на получение идентификатора жесткого диска. Моя программа выше получает один и тот же идентификатор на разных компьютерах. –

Смежные вопросы