SMBIOS(System Management BIOS,DMI)是主板固件(BIOS/UEFI)按照 DMI(Desktop Management Interface)规范 ;Windows11 通过内核接口读取固件内的 SMBIOS 结构化数据,向上层应用 / 命令行 / WMI/PowerShell 暴露硬件信息核心区分:SMBIOS 数据存储在主板固件(UEFI/BIOS)
Windows11 SMBIOS(System Management BIOS)信息读取 完整解构文档
基础定义 SMBIOS(System Management BIOS,DMI)是主板固件(BIOS/UEFI)按照 DMI(Desktop Management Interface)规范 固化的硬件描述数据表;Windows11 通过内核接口读取固件内的 SMBIOS 结构化数据,向上层应用 / 命令行 / WMI/PowerShell 暴露硬件信息(主板型号、序列号、UUID、CPU、内存、资产编号等)。 核心区分:SMBIOS 数据存储在主板固件(UEFI/BIOS)里,不是 Windows 生成,Windows 只是读取、解析、上报。
一、底层原理
- 数据源头 主板固件在 POST 阶段初始化并在内存固定区域生成符合 DMI 规范(SMBIOS 3.x 为主,Win11 普遍 3.2/3.3) 的 DMI 数据块,操作系统启动后可通过两种标准方式读取:
- Legacy:
E8hBIOS 中断读取 DMI 表(传统 BIOS 模式) - UEFI:通过 UEFI Configuration Table(UEFI CT)读取 SMBIOS 表(Win11 主流模式)
- Windows 内核读取链路
固件(UEFI/BIOS) → 内核Hal.dll 读取内存中的SMBIOS原始二进制DMI块
↓
Hal.dll 解析原始DMI结构、Type结构体(Type0 BIOS、Type1系统信息、Type2主板、Type4 CPU、Type17内存等)
↓
内核将解析后的标准化信息暴露到WMI提供器、注册表、NtQuerySystemInformation系统调用
↓
上层工具(wmic、powershell、msinfo32、dxdiag)读取WMI/内核接口展示SMBIOS信息
SMBIOS 采用Type 分类结构体:每一类 Type 对应一类硬件信息,例如: Type1:System Information(系统 UUID、序列号、厂商) Type2:Base Board(主板信息) Type4:Processor Type17:Memory Device(单根内存信息)
- 上层 4 种主流读取模式底层差异
方式 底层入口 Get-WmiObject / Get-CimInstance WMI → wmiprov.dll → Hal 读取 SMBIOS wmic WMI 命令行壳,复用 WMI 提供器 msinfo32.exe(系统信息) 直接调用 WMI + NtQuerySystemInformation dxdiag.exe DirectX 底层 API,部分硬件取自 SMBIOS 直接读取原始 DMI NtQuerySystemInformation(SystemFirmwareTableInformation)
二、依赖文件清单
| 文件 | 核心作用 |
|---|---|
hal.dll |
✅ 硬件抽象层核心,直接读取内存中 SMBIOS 原始 DMI 二进制数据、解析 DMI Type 结构体 |
ntoskrnl.exe |
Windows 内核,暴露 SystemFirmwareTable 信息查询系统调用 |
wmiprov.dll |
WMI 系统提供器,把 Hal 输出的 SMBIOS 数据封装成 WMI 类(Win32_ComputerSystemProduct、Win32_BaseBoard、Win32_Processor、Win32_PhysicalMemory) |
wbemprox.dll |
WMI COM 代理,供 PowerShell/WMIC 访问 WMI 类 |
msinfo32.exe |
系统信息展示程序,读取 WMI/SMBIOS |
dxdiag.exe |
DirectX 诊断工具,读取部分 SMBIOS 硬件信息 |
wmic.exe |
WMI 命令行前端 |
cimwin32.dll |
CIM 提供器(新版 Get-CimInstance 依赖) |
注册表路径 HKLM\HARDWARE\DESCRIPTION\System\BIOS |
内核启动时预提取缓存的 SMBIOS 部分字段(快速读取,不全,只有少量 Type1/Type2 字段) |
三、依赖关系
- 固件强依赖 SMBIOS 数据由主板厂商写入 UEFI/BIOS;如果主板厂商未填充字段(序列号为空、UUID 全 0),Windows 读到就是空值,系统无法补全(非常常见,品牌机正常,组装主板经常空)。
- 内核 Hal 依赖 hal.dll 必须能正常访问固件 DMI 内存表;部分精简 / 定制内核、虚拟机可屏蔽 SMBIOS 读取。
- WMI 服务依赖
Winmgmt(Windows Management Instrumentation)服务正常运行,PowerShell/Get-CimInstance/wmic 才能读到结构化 SMBIOS;仅注册表HKLM\HARDWARE\DESCRIPTION\System\BIOS不需要 WMI。 - 权限依赖 ✅ 普通用户即可读取 SMBIOS 信息(不需要管理员);内核固件表读取权限放开,不需要提权。
- 虚拟机特殊依赖 VMware/Hyper-V/KVM 会虚拟生成 SMBIOS 数据,不是物理主板原始信息,可在虚拟化平台自定义修改 DMI 字段。
- SMBIOS 版本兼容 Win11 原生支持 SMBIOS 2.x/ 3.x;3.x 采用新的 32 位结构,hal.dll 自动适配解析。
四、配套链
✅ 原生读取工具(Win11 自带)
# 1. CIM(推荐,Win10/11新标准,读取SMBIOS Type1系统信息)
Get-CimInstance Win32_ComputerSystemProduct
# 2. 主板信息 Type2
Get-CimInstance Win32_BaseBoard
# 3. 内存信息 Type17
Get-CimInstance Win32_PhysicalMemory
# 4. 直接读内核缓存注册表(最快,无需WMI)
Get-ItemProperty "HKLM:\HARDWARE\DESCRIPTION\System\BIOS"
# 5. msinfo32 图形界面
msinfo32.exe
# 6. wmic(老旧兼容)
wmic baseboard get product,manufacturer,serialnumber
✅ 配套运维 / 底层工具
- RWEverything:直接读取原始 DMI 二进制,可查看未被 Windows 解析的原始 SMBIOS 结构
- dmidecode(Windows 移植版):Linux 同款 DMI 解析工具,直接 dump 完整 SMBIOS Type 表
- ProcMon:排查 WMI 读取 SMBIOS 异常、字段为空的底层问题
- PowerShell 资产采集脚本:批量远程读取主机 SMBIOS 序列号、UUID 用于资产盘点
- UEFI 设置工具:部分品牌机 BIOS 内可自定义修改 SMBIOS 字段
五、边界与高频坑点(重点)
- 数据不全边界
HKLM:\HARDWARE\DESCRIPTION\System\BIOS只是内核启动缓存的少量字段,没有内存槽、CPU 详细等完整 Type 数据;完整全量 SMBIOS 必须走 WMI/CIM 或直接读取固件表。 - 字段空白坑 组装主板 / 工控板厂商不填充 SerialNumber、UUID,Windows 读取返回空字符串,不是系统故障,是固件本身没有写入。
- 虚拟机 SMBIOS 是虚拟值 Hyper-V/VMware 会伪造一套 DMI 数据,和物理主机主板无关;虚拟化场景资产采集不能直接信任 SMBIOS 序列号。
- Win32_PhysicalMemory 边界 很多新平台(笔记本、新主板)Win32_PhysicalMemory 返回空,属于微软 WMI 提供器限制,不是 SMBIOS 缺失;底层 Hal 实际可以读到,但 WMI 未向上暴露 Type17。
- 安全边界 SMBIOS 属于硬件资产信息,普通用户可读;域内常用来做设备准入、资产台账,但不能作为唯一可信标识(虚拟机、部分主板可篡改 DMI)。
- 系统修改限制 Windows不能修改 SMBIOS 原始数据;SMBIOS 固化在固件里,修改必须刷 BIOS/UEFI 或者虚拟化平台配置,Windows 层面只能读。
- 部分精简系统裁剪 WMI 精简版 Win11 移除 wmiprov.dll 后,PowerShell/WMIC 无法读取 SMBIOS,但注册表
HKLM:\HARDWARE\DESCRIPTION\System\BIOS仍可读取(hal 内核缓存还在)。 - SMBIOS 和 UEFI 变量区分 SMBIOS ≠ UEFI Variables;UEFI 变量是另一套存储,不要混淆。
在 Windows 11 中,查看 SMBIOS(System Management BIOS)信息的方法有多种。SMBIOS 提供了关于计算机硬件和系统配置的详细信息,包括主板、处理器、内存、BIOS 版本等。
以下是几种查看 SMBIOS 信息的方法:
1. 使用 Windows 系统信息 工具
- 按下 Win + R,打开 运行 对话框。

- 输入
msinfo32并按 Enter。 - 这将打开 系统信息 窗口。
- 在左侧面板中,选择 系统摘要,在右侧可以查看有关计算机的各类硬件信息。
- 其中,SMBIOS 相关信息会列在例如
BIOS 版本/日期、系统制造商、系统型号、内存等条目中。
虽然 msinfo32 显示的是 SMBIOS 中的一些关键信息,但它没有直接显示完整的 SMBIOS 内容。
2. 使用 命令提示符 或 PowerShell
通过 命令提示符 或 PowerShell 你可以使用 wmic 命令或 PowerShell 命令来提取更多的 SMBIOS 信息。
(1) 使用 wmic 命令
-
按下 Win + R,
输入 cmd,按 Enter,打开命令提示符。 -
在命令提示符中,输入以下命令:
bashCopy Codewmic bios get /format:list这将列出 BIOS(Basic Input Output System
) 的 SMBIOS 数据,包括生产商、版本、发布日期、BIOS 标识符等。
BIOS(Basic Input Output System) Version:显示当前 BIOS(Basic Input Output System)版本。Manufacturer:显示 BIOS(Basic Input Output System) 制造商。Release Date:显示 BIOS(Basic Input Output System)发布日期。
(2) 使用 PowerShell 获取 SMBIOS 信息
-
按下 Win + X,
然后选择 终端,终端管理员,Windows PowerShell (管理员) 或 Windows Terminal。 -
在 PowerShell 窗口中,输入以下命令:
powershellCopy CodeGet-WmiObject -Class Win32_BIOS或者,在较新的 Windows 版本中使用
Get-CimInstance命令:powershellCopy CodeGet-CimInstance -ClassName Win32_BIOS这将列出更多关于 BIOS(Basic Input Output System
) 的 SMBIOS 信息,如制造商、版本、发布日期、序列号等。
3. 使用 第三方工具
如果你想要更详细的 SMBIOS 信息,可以使用第三方工具来查看完整的硬件和 SMBIOS 数据。例如:
(1) CPU-Z
- CPU-Z 是一款广受欢迎的硬件检测工具,提供关于处理器、主板、内存等的详细信息。它能够显示硬件的详细配置,包括与 SMBIOS 相关的部分。
- 下载并安装 CPU-Z。
- 打开 CPU-Z 后,切换到 Mainboard 标签页,你可以查看主板型号、制造商等信息。
- 同时,你也可以查看 Memory 和 SPD 标签页,获取内存的详细信息。
(2) HWiNFO
- HWiNFO 是一款功能强大的硬件信息查看工具,它提供了详细的 SMBIOS 信息和实时监控功能。
- 下载并安装 HWiNFO。
- 启动 HWiNFO 后,点击 Sensors 或 Summary 按钮,可以查看详细的硬件信息。
- 你可以在 SMBIOS 或 Motherboard 部分找到与 SMBIOS 相关的详细数据。
4. 使用 DirectX 诊断工具
虽然这个工具并不直接显示 SMBIOS 信息,但它可以提供一些与硬件相关的其他信息。
- 按下 Win + R,打开 运行 对话框。

- 输入
dxdiag并按 Enter。 - 在 DirectX 诊断工具中,你可以查看计算机的基本信息(如操作系统、处理器、内存等)。
在 Windows 11 中,查看 SMBIOS 信息的最常用方法是通过系统信息(msinfo32),使用 wmic 或 PowerShell 命令,或者通过第三方工具(如 CPU-Z 或 HWiNFO)。如果你需要更详细的硬件配置,第三方工具可能提供更多的信息,而如果只是想快速查看基础的 BIOS 或系统信息,msinfo32 或命令行工具足够用。
虽然 Windows 注册表 (.reg 文件) 本身并不存储完整的 SMBIOS 信息,但你可以通过 .reg 文件创建或修改某些键值,间接存储或访问一些硬件信息(如序列号、主板型号等)。这种方式主要是通过手动编辑注册表的特定位置,将一些硬件信息记录下来。下面是一些方法和示例。
1. 通过 PowerShell 或 WMIC 获取 SMBIOS 信息并存储到注册表
首先,您可以使用 PowerShell 或 WMIC 获取 SMBIOS 信息,然后将这些信息存储到注册表中。你可以创建一个 .reg 文件来将这些信息保存到注册表中,之后就可以通过该信息进行间接访问。
通过 PowerShell 获取硬件信息并存储到注册表
- 使用 PowerShell 查询硬件信息并存储到注册表:
以下是一个 PowerShell 脚本,查询一些常见的硬件信息(如主板型号、BIOS(Basic Input Output System) 版本、序列号等),并将它们存储到注册表。
# 获取硬件信息
$biosVersion = (Get-WmiObject -Class Win32_BIOS).Version
$motherboardModel = (Get-WmiObject -Class Win32_BaseBoard).Product
$serialNumber = (Get-WmiObject -Class Win32_BIOS).SerialNumber
# 定义注册表路径
$regPath = "HKCU:\Software\MyHardwareInfo"
# 创建注册表键值并保存硬件信息
if (-not (Test-Path $regPath)) {
New-Item -Path $regPath -Force
}
Set-ItemProperty -Path $regPath -Name "BIOSVersion" -Value $biosVersion
Set-ItemProperty -Path $regPath -Name "MotherboardModel" -Value $motherboardModel
Set-ItemProperty -Path $regPath -Name "SerialNumber" -Value $serialNumber
Write-Host "硬件信息已存储到注册表路径:$regPath"
执行此脚本后,你会在注册表中的路径 HKCU\Software\MyHardwareInfo 下看到保存的硬件信息(如 BIOS(Basic Input Output System) 版本、主板型号和序列号)。这些信息可以通过手动查询注册表来访问。
2. 手动创建 .reg 文件
你也可以手动创建 .reg 文件,使用固定的硬件信息值存储到注册表中。以下是一个 .reg 文件的示例,它将硬件信息存储到注册表中的自定义位置:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\MyHardwareInfo]
"BIOSVersion"="1.0.0.123"
"MotherboardModel"="MSI B450 TOMAHAWK"
"SerialNumber"="1234567890ABC"
保存为 .reg 文件后,双击它就能将这些键值添加到注册表中。然后,你可以在注册表的路径 HKEY_CURRENT_USER\Software\MyHardwareInfo 下找到这些信息。
3. 查询和访问注册表中的硬件信息
如果你已经通过 PowerShell 或手动 .reg 文件将信息存储到了注册表中,可以使用注册表编辑器来查看这些信息,也可以通过其他方式访问。
使用 PowerShell 访问注册表中的硬件信息:
# 读取注册表中的硬件信息
$regPath = "HKCU:\Software\MyHardwareInfo"
$biosVersion = (Get-ItemProperty -Path $regPath).BIOSVersion
$motherboardModel = (Get-ItemProperty -Path $regPath).MotherboardModel
$serialNumber = (Get-ItemProperty -Path $regPath).SerialNumber
Write-Host "BIOS Version: $biosVersion"
Write-Host "Motherboard Model: $motherboardModel"
Write-Host "Serial Number: $serialNumber"
4. 注意事项
- 硬件信息不自动更新: 如果你将硬件信息存储在注册表中,它不会自动更新。如果硬件信息(如 BIOS(Basic Input Output System) 版本或主板型号)发生变化,必须手动更新注册表或通过脚本自动化更新。
- 硬件信息源: 如果你需要实时获取最新的 SMBIOS 数据,建议直接使用 WMIC、PowerShell 或第三方工具(如 HWiNFO、Speccy)来查询,而不通过注册表。
通过 .reg 文件,您可以将硬件信息(如 BIOS(Basic Input Output System) 版本、主板型号、序列号等)存储到注册表中,间接实现对这些信息的访问。不过,需要注意的是,注册表不直接包含 SMBIOS 数据,且这种方式更多适合保存静态信息。如果需要实时的 SMBIOS 数据,使用 wmic 或 PowerShell 查询是更为常见且高效的方法。
bcdedit 是 Windows 操作系统中一个命令行工具,用于管理启动配置数据 (BCD),它控制着系统的启动和引导过程。通过 bcdedit 命令,您可以查看、修改和配置操作系统的启动设置。
下面是一些常见的 bcdedit 命令及其功能:
bcdedit /enum:列出当前系统的所有启动项及其配置信息。
bcdedit /default:显示或设置默认启动项。
bcdedit /timeout:显示或设置启动菜单倒计时时间。
bcdedit /set {标识符} 属性 值:设置指定启动项的属性值,其中 {标识符} 是启动项的唯一标识符,例如 {current} 表示当前正在使用的启动项。
bcdedit /copy {标识符} /d "新启动项名称":复制一个现有的启动项,并为复制项指定一个新的名称。
bcdedit /delete {标识符}:删除指定的启动项。
对于查看 UEFI 启动项的信息,bcdedit 命令可用于列出当前系统中的启动配置数据 (BCD)。UEFI 启动项通常存储在 BCD 中,并包含有关系统启动的相关信息。
要查看 UEFI 启动项的信息,可以执行以下步骤:
以管理员权限打开命令提示符或 PowerShell。
运行以下命令:bcdedit /enum firmware
这将列出保存在 BCD 中的 UEFI 启动项。每个启动项都会有一个唯一的标识符(如{default})以及其他属性,如启动设备、启动路径等。
------------
msinfo32 是 Windows 操作系统中的一个系统信息工具,它可以提供有关计算机硬件、软件和操作系统的详细信息。通过运行 msinfo32 命令,您可以轻松获取许多与系统相关的信息。
要使用 msinfo32 工具,请按照以下步骤进行操作:
打开运行对话框。您可以按下 Win + R 快捷键来打开运行对话框。
在运行对话框中,输入 msinfo32,然后按下 Enter 键或单击“确定”按钮。
这将打开系统信息窗口,其中包含有关计算机的各种信息分类,如系统摘要、硬件资源、组件、软件环境等。
您可以在左侧的导航窗格中选择不同的分类,并在右侧窗格中查看相应的详细信息。
系统信息工具(msinfo32)提供了大量系统和硬件的详细信息,包括操作系统版本、计算机型号、处理器信息、内存、磁盘驱动器、网络适配器等。
请注意,您需要以管理员权限运行 msinfo32,以便获取所有系统信息。
------------
打开注册表编辑器。可以在运行(Win + R)中输入"regedit"来打开注册表编辑器。
在注册表编辑器中,导航到以下路径:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS
|
具体内容在
这些信息有助于操作系统了解硬件的底层配置和驱动程序要求。 常见子项在
作用和用途
如何查看要查看
注意事项
|
------------
使用系统信息工具(msinfo32):
按下 Win + R 组合键打开运行对话框。
输入 msinfo32 并按下 Enter 键。
在系统信息窗口中,导航到“BIOS版本/日期”字段,其中包含了UEFI固件的版本和日期信息。
使用命令提示符或 PowerShell 命令:
以管理员权限打开命令提示符或 PowerShell。
运行以下命令:wmic bios get smbiosbiosversion
这将显示安装在计算机上的UEFI固件的版本号。
使用系统信息工具(dxdiag):
按下 Win + R 组合键打开运行对话框。
输入 "dxdiag" 并按下 Enter 键。
在 "系统" 选项卡中,您可以找到 "BIOS" 字段,其中包含了UEFI固件的版本信息。
使用命令提示符或 PowerShell 命令:
以管理员权限打开命令提示符或 PowerShell。
运行以下命令:systeminfo | findstr /i "BIOS"
这将显示有关BIOS(Basic Input Output System)或固件的信息,其中可能包括UEFI固件的版本号。
使用系统信息工具:
按下 Win + R 组合键打开运行对话框。
输入 msinfo32 并按下回车键打开系统信息工具。
在系统信息窗口中,查找 "BIOS(Basic Input Output System) 版本/日期" 字段。这里显示的就是你的 UEFI BIOS(Basic Input Output System) 的版本信息。
使用命令提示符(CMD):
按下 Win + R 组合键打开运行对话框。
输入 cmd 并按下回车键打开命令提示符窗口。
在命令提示符窗口中输入以下命令并按下回车键:
wmic bios get smbiosbiosversion
系统会显示 UEFI BIOS(Basic Input Output System) 的版本信息。
使用 PowerShell:
按下 Win + R 组合键打开运行对话框。
输入 powershell 并按下回车键打开 PowerShell 窗口。
在 PowerShell 窗口中输入以下命令并按下回车键:
Get-WmiObject -Class Win32_BIOS | Select-Object SMBIOSBIOSVersion
PowerShell 将显示 UEFI BIOS(Basic Input Output System) 版本信息。
使用命令行工具(如 PowerShell):
打开 PowerShell 窗口,并输入以下命令来获取更详细的 BIOS 信息:
Get-WmiObject -Class Win32_ComputerSystemProduct | Select-Object Name, IdentifyingNumber, Version
C:\Windows\Panther
|
主要功能
文件夹中的文件
这些日志文件通常会记录非常详细的技术信息,适合用来进行故障排查或在操作系统安装失败时进行分析。 为什么存在这个文件夹?
是否可以删除
|
|
以下是该文件夹中常见文件和子文件夹的详细说明: 1. Contents0.dir
2. DDACLSys.log
3. diagerr.xml
4. diagwrn.xml
5. FastCleanup
6. MainQueueOnline0.que
7. setup.etl
8. setup.exe
9. setupact.log
10. setuperr.log
11. setupinfo
12. UnattendGC
|
bcdedit /enum {current}
\Windows\system32\winload.efi
winload.efi 是 Windows 操作系统中的一个重要文件,它是用于启动和加载操作系统内核的组件。
在使用 UEFI(Unified Extensible Firmware Interface)引导的计算机上,winload.efi 是位于 EFI 系统分区(ESP,EFI System Partition)上的一个文件。EFI 系统分区通常是一个 FAT32 格式的分区,其中存储着操作系统引导所需的文件。
具体来说,当计算机启动时,UEFI 固件将搜索 EFI 系统分区,并在其中查找可启动的操作系统。而 winload.efi 文件则会被引导程序(例如 bootloader)调用,负责加载 Windows 内核(ntoskrnl.exe)以及其他相关文件。
值得注意的是,winload.efi 是针对 UEFI 引导的系统。在传统 BIOS 引导的系统中,相应的文件是 winload.exe,它位于主引导记录(MBR)中的活动分区。
总结一下,winload.efi 是用于 UEFI 引导的 Windows 操作系统中负责加载内核的文件。
bcdedit /enum firmware
\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI 是 Windows 操作系统中 UEFI 引导的关键文件路径。这是 UEFI 固件在启动过程中寻找并执行的主要引导程序。
具体来说,\EFI\MICROSOFT\BOOT\ 是存储 Windows 引导文件的默认目录,而 BOOTMGFW.EFI 文件是 Windows 的主要 UEFI 引导加载程序。当计算机启动时,UEFI 固件会在 UEFI 分区中搜索 \EFI\MICROSOFT\BOOT\BOOTMGFW.EFI 文件,并执行它以启动 Windows 操作系统。
请注意,该文件路径可能会因不同的 Windows 版本和系统安装配置而有所变化。但在大多数情况下,\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI 是 Windows UEFI 引导文件的默认位置。

浙公网安备 33010602011771号