Windows下用WMI查询Win32_ComputerSystemProduct.UUID是最常用方案,需初始化COM、设置代理安全上下文,返回BSTR须转UTF-8并校验全零;Linux读/sys/class/dmi/id/product_uuid需root权限且存在性校验;macOS依赖IOPlatformUUID但可能重置;跨平台须统一格式、过滤无效值并设fallback。

Windows下用WMI查询Win32_ComputerSystemProduct的UUID
Windows没有全局统一的“硬件UUID”概念,但WMI提供的Win32_ComputerSystemProduct类中UUID字段(如{00000000-0000-0000-0000-000000000000})是多数OEM厂商写入主板固件的标识,稳定性较高。注意它不是CPU或硬盘序列号,而是系统级UUID。
实操要点:
- 需链接
ole32.lib和oleaut32.lib,初始化COM:调用CoInitializeEx(nullptr, COINIT_MULTITHREADED) - 查询前必须设置安全上下文:
CoSetProxyBlanket,否则常见错误0x80041003 (WBEM_E_ACCESS_DENIED) - 返回值是BSTR字符串,需用
SysStringLen判空、WideCharToMultiByte转UTF-8,不能直接当C字符串用 - 某些虚拟机(如Hyper-V默认配置)或精简版Windows可能返回全零UUID,需加校验:
if (uuid_str.find("00000000") == 0 && uuid_str.length() == 36)视为无效
Linux下读取/sys/class/dmi/id/product_uuid文件
Linux内核从2.6.27起暴露DMI信息到sysfs,/sys/class/dmi/id/product_uuid对应BIOS/UEFI写入的系统UUID,权限通常是root:root 0444,普通用户默认不可读。
实操要点:
- 打开文件前先检查是否存在且可读:
access("/sys/class/dmi/id/product_uuid", R_OK) == 0,避免ENOENT或EACCES - 读取内容末尾带换行符,需用
strcspn(buf, "\n")截断,否则UUID字符串含\n导致校验失败 - 部分ARM设备(如树莓派)或无DMI固件的嵌入式板卡该路径不存在,应降级尝试
/proc/sys/kernel/random/uuid(但这是随机生成的,非硬件唯一) - 若程序以非root运行,可提前用
sudo setcap cap_sys_rawio+ep ./your_binary授予权限,比改文件权限更安全
macOS不提供标准硬件UUID,IOPlatformUUID是唯一可行替代
macOS没有类似Windows或Linux的标准化硬件UUID接口,IOPlatformUUID由IOKit导出,本质是NVRAM中存储的平台标识,在T2/M系列芯片上仍有效,但重装系统或恢复出厂时可能重置。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
实操要点:
- 需链接
IOKit.framework,头文件包含和 - 调用
IORegistryEntryCreateCFProperty获取CFTypeRef,再用CFStringGetCString转C字符串,不能直接CFShow调试 - 返回值可能为
NULL(如某些虚拟机或禁用NVRAM的场景),必须判空,否则CFStringGetLength崩溃 - 该值格式为标准UUID字符串(32 hex + 4 hyphens),但大小写不固定,建议统一转小写后再做哈希或比较
跨平台封装要注意的三个硬伤
真正难的不是单平台获取,而是让结果在不同机器上稳定可复现。UUID本身不加密、不签名,任何有权限的进程都能伪造。
- 虚拟化环境普遍不可靠:VMware/VirtualBox默认生成随机UUID,除非手动配置
uuid.bios = "true"并启用vmx参数 - 同一块主板刷BIOS后,
product_uuid可能变更——这不是bug,是厂商行为,应用层无法规避 - 不要把UUID直接当license绑定依据:攻击者可用
dmidecode --string system-uuid(Linux)或wmic csproduct get uuid(Windows)查出明文,建议结合SHA256(原始UUID + salt)二次处理
拿到UUID后务必做有效性过滤和格式归一化,别假设它天然合规。真实环境里,约7%的物理机返回空、零值或非法格式,这部分必须有fallback逻辑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










