Làm cách nào để nhận ID bo mạch chủ hoặc số sê-ri từ mã Delphi?Làm thế nào để có được số bo mạch chủ hoặc số sêri trong Delphi?
Có bất kỳ mã mẫu hoặc bài viết nào mà tôi có thể xem không?
Làm cách nào để nhận ID bo mạch chủ hoặc số sê-ri từ mã Delphi?Làm thế nào để có được số bo mạch chủ hoặc số sêri trong Delphi?
Có bất kỳ mã mẫu hoặc bài viết nào mà tôi có thể xem không?
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 Interface và 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.
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
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? –
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. –
ur người đàn ông RRUZ, sẽ tìm hiểu một số điều :) – radick
@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
Điều duy nhất tôi không hiểu là 'winmgmts: \\ localhost \ root \ cimv2' – Himadri