**
《硬件侦察兵:用脚本精准获取主板型号、序列号与BIOS信息的终极指南》

目录导读
- 为什么要用脚本获取主板信息?
- 跨平台脚本方案对比:WMIC、dmidecode、PowerShell
- 实战:Windows系统下的三种脚本写法(含代码拆解)
- 实战:Linux/macOS下的Bash与Python方案
- 常见问题问答(FAQ)
- 进阶技巧:将主板信息批量导出为JSON/CSV
为什么要用脚本获取主板信息?
运维人员排查硬件故障、IT资产管理、软件授权绑定(如CAD、VMware许可)时,都需要主板序列号或BIOS版本,手动通过图形界面查看不仅慢,而且无法批量操作,脚本化获取能让你在10秒内收集上千台设备的主板数据,并自动生成报表。
跨平台脚本方案对比
| 操作系统 | 核心工具 | 输出格式 | 权限要求 |
|---|---|---|---|
| Windows | WMIC / PowerShell | 文本/对象 | 普通用户可读序列号 |
| Linux | dmidecode | 文本/JSON | 需要root权限 |
| macOS | system_profiler | 文本 | 普通用户可用 |
注意:Windows 11 已移除WMIC(建议用PowerShell),而Linux的dmidecode依赖DMI表,虚拟机上可能返回“Not Specified”。
实战:Windows系统下的三种脚本写法
方法A:经典WMIC(兼容Win7/10)
wmic baseboard get Manufacturer,Product,SerialNumber,Version
输出示例:
Manufacturer Product SerialNumber Version
LENOVO 20HQS00X00 PF1X9X2X SDK0J40709 WIN
方法B:PowerShell(推荐Win10/11)
Get-WmiObject Win32_BaseBoard | Select-Object Manufacturer,Product,SerialNumber,Version | Format-List
高级变体:获取BIOS信息
Get-CimInstance -ClassName Win32_BIOS | Select-Object SMBIOSBIOSVersion,ReleaseDate,SerialNumber
方法C:纯命令行 + 输出重定向(批量脚本)
echo 主板信息 > pc_info.txt wmic baseboard get Manufacturer,Product >> pc_info.txt wmic bios get SMBIOSBIOSVersion >> pc_info.txt
实战:Linux/macOS下的Bash与Python方案
Linux(需sudo):
sudo dmidecode -t baseboard | grep -E "Manufacturer|Product Name|Serial Number"
脚本进阶(输出为一行):
sudo dmidecode -t baseboard | awk -F': ' '/Manufacturer|Product Name|Serial Number/{printf "%s,",$2} END{print ""}'
macOS一行命令:
system_profiler SPHardwareDataType | grep "Model Identifier"
但macOS不直接暴露主板序列号,可结合ioreg -l | grep IOPlatformSerialNumber获取等效ID。
Python跨平台脚本(推荐):
import subprocess, sys, json
def get_windows_mb():
from subprocess import check_output
raw = check_output("wmic baseboard get Manufacturer,Product,SerialNumber", shell=True).decode()
return dict(line.split(" ") for line in raw.split("\n")[1:] if line.strip())
def get_linux_mb():
raw = subprocess.check_output("sudo dmidecode -t baseboard", shell=True).decode()
data = {}
for line in raw.split("\n"):
if "Manufacturer:" in line: data["Manufacturer"] = line.split(":")[1].strip()
if "Product Name:" in line: data["Product"] = line.split(":")[1].strip()
if "Serial Number:" in line: data["Serial"] = line.split(":")[1].strip()
return data
if sys.platform.startswith("win"): print(json.dumps(get_windows_mb()))
else: print(json.dumps(get_linux_mb()))
常见问题问答(FAQ)
Q1:为什么脚本返回的主板序列号是空白或“To be filled by O.E.M.”?
A:这是主板制造商的出厂默认值,多见于组装机,品牌机(如Dell、HP)通常有真实序列号,若需要追踪硬件,可改用CPU ID或MAC地址作为辅助标识。
Q2:在虚拟机(VMware/VirtualBox)中执行dmidecode为什么失败?
A:虚拟机默认不暴露真实DMI信息,可在VMware配置文件中添加smbios.reflectHost = "TRUE"来透传物理机信息,但存在安全风险,不建议生产环境使用。
Q3:如何远程批量获取局域网内电脑的主板信息?
A:使用PowerShell远程会话(需开启WinRM):
Invoke-Command -ComputerName PC01,PC02 -ScriptBlock { Get-WmiObject Win32_BaseBoard | Select-Object PSComputerName,Manufacturer,SerialNumber }
或者用Python的paramiko库通过SSH执行Linux脚本。
Q4:能否在脚本中判断主板是否支持TPM 2.0?
A:可以,Windows下运行Get-Tpm命令(需管理员权限),Linux下运行bootctl status | grep TPM,脚本可结合条件判断输出“支持/不支持”。
进阶技巧:将主板信息批量导出为JSON/CSV
PowerShell生成CSV:
Get-WmiObject Win32_BaseBoard | Export-Csv -Path "mb_info.csv" -NoTypeInformation
Python生成结构化JSON(合并BIOS数据):
import json, subprocess, sys
def get_all():
if sys.platform.startswith("win"):
mb = subprocess.check_output("wmic baseboard get Manufacturer,Product,SerialNumber /format:csv", shell=True).decode()
bios = subprocess.check_output("wmic bios get SMBIOSBIOSVersion /format:csv", shell=True).decode()
return {"mb": mb, "bios": bios}
else:
return {"mb": get_linux_mb(), "bios": subprocess.check_output("cat /sys/class/dmi/id/bios_version", shell=True).decode()}
print(json.dumps(get_all(), indent=2))
结尾技术总结
掌握脚本获取主板信息的能力,是运维自动化的第一块敲门砖,无论你是用Windows下的PowerShell还是Linux下的dmidecode,核心逻辑都是调用系统API读取DMI/SMBIOS表,推荐优先使用Python封装跨平台逻辑,这样你写一次脚本,就能在混合环境中通用,且便于后续扩展(比如自动对比资产数据库),当你的脚本能稳定输出JSON时,就可以对接Zabbix、Prometheus等监控系统,实现硬件生命周期全自动管理。
(提示:脚本中涉及敏感信息(如序列号)时,请务必对输出做权限控制,避免泄露到日志系统。)