Skip to content

获取系统唯一标识信息

1. 什么是系统 UUID

系统 UUID(Universally Unique Identifier,通用唯一识别码)是硬件厂商在制造主板时写入 BIOS/UEFI 中的唯一标识符,用于唯一标识一台计算机设备。

UUID 的特点:

  • 全局唯一性:每台设备的 UUID 都是唯一的
  • 持久性:存储在硬件中,重装系统不会改变
  • 应用场景:软件授权、设备管理、资产追踪

2. Windows 系统

2.1 使用 WMIC 命令

bash
wmic csproduct get uuid

输出示例:

text
UUID
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

2.2 使用 PowerShell

powershell
Get-WmiObject -Class Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID

2.3 使用注册表

UUID 也存储在注册表中,可以通过以下路径查看:

text
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid

使用命令查询:

bash
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography /v MachineGuid

3. Linux 系统

3.1 使用 dmidecode 命令

需要 root 权限:

bash
sudo dmidecode -s system-uuid

输出示例:

text
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

3.2 读取 sysfs 文件系统

bash
sudo cat /sys/class/dmi/id/product_uuid

或者:

bash
sudo cat /sys/devices/virtual/dmi/id/product_uuid

3.3 使用 lshw 命令

bash
sudo lshw -class system | grep uuid

4. macOS 系统

4.1 使用 system_profiler

bash
system_profiler SPHardwareDataType | grep "Hardware UUID"

4.2 使用 ioreg

bash
ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID

输出示例:

text
"IOPlatformUUID" = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

5. 跨平台解决方案

5.1 Python 实现

python
import platform
import subprocess
import uuid

def get_system_uuid():
    """获取系统 UUID"""
    system = platform.system()
    
    if system == "Windows":
        # Windows 系统
        result = subprocess.check_output(
            'wmic csproduct get uuid', 
            shell=True
        ).decode()
        uuid_str = result.split('\n')[1].strip()
        return uuid_str
    
    elif system == "Linux":
        # Linux 系统
        try:
            with open('/sys/class/dmi/id/product_uuid', 'r') as f:
                return f.read().strip()
        except PermissionError:
            # 需要 sudo 权限
            result = subprocess.check_output(
                ['sudo', 'dmidecode', '-s', 'system-uuid']
            ).decode()
            return result.strip()
    
    elif system == "Darwin":
        # macOS 系统
        result = subprocess.check_output(
            ['system_profiler', 'SPHardwareDataType']
        ).decode()
        for line in result.split('\n'):
            if 'Hardware UUID' in line:
                return line.split(':')[1].strip()
    
    else:
        # 使用 uuid 库生成(不是真正的硬件 UUID)
        return str(uuid.uuid4())

if __name__ == "__main__":
    system_uuid = get_system_uuid()
    print(f"系统 UUID: {system_uuid}")

5.2 Node.js 实现

javascript
const { execSync } = require('child_process')
const os = require('os')

function getSystemUUID() {
  const platform = os.platform()
  
  try {
    if (platform === 'win32') {
      // Windows
      const output = execSync('wmic csproduct get uuid', { encoding: 'utf8' })
      return output.split('\n')[1].trim()
    } else if (platform === 'linux') {
      // Linux
      try {
        const output = execSync('cat /sys/class/dmi/id/product_uuid', { encoding: 'utf8' })
        return output.trim()
      } catch (error) {
        // 需要 sudo 权限
        const output = execSync('sudo dmidecode -s system-uuid', { encoding: 'utf8' })
        return output.trim()
      }
    } else if (platform === 'darwin') {
      // macOS
      const output = execSync('system_profiler SPHardwareDataType', { encoding: 'utf8' })
      const match = output.match(/Hardware UUID: (.+)/)
      return match ? match[1].trim() : null
    }
  } catch (error) {
    console.error('获取 UUID 失败:', error.message)
    return null
  }
}

console.log('系统 UUID:', getSystemUUID())

6. 注意事项

6.1 权限要求

  • Linux/macOS:大多数情况下需要 root/sudo 权限才能读取硬件 UUID
  • Windows:普通用户权限即可

6.2 虚拟机环境

在虚拟机中,UUID 可能由虚拟化软件生成:

  • VMware 会为每个虚拟机分配唯一的 UUID
  • VirtualBox 也会生成虚拟机 UUID
  • Docker 容器继承宿主机的 UUID

6.3 UUID 的局限性

  • 可修改性:技术上 UUID 可以被修改(需要特殊工具)
  • 隐私问题:UUID 可能被用于追踪设备
  • 克隆影响:磁盘克隆可能导致多台设备具有相同 UUID

6.4 替代方案

如果无法获取硬件 UUID,可以考虑:

  • MAC 地址:网卡物理地址
  • 硬盘序列号:存储设备序列号
  • CPU 序列号:处理器序列号
  • 组合标识:多个硬件信息的组合哈希

7. 应用场景

7.1 软件授权

python
import hashlib

def generate_license_key(uuid, product_key):
    """基于 UUID 生成软件许可证"""
    data = f"{uuid}-{product_key}"
    return hashlib.sha256(data.encode()).hexdigest()

def validate_license(uuid, license_key, product_key):
    """验证许可证"""
    expected_key = generate_license_key(uuid, product_key)
    return license_key == expected_key

7.2 设备追踪

python
import requests
import json

def report_device_info(uuid):
    """上报设备信息到服务器"""
    data = {
        'uuid': uuid,
        'hostname': platform.node(),
        'os': platform.system(),
        'version': platform.version()
    }
    
    response = requests.post(
        'https://api.example.com/devices',
        json=data
    )
    return response.json()

7.3 资产管理

在企业环境中,IT 管理员可以使用 UUID 来:

  • 追踪公司设备
  • 管理软件安装
  • 监控设备状态
  • 执行远程操作

8. 参考资料