如何在 CMD 和 PowerShell 中查看 HWID 序列号:Windows 硬件 ID 详解
在 CMD 和 PowerShell 中查看 HWID 序列号,包括 SMBIOS UUID、主板、BIOS、硬盘、内存、CPU ProcessorId、MAC 和 MachineGuid,并了解示例输出及各项数值会在什么情况下发生变化。
HWID Checker · 2026年9月4日 · 6 分钟阅读
不存在一条命令可以直接显示“你的 HWID”。在打开命令行窗口开始输入之前,首先要明确这一点。Windows 并不存储某个唯一的硬件 ID,而是提供十余种彼此独立的标识符:固件 UUID、主板序列号、BIOS 序列号、每块硬盘的序列号、每根内存条的序列号、CPU 特征值、每个网络适配器的 MAC 地址,以及若干由软件生成的 GUID。凡是提到“你的 HWID”的程序,都会自行选取其中一部分数值,再按自己的方式组合。
因此,用户搜索如何在 CMD 中查看 HWID 序列号时,真正需要的是一份清单:有哪些序列号、分别用什么命令读取、输出是什么样,以及哪些操作会让数值发生变化。本文正是这样一份指南。内容同时涵盖传统命令提示符(cmd.exe)和 PowerShell,因为在当前版本的 Windows 中,两者都需要用到:一些旧 CMD 命令依赖 wmic,而微软已将其从 Windows 11 的默认安装中移除,官方支持的替代方案是 PowerShell cmdlet(命令),即专为 PowerShell 设计的轻量命令。
本文所有操作均为只读查询。这些命令只读取 Windows 和固件已经公开的数据;不会修改、随机化或伪造任何标识符。截至 2026 年 9 月 4 日,文中命令已根据微软有关 Windows 10 22H2 和 Windows 11 24H2/25H2 的文档核对。
快速查询:完整命令表
如果只想查命令,直接看下表即可。每一行对应一种标识符。“旧版 CMD”一列保留了旧式 wmic 写法,方便对照论坛中的历史内容;现在应优先使用 PowerShell 一列的命令。
| 标识符 | 存储位置 | PowerShell(推荐) | 旧版 CMD(Windows 11 上可能不存在) |
|---|---|---|---|
| SMBIOS system UUID(系统 UUID) | 主板固件 | (Get-CimInstance Win32_ComputerSystemProduct).UUID | wmic csproduct get uuid |
| 系统序列号 | 固件(OEM) | (Get-CimInstance Win32_ComputerSystemProduct).IdentifyingNumber | wmic csproduct get identifyingnumber |
| BIOS 序列号 | 固件 | (Get-CimInstance Win32_BIOS).SerialNumber | wmic bios get serialnumber |
| 主板序列号 | 基板固件表 | (Get-CimInstance Win32_BaseBoard).SerialNumber | wmic baseboard get serialnumber |
| 机箱序列号 | 机箱固件表 | (Get-CimInstance Win32_SystemEnclosure).SerialNumber | wmic systemenclosure get serialnumber |
| 物理硬盘序列号 | 硬盘固件 | Get-PhysicalDisk | Select-Object FriendlyName, SerialNumber | wmic diskdrive get model,serialnumber |
| 卷序列号(非硬件) | 文件系统头 | (Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'").VolumeSerialNumber | vol C: |
| 内存模块序列号 | DIMM SPD 芯片 | Get-CimInstance Win32_PhysicalMemory | Select-Object DeviceLocator, SerialNumber | wmic memorychip get devicelocator,serialnumber |
| CPU ProcessorId(处理器标识) | CPUID 指令 | (Get-CimInstance Win32_Processor).ProcessorId | wmic cpu get processorid |
| MAC 地址 | 网络适配器固件/驱动程序 | Get-NetAdapter | Select-Object Name, MacAddress, Status | getmac /v |
| 显示器序列号(EDID,扩展显示标识数据) | 显示器固件 | 参见显示器一节 | 无 |
| MachineGuid(Windows 安装实例标识) | 注册表,由 Windows 安装时设置 | (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Cryptography').MachineGuid | reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid |
| Windows 产品 ID | 注册表/许可证 | (Get-CimInstance Win32_OperatingSystem).SerialNumber | wmic os get serialnumber |
| ComputerHardwareIds(计算机硬件 ID 集合) | 注册表,由 SMBIOS 派生 | (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\SystemInformation').ComputerHardwareIds | reg query "HKLM\SYSTEM\CurrentControlSet\Control\SystemInformation" /v ComputerHardwareIds |
下文会逐项说明:这个值是什么、正常结果和异常结果分别是什么样,以及哪些操作会改变它。如果只准备阅读一个章节,请看哪些序列号实际构成“HWID”。
CMD 还是 PowerShell?同一个命令行窗口中的两种语言
cmd.exe 和 PowerShell 都是文本控制台。在 Windows 11 中,两者通常也都运行在同一个 Windows 终端应用内,因此很容易让人误以为命令可以混用。实际并非如此。
cmd.exe运行批处理风格的命令,例如dir、reg、vol、getmac、systeminfo,以及过去常用的wmic。它没有对象管道,输出只是纯文本。- PowerShell(Windows 自带 Windows PowerShell 5.1;PowerShell 7 需单独安装)运行
Get-CimInstance、Get-PhysicalDisk等 cmdlet(命令)。输出是对象,可以使用Select-Object筛选。
这一区别对查询 HWID 很重要,原因在于 wmic.exe。几乎所有 2024 年以前编写的“在 CMD 中查看 HWID”教程,都会使用 wmic csproduct get uuid、wmic bios get serialnumber 等命令。WMIC(WMI 命令行工具)于 2016 年被弃用,后来成为 Windows 11 24H2 中默认禁用的可选“按需功能”,并正在被彻底移除。在全新安装的 Windows 11 上,通常会看到:
'wmic' is not recognized as an internal or external command,
operable program or batch file.
底层 WMI(Windows Management Instrumentation,Windows 管理规范)类仍然存在,例如 Win32_BIOS、Win32_BaseBoard 等;消失的只是旧命令行客户端。因此,本文所有 PowerShell 命令均使用 Get-CimInstance:它通过受支持的 CIM(Common Information Model,通用信息模型)接口读取相同的类。如果现有脚本仍离不开 wmic,请参阅 WMIC 故障排查指南,其中详细介绍了迁移方法。
使用 PowerShell 命令并不需要退出 CMD。 本文中的任何 PowerShell 单行命令都可以从命令提示符或 .bat 文件中执行,只需按以下方式封装:
powershell -NoProfile -Command "(Get-CimInstance Win32_BaseBoard).SerialNumber"
我们的可下载 BAT 脚本采用的正是这种方式:它是一个纯文本批处理文件,针对每种标识符调用一次 PowerShell,因此运行前可以逐行查看内容。
是否需要管理员权限? 本文所有操作都不需要。读取 SMBIOS 表、硬盘序列号、内存 SPD 数据、CPUID 和相关注册表项,在标准用户会话中均可完成。如果命令返回 Access denied,基本可以确定你是在查询远程计算机,或受到企业策略限制,而不是遇到了普通的本机权限问题。
SMBIOS system UUID(系统 UUID)
它是什么。 这是一个 128 位标识符,由主板厂商写入 SMBIOS System Information(系统信息)表(类型 1)。在没有进一步限定的情况下,人们所说的“HWID”最常指这个值,因为它位于固件层,重装操作系统后仍会保留,而且读取方便。
(Get-CimInstance Win32_ComputerSystemProduct).UUID
典型输出:
4C4C4544-0034-5A10-8047-B8C04F4E3232
如何理解这个值。 在戴尔计算机上(如上例),UUID 的一部分由服务标签派生,因此两台戴尔设备不会使用同一个 UUID。许多消费级主板则会在出厂时写入一个随机值。无论哪种情况,它都不是秘密信息——任何拥有本机访问权限的人都能读取,也没有经过加密。
异常结果及其含义。
00000000-0000-0000-0000-000000000000或FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF——固件没有填写该字段。这种情况常见于部分低端主板、更换过 BIOS 芯片的计算机,以及采用精简 SMBIOS 配置的某些虚拟机。03000200-0400-0500-0006-000700080009——参考 BIOS 中一个广为人知的默认占位值。它并不唯一,有数千块主板都会报告这个值。- 空白——通常表示虚拟化平台未提供 UUID。
什么会改变它。 更换主板。正常刷新 BIOS 通常会保留该值,但某些主板在完全重置 CMOS/NVRAM 后,或服务中心更换主板后,可能会生成新值。重装 Windows 不会改变它。在虚拟机中,该值由虚拟机监控程序设置;克隆虚拟机时是否重新生成,则取决于具体平台。
查询这个类时还可以读取 IdentifyingNumber,即 OEM 系统序列号,也就是笔记本电脑底部标签上印刷的同一串字符:
Get-CimInstance Win32_ComputerSystemProduct |
Select-Object Vendor, Name, IdentifyingNumber, UUID
BIOS 序列号
它是什么。 这是通过 Win32_BIOS 类读取的、由 SMBIOS System Information 表报告的序列号。在品牌整机和笔记本电脑上,它几乎总是与上文的 IdentifyingNumber 相同。对于自行组装的台式机,它取决于主板厂商写入了什么,而这个值往往没有实际用途。
(Get-CimInstance Win32_BIOS).SerialNumber
以下是从有效到无效的典型输出:
5CG1234XYZ ← HP laptop, real serial
To Be Filled By O.E.M. ← common on ASRock/ASUS retail boards
Default string ← common on MSI/Gigabyte retail boards
System Serial Number ← another placeholder
后三种并不是报错。零售主板本来就是供其他人组装整机的,因此主板厂商会将“系统”序列号留给系统集成商填写,而实际通常无人填写。任何依赖 BIOS 序列号作为唯一键的软件,都会把所有这类计算机视为同一台设备;这确实会造成“硬件重复”误报。
什么会改变它。 与 UUID 相同:更换主板。正常情况下,更新 BIOS 不会改变它。
主板(baseboard)序列号
它是什么。 这是 SMBIOS Baseboard(基板)表(类型 2)中的序列号。与 BIOS/系统序列号不同,零售主板通常会填写这一项,因为它标识的是主板本身,而不是组装后的整机。
Get-CimInstance Win32_BaseBoard |
Select-Object Manufacturer, Product, SerialNumber
典型输出:
Manufacturer Product SerialNumber
------------ ------- ------------
ASUSTeK COMPUTER INC. ROG STRIX B650-A 230412345678901
异常结果。 To Be Filled By O.E.M.、Default string、None,或全部为零的序列号。相比 BIOS 序列号,这种情况不算常见,但在非常便宜的主板上仍会出现;某些技嘉主板在更新固件前也会将序列号显示为 Default string。
什么会改变它。 只有更换主板才会改变。这也是反作弊系统和许可证系统通常最看重主板序列号与 SMBIOS UUID 的原因。
机箱(系统外壳)序列号
它是什么。 这是 SMBIOS Chassis(机箱)表(类型 3)中的序列号。在笔记本电脑和 OEM 台式机上,它通常与系统序列号一致。在自行组装的电脑上,它几乎总是占位值,因为机箱没有固件,主板厂商也无从知道用户购买了哪款机箱。
(Get-CimInstance Win32_SystemEnclosure).SerialNumber
可以将其视为辅助值。本文之所以收录,是因为某些 HWID 工具会读取它;看到 Default string 时不必意外。
物理硬盘序列号,以及为什么 vol 查到的不是它
这部分最容易混淆,因为 Windows 提供了两种完全不同的值,而人们都将其称为“硬盘序列号”。
硬件序列号(通常需要查这个)
每块 SSD 和 HDD 都有由厂商分配并存储在硬盘固件中的序列号。该号码印在硬盘标签上,也会通过 SATA 或 NVMe Identify 命令报告。
在当前版本的 Windows 中,最可靠的读取方式是使用 Storage 模块:
Get-PhysicalDisk | Select-Object DeviceId, FriendlyName, MediaType, SerialNumber
典型输出:
DeviceId FriendlyName MediaType SerialNumber
-------- ------------ --------- ------------
0 Samsung SSD 990 PRO 2TB SSD S6Z2NJ0T123456A
1 WDC WD40EZAZ-00SF3B0 HDD WD-WX12D34ABCDE
传统 WMI 类也可以使用,旧版 wmic diskdrive 命令调用的正是这个类:
Get-CimInstance Win32_DiskDrive | Select-Object Model, SerialNumber
实际使用中会遇到的特殊情况。
- 开头或结尾有空格。 某些驱动程序会用空格将序列号填充到固定宽度。比较前应使用
.Trim(),否则可能出现无意义的不匹配。 - 旧系统上的十六进制字节交换。 在 Windows 7 及更早版本中,
Win32_PhysicalMedia返回的是十六进制序列号,其中每对字符的顺序会被互换。当前版本 Windows 返回正常字符串;但如果正在与多年前记录的值比较,这就是旧值看起来顺序混乱的原因。 - USB、RAID 或部分 NVMe 硬盘返回空白。 RAID 控制器后方的硬盘向系统报告的是控制器创建的虚拟磁盘,而不是物理硬盘;USB 硬盘盒有时也会隐藏内部硬盘的序列号。
Get-PhysicalDisk在这方面通常优于Win32_DiskDrive,但两者都无法穿透硬件 RAID 查看物理盘。 - 虚拟机。 虚拟机监控程序会分配合成序列号;重新创建虚拟磁盘后,该值会发生变化。
什么会改变它。 只有更换硬盘。格式化、重新分区、克隆到新硬盘(克隆盘使用新硬盘自身的序列号)和重装 Windows 都不会改变它,更新固件也不会。
卷序列号(通常不是需要的值)
vol C:
Volume in drive C is Windows
Volume Serial Number is 8A3F-1C2B
这个 8 位十六进制数是在格式化卷时写入文件系统头的。它不存储在硬盘固件中,与硬件本身无关。重新格式化分区就会得到新值;如果逐扇区克隆硬盘,克隆盘则会保留与原盘相同的卷序列号。
较早的许可证机制(部分来自 20 世纪 90 年代和 21 世纪初)确实会绑定 C: 卷序列号,因此 HWID 相关讨论中至今仍会提到它。现代反作弊和 DRM 通常会忽略这个值,原因正是它很容易改变。如果某个工具将类似 8A3F-1C2B 的值显示为“硬盘序列号”,它读取的是卷序列号,而不是物理硬盘序列号。
如需在脚本中使用,对应的 PowerShell 命令如下:
(Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'").VolumeSerialNumber
该命令返回不带连字符的 8A3F1C2B。
内存模块序列号
它是什么。 每根内存模块都有一颗 SPD(Serial Presence Detect,串行存在检测)芯片,其中存储部件编号、厂商信息,并且大多数模块还存有序列号。Windows 通过 Win32_PhysicalMemory 提供这些数据。
Get-CimInstance Win32_PhysicalMemory |
Select-Object DeviceLocator, Manufacturer, PartNumber, SerialNumber
典型输出:
DeviceLocator Manufacturer PartNumber SerialNumber
------------- ------------ ---------- ------------
DIMM_A2 Corsair CMK32GX5M2B5600C36 00000000
DIMM_B2 Corsair CMK32GX5M2B5600C36 00000000
请注意其中的序列号。消费级内存返回 00000000、空白,或每根内存都返回相同数值的情况非常常见。有些厂商不写入序列号,有些主板则不会通过 SMBIOS 传递 SPD 序列号字段。服务器和工作站内存更有可能报告真实且唯一的序列号。
什么会改变它。 增加、移除或更换内存模块。更改 XMP/EXPO 配置不会改变它。还要注意,DeviceLocator(插槽名称)由主板决定;即使序列号本身不变,将同一组内存换到其他插槽也会改变插槽与序列号之间的对应关系。一些设计简单的 HWID 实现容易在这里出错。
CPU ProcessorId:它并不是序列号
它是什么。 Windows 根据 CPUID 指令生成的 16 位十六进制值,由处理器特征签名(系列、型号、步进)和功能标志组成。
Get-CimInstance Win32_Processor | Select-Object Name, ProcessorId
Name ProcessorId
---- -----------
AMD Ryzen 7 7800X3D 8-Core Processor 178BFBFF00A60F12
这里有一点几乎所有 HWID 教程都会说错:ProcessorId 并非每颗芯片独有。 只要步进和微代码可见的功能集相同,每颗 Ryzen 7 7800X3D 都会返回相同的 178BFBFF00A60F12。出于隐私方面的反对意见,英特尔在 2000 年 Pentium III 之后就从 CPUID 中移除了逐芯片处理器序列号(PSN);AMD 则从未提供过这种序列号。如今 Windows 报告的是型号标识,而不是单颗芯片标识。
这并不代表它毫无用处。在复合哈希中,它仍是一个稳定的组成部分:除非将 CPU 更换为其他型号,否则不会改变,也有助于区分计算机的整体配置。只是单独使用时,它无法从所有采用同款处理器的计算机中识别出某一台设备。
什么会改变它。 将 CPU 更换为其他型号或步进。理论上,改变所报告功能标志的微代码更新也可能改动低位,但实际很少发生。
MAC 地址
它是什么。 写入每个网络适配器的 48 位地址,以六组十六进制数显示。有线以太网、Wi-Fi 和蓝牙适配器各自拥有独立地址。
下面这条纯 CMD 命令目前仍然有效,值得记住:
getmac /v /fo list
PowerShell 可以在同一视图中显示适配器名称和状态:
Get-NetAdapter | Select-Object Name, InterfaceDescription, MacAddress, Status
Name InterfaceDescription MacAddress Status
---- -------------------- ---------- ------
Ethernet Realtek Gaming 2.5GbE Family Controller 04-42-1A-9B-3C-7D Up
Wi-Fi Intel(R) Wi-Fi 6E AX211 160MHz A0-B1-C2-D3-E4-F5 Up
对 HWID 有影响的特殊情况。
- 虚拟适配器。 VPN 客户端、Hyper-V、VMware、WSL2 和 Docker 都会添加各自带有 MAC 地址的虚拟适配器。这些适配器会随软件安装或卸载而出现、消失,因此包含“所有 MAC 地址”的 HWID 并不稳定。可以使用
Get-NetAdapter -Physical筛选物理适配器。 - 随机硬件地址。 Windows 10 和 11 可以按网络随机化 Wi-Fi MAC(设置 → 网络和 Internet → Wi-Fi → 随机硬件地址)。启用后,同一个 Wi-Fi 适配器在不同网络中显示的 MAC 会有所不同。有线适配器不受此设置影响。
- 管理员可修改。 大多数驱动程序都允许在设备管理器 → 高级 → 网络地址中覆盖 MAC。这是正规且有文档说明的功能,并非破解手段;也正因如此,单独使用 MAC 作为标识符并不可靠。
什么会改变它。 更换适配器、启用 Wi-Fi 随机化、设置驱动程序覆盖值,或添加/移除虚拟化软件(针对虚拟适配器)。
通过 EDID 读取显示器序列号
大多数 HWID 指南都会略过这一项,但某些反作弊系统确实会读取,因此完整清单应当包含它。每台显示器都会向显卡发送一块 EDID(Extended Display Identification Data,扩展显示标识数据),用于说明自身信息;其中包含厂商代码,通常也包含序列号。
Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorID | ForEach-Object {
[PSCustomObject]@{
Manufacturer = -join [char[]]($_.ManufacturerName -ne 0)
Model = -join [char[]]($_.UserFriendlyName -ne 0)
Serial = -join [char[]]($_.SerialNumberID -ne 0)
}
}
Manufacturer Model Serial
------------ ----- ------
DEL DELL S2721DGF 9X2Y3Z4
这些字段是以零填充的字节数组,因此上述代码片段会将其转换为字符并丢弃零值。有些显示器(尤其是低价型号)会报告序列号 0,或整个生产批次共用的同一个值。
什么会改变它。 更换显示器。更换线缆或端口不会改变。
MachineGuid:更换硬件后仍保留的软件 ID
它是什么。 这是 Windows 安装时生成并存储在 HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid 中的 GUID。它不是硬件信息。MachineGuid 是 Windows 软件中使用最广泛的“计算机标识符”,因为读取非常方便,而且无论更换什么硬件组件,它都会保持不变。
纯 CMD:
reg query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
MachineGuid REG_SZ 7e3a1b2c-4d5e-4f60-9a7b-8c9d0e1f2a3b
PowerShell:
(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Cryptography').MachineGuid
什么会改变它。 重装 Windows(全新安装;就地升级或保留注册表配置单元的“重置”不算)。将磁盘映像还原到另一台计算机时,相同的 MachineGuid 会随映像进入新硬件。因此,采用映像部署的组织有时会发现,仅以此值作为键的软件将数百台计算机识别为“同一台”。
MachineGuid 会在重装系统时改变,却不会随硬件更换而改变,其表现与固件 UUID 正好相反。严谨的 HWID 实现会同时使用两者,从而避免仅凭一次重装或一次组件更换就将设备认定为“新”计算机。
Windows 产品 ID
它是什么。 这是设置 → 系统 → 系统信息中显示的 xxxxx-xxxxx-xxxxx-AAOEM 格式字符串。它标识的是 Windows 许可证渠道和安装实例,而不是硬件。
(Get-CimInstance Win32_OperatingSystem).SerialNumber
之所以在本文列出,是因为很多“查看 HWID”的批处理文件都包含 wmic os get serialnumber,用户容易误以为它是硬件序列号。事实并非如此;重装系统后它会变化,有时更改版本或重新激活后也会变化。
ComputerHardwareIds:微软自己的硬件 ID
这一项在驱动开发领域之外很少被提及,却是 Windows 中最接近官方“HWID”的内容。
Windows 更新使用一组称为 Computer Hardware IDs(计算机硬件 ID)的 GUID,将固件和驱动程序包定向提供给特定系统。这些 GUID 由 SMBIOS 多个字段的不同组合经哈希计算得出,包括厂商、产品名称、SKU、产品系列、BIOS 厂商和版本、基板信息等,并存储在注册表中:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\SystemInformation" /v ComputerHardwareIds
(Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\SystemInformation').ComputerHardwareIds
{a8b1c2d3-e4f5-5a6b-9c8d-7e6f5a4b3c2d}
{b9c2d3e4-f5a6-5b7c-8d9e-6f5a4b3c2d1e}
{c0d3e4f5-a6b7-5c8d-9e0f-5a4b3c2d1e0f}
...
这些值标识的是机型层级,而不是单台设备层级:两台型号相同且 BIOS 版本相同的笔记本会生成同一组值。不过,当其他数据看起来像占位符时,它们可以作为有效的合理性检查,因为这些值也派生自 HWID 工具会读取的固件字符串。如果多台计算机的每个 ComputerHardwareId 都相同,它们几乎可以确定还存在上文所述的 SMBIOS UUID 重复问题,或 To Be Filled By O.E.M. 占位值问题。
Windows Driver Kit 附带 ComputerHardwareIds.exe,它会显示同一列表,以及参与每项哈希计算的具体 SMBIOS 字段。需要精确了解系统公开了哪些固件字符串时,这个工具很有帮助。
哪些序列号实际构成“HWID”?
现在回到这两类搜索背后的核心问题。已经读取了十余种数值,其中哪一个才是 HWID?
没有任何一项单独是 HWID。反作弊系统、许可证服务器和设备管理工具所说的 HWID,通常是由上述多项数值计算出的哈希;每家厂商选择的字段和哈希方法各不相同。这就是我们编写 HWID 格式指南的原因,也解释了为什么不能直接比较不同程序生成的值。
根据公开文档和逆向分析文章,可以大致归纳出各项数值通常所占的权重:
| 标识符 | 常见权重 | 原因 |
|---|---|---|
| 主板序列号、SMBIOS UUID | 高 | 重装操作系统后仍保留,仅更换主板时变化 |
| 物理硬盘序列号(系统盘) | 高 | 稳定、唯一、读取成本低 |
| MachineGuid | 中到高 | 可识别重装,但克隆映像会共用该值 |
| CPU ProcessorId | 中 | 稳定,但同型号的每颗芯片都会共用 |
| 物理 MAC 地址 | 低到中 | 容易覆盖,Wi-Fi 还可随机化 |
| 内存序列号 | 低 | 消费级内存经常为零或重复 |
| 显示器 EDID 序列号 | 低 | 部分反作弊系统会读取,但外设经常更换 |
| 卷序列号 | 很低 | 每次格式化都会变化 |
| BIOS/机箱序列号 | 视情况而定 | OEM 整机上很可靠,零售主板上往往只是占位符 |
由此可以得出两个实际结论:
- 对于设计合理的系统,更换一个组件通常不会导致 HWID 改变。 大多数实现会容忍一定数量的字段变化,超过阈值后才将其视为新设备。更换 GPU 通常不会改变任何结果——本文没有列出 GPU,原因正是显卡不会通过 WMI 提供序列号。
- 重装 Windows 会改变 MachineGuid 和卷序列号,但不会改变任何固件层数值。 如果想知道为什么封禁或许可证锁定在重装后仍然存在,原因就在这里:主板、硬盘和 UUID 都没有变化。HWID 封禁指南进一步说明了这在实际使用中的含义。
一次读取所有信息
手动运行 14 条命令,偶尔一次并不麻烦。如果需要生成一份报告以便保存或日后比较,有以下三种只读方案。
可直接粘贴的 PowerShell 代码块。 下面的代码会显示高权重数值,并原样保留占位值,方便确认固件实际报告的内容:
$csp = Get-CimInstance Win32_ComputerSystemProduct
$bb = Get-CimInstance Win32_BaseBoard
[PSCustomObject]@{
SmbiosUuid = $csp.UUID
SystemSerial = $csp.IdentifyingNumber
BiosSerial = (Get-CimInstance Win32_BIOS).SerialNumber
BoardSerial = $bb.SerialNumber
BoardProduct = $bb.Product
DiskSerials = (Get-PhysicalDisk | ForEach-Object { $_.SerialNumber.Trim() }) -join ', '
CpuId = (Get-CimInstance Win32_Processor).ProcessorId
PhysicalMacs = (Get-NetAdapter -Physical | ForEach-Object MacAddress) -join ', '
MachineGuid = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Cryptography').MachineGuid
} | Format-List
BAT 脚本。 如果希望先检查文件内容再运行,可下载的 .bat是一个纯文本批处理文件,它会针对每种标识符各执行一次 PowerShell 查询,并在结束时暂停。它不使用 wmic,不计算哈希,也不会向磁盘写入任何内容。
EXE 程序。 Windows 版 HWID Checker会读取相同的标识符,并额外读取内存和卷序列号,然后将其全部显示出来;它还会对稳定字段计算 SHA-256,以便得到一条可以跨时间比较的字符串。这是一个便携式控制台应用程序——双击运行、查看结果、按 Enter 键退出。它生成的哈希是我们定义的复合值,不是任何游戏或许可证服务器使用的值。这个工具用于检查自己的计算机当前读取结果是否与上个月相同,不能预测其他软件会算出什么。下载页面公布了可执行文件本身的 SHA-256,运行前可以据此验证文件。
常见问题
为什么我的结果与朋友使用的“HWID checker”工具不同? 因为没有统一标准。对方的工具对另一组字段进行了哈希计算。应比较本文列出的原始数值,而不是哈希。
我的主板和 BIOS 序列号都显示 To Be Filled By O.E.M.,这是故障吗?
不是。你使用的是零售主板,而系统集成商(也就是你自己)从未填写 OEM 字段。部分主板厂商提供可以设置这些字段的 DMI 编辑工具,但通常没有必要这样做。
可以在无法亲自接触的计算机上查看这些值吗?
可以,但需要具备相应权限:Get-CimInstance -ComputerName <name> Win32_BaseBoard 可以通过 WinRM 或 DCOM 执行。本文中所有使用 Get-CimInstance 的命令都接受 -ComputerName 或 -CimSession 参数。
systeminfo 会显示 HWID 序列号吗?
不会。它会显示厂商、型号、BIOS 版本和 Windows 产品 ID,但不显示硬件序列号。它可以提供环境背景信息,却不能用于查询序列号。
其中哪些值可以修改? 本文不介绍如何修改标识符,HWID Checker也不会修改任何内容。MAC 和卷序列号在设计上允许用户更改;固件数值本不应修改。是否能在自己的主板上更改这些值,属于固件厂商的支持范畴,而不是 Windows 的功能。
运行这些命令时,会上传任何信息吗? 不会。每条命令都只读取本机固件表、本机设备驱动程序或本机注册表。本文中的任何操作都不会连接网络;可下载的 EXE 和 BAT 也完全不含网络代码。
如果手中有某个程序生成的标识符,想知道它最接近上述哪一种,可以使用在线 HWID 格式检查器。它能够识别 UUID、MAC 地址、十六进制哈希和常见序列号格式,并解释其结构;所有处理都在浏览器中完成,不会将数值发送到任何地方。