linux环境下如何获取主板或硬盘或网卡序列号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux环境下如何获取主板或硬盘或网卡序列号相关的知识,希望对你有一定的参考价值。

参考技术A 获取主板序列号(ubuntu环境)
dmidecode -t system
参考技术B sudo dd if=/dev/zero of=/dev/sd*

参考技术C 命令 ifconfig 哈

如何在 Delphi 中获取主板 ID 或序列号?

【中文标题】如何在 Delphi 中获取主板 ID 或序列号?【英文标题】:How to get motherboard id or serial number in Delphi? 【发布时间】:2011-01-30 15:13:18 【问题描述】:

如何从 Delphi 代码中获取主板 ID 或序列号?

有没有可以看的示例代码或文章?

【问题讨论】:

【参考方案1】:

尝试使用 WMI Win32_BaseBoard Class。

查看这些示例:

选项 1) 在执行之前你需要从Component->Import Component 导入Microsoft WMIScripting Library 然后选择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.

【讨论】:

我唯一不明白的是'winmgmts:\\localhost\root\cimv2' @PRUZ 我在其他一些返回“无”的计算机上检查了相同的代码。它有什么问题? @himadri,第二个代码使用了后期绑定调用,不需要在delphi中导入wmi库,您可以在此链接word.mvps.org/faqs/interdev/earlyvslatebinding.htm中阅读更多关于后期绑定的内容@ winmgmts:\\localhost\root\cimv2 是类Win32_BaseBoard 所在的命名空间,您可以在此链接msdn.microsoft.com/en-us/library/aa822575%28VS.85%29.aspx 中阅读有关wmi 命名空间的更多信息 @PRUZ 你知道我的第二条评论吗?那I check the same code in some other computer which returns 'none'. What's the matter with it?【参考方案2】:

我有另一个解决方案:

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;

最好的问候 惠灵顿

【讨论】:

你能解释一下你的代码在做什么吗?你确定它返回主板序列号,而不是 CPUID? 我阅读了很多关于此的问题并得出结论,CPU 没有 ID 并更改我的建议以获取 HDD ID。我上面的程序在不同的计算机上捕获了相同的 ID。 我觉得这个功能有问题!我发现每次同一个程序(使用它的程序)在不同的启动上运行时,它都会返回不同的值。示例(8次运行):1)000306D4-02100800-7FFBBF-BFEBFBFF,2)0003FBBF-BFEBFBFF,3)0003FBBF-BFEBFBFF,4)000306D4-02100800-7FFBBF-BFEBFBFF,5)000306D4- 02100800-7FFAFBBF-BFEBFBFF, 6 000306D4-03100800-7FFAFBBF-BFEBFBFF, 7) 000306D4-01100800-7FFAFBBF-BFEBFBFF, 8) 000306D4-00100800-7FFAFBBF-BFEBFBFF。很奇怪! 我认为没有解决办法...我从 2009 年就开始尝试了。【参考方案3】:

如果你想显示主板序列号,使用这个东西。 要在 Windows 10 中显示主板编号,请在 WMI 服务中查询以下内容:wmic baseboard get product,Manufacturer,version,serialnumber

//USES: Winapi.ActiveX, System.Win.ComObj
function TForm2.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;

【讨论】:

我收到了这个:To be filled by O.E.M.

以上是关于linux环境下如何获取主板或硬盘或网卡序列号的主要内容,如果未能解决你的问题,请参考以下文章

linux下如何查看硬盘插在主板那个SATA接口上

Python获取电脑硬件配置的封装类,可以获取CPU序列号主板序列号BIOS序列号硬盘序列号和网卡MAC地址

Python获取电脑硬件配置的封装类,可以获取CPU序列号主板序列号BIOS序列号硬盘序列号和网卡MAC地址

Python获取电脑CPU序列号主板序列号BIOS序列号硬盘序列号列表网卡MAC地址

如何在 Delphi 中获取主板 ID 或序列号?

linux系统下,C++编程获得硬盘及主板序列号?执行的时候不要加sudo