2010-03-23 9 views

Trả lời

16

thử sử dụng WMI Win32_BaseBoard Class.

thấy luận văn mẫu:

Lựa chọn 1) trước khi thực hiện bạn cần nhập Microsoft WMIScripting Library từ Component ->Import Component và sau đó chọn 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. 

Lựa chọn 2) sử dụng OLEVariant, IBindCtx InterfaceIMoniker 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

ur người đàn ông RRUZ, sẽ tìm hiểu một số điều :) – radick

+0

@PRUZ, bạn có thể giải thích các mã thứ hai ... Nó hoạt động nhưng tôi muốn một số giải thích .. – Himadri

+0

Điều duy nhất tôi không hiểu là 'winmgmts: \\ localhost \ root \ cimv2' – Himadri

0

tôi nhận được một giải pháp:

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; 

Trân trọng Wellington

+0

Bạn có thể giải thích mã của bạn đang hoạt động không? Bạn có chắc nó trả về số serial của bo mạch chủ, nhưng không trả về CPUID? –

+0

Tôi đọc rất nhiều vấn đề về điều này và kết luận rằng không có ID cho CPU và thay đổi đề xuất của tôi để nhận được ID HDD. Chương trình của tôi ở trên bắt cùng một ID ở các máy tính khác nhau. –