发布于2026-07-12 阅读(0)
扫一扫,手机访问
用 Python 获取设备网络标识,最直接的办法就是借助 uuid 和 socket 这两个内置库。几行代码就能拿到 MAC 地址、主机名和 IP,看起来挺方便。

import uuid
import socket
# 获取 MAC 地址 (基于 getnode)
mac = uuid.UUID(int=uuid.getnode()).hex[-12:].upper()
# 获取主机名与 IP
hostname = socket.getfqdn(socket.gethostname())
ip_addr = socket.gethostbyname(hostname)
print(f"MAC: {mac}")
print(f"Host: {hostname}")
print(f"IP: {ip_addr}")
如果你在本地装了 VMware 或 VirtualBox,而且之前脚本跑得好好的,某天突然发现输出的 MAC 地址不一样了——别慌,原因其实挺简单。
uuid.getnode() 本质上就是去读硬件地址。但虚拟机一装,系统里就多了好几个虚拟网卡(比如 VMnet1、VMnet8)。
依照 RFC 4122,如果 uuid.getnode() 死活拿不到真实的硬件地址,它就会随机生成一个 48 位的值来应付。
如何判断是不是随机地址?看 MAC 第一个字节的最低有效位。如果第二个字符是 1, 3, 5, 7, 9, B, D, F 中的一个,那就是随机生成的。
如果目的就是唯一识别设备(比如做软件授权、设备指纹),那建议直接拿 Windows 主板的 UUID。这玩意儿不会因为网卡变动或虚拟机就翻脸。
推荐方案 (Python 调用 WMIC)
import subprocess
def get_windows_uuid():
try:
# 执行 wmic 命令获取主板唯一标识
cmd = 'wmic path win32_computersystemproduct get uuid'
uuid_str = subprocess.check_output(cmd, shell=True).decode().split('\n')[1].strip()
return uuid_str
except Exception as e:
return f"Error: {e}"
print(f"设备硬件 UUID: {get_windows_uuid()}")
| 标识符 | 稳定性 | 适用场景 | 风险 |
|---|---|---|---|
| MAC 地址 | 一般 | 网络通信、局域网识别 | 易受虚拟机、多网卡、随机化影响 |
| 主机名 | 低 | 内部网络标识 | 用户可随时更改 |
| 硬件 UUID | 极高 | 软件授权、设备指纹 | 需系统权限(通常 cmd 即可) |
补充两点实操建议:
PATH 里。psutil 库遍历所有网卡,把名字里带 "VMware" 或 "Virtual" 的过滤掉。在 Windows 环境里获取设备信息,最高效的手段其实是 WMI,它可以直接捅到系统底层硬件和软件的配置。Python 的 platform 和 psutil 模块则可以作为补充,捞一些基础的系统信息。
下面这张对比表,能帮你快速定位哪个方法最适合手头的任务:
主要实现方法对比
| 方法/工具 | 核心原理 | 主要优势 | 潜在限制 | 使用建议 |
|---|---|---|---|---|
| WMI (wmi库) | 通过封装好的 API 访问 Windows 原生管理接口。 | 功能最强大,能获取几乎所有系统信息(软件/硬件/配置)。 | 需要安装第三方库。 | 首选,用于获取CPU、主板、硬盘等底层硬件信息。 |
| Win32 API (pywin32库) | 直接调用 Windows API,交互层级更低。 | 灵活,能实现一些 WMI 不便或无法完成的操作。 | 安装相对复杂,需要pywin32库。 | 高级或特定场景的补充。 |
| 系统组件 (platform模块) | Python 内置,跨平台,无需安装。 | 无额外依赖,代码简单。 | 功能有限,主要用于操作系统版本、计算机名、处理器架构等基础信息。 | 获取通用系统信息,或用于跨平台代码中判断操作系统类型。 |
| subprocess + WMIC | 调用 Windows 命令行工具 wmic,解析其输出。 | 零额外依赖(除 subprocess)。 | 输出为文本,需要解析,且 wmic 可能在未来的 Windows 版本中被弃用。 | 需要基本的系统信息,但不能或不想安装 wmi 库的轻量级场景。 |
| 跨平台库 (psutil等) | 第三方库,提供跨平台的系统信息获取功能。 | 跨平台(Windows/Linux/macOS),API 统一,获取实时数据能力强。 | 可能获取不到某些特定硬件的底层序列号。 | 需要监控CPU、内存、磁盘、网络等实时资源时作为重要补充。 |
详细代码示例及解析
准备工作:安装依赖库
非内置模块需要先用 pip 装好。建议用 python -m pip 保证安装到正确的 Python 环境。
# 建议使用 python -m pip 来确保安装到正确的 Python 环境 python -m pip install wmi pywin32 psutil
下面给出两种主流的实现方式,附带核心代码。
方式一:使用 wmi 模块(获取CPU、主板、硬盘信息)
这是 Windows 硬件信息获取最常用也是最强的路子。
import wmi
try:
# 初始化WMI客户端
c = wmi.WMI()
except wmi.x_wmi as e:
print(f"初始化WMI失败: {e}")
exit()
# 1. 获取CPU信息
print("\n[CPU信息]")
for cpu in c.Win32_Processor():
# .Caption 或 .Name 通常包含CPU的完整型号
print(f" 型号: {cpu.Name.strip()}")
print(f" 核心数: {cpu.NumberOfCores}")
print(f" 线程数: {cpu.NumberOfLogicalProcessors}")
# 2. 获取主板信息
print("\n[主板信息]")
for board in c.Win32_BaseBoard():
# .Product 通常是主板的型号
print(f" 型号: {board.Product}")
# .Manufacturer 是制造商
print(f" 制造商: {board.Manufacturer}")
# 3. 获取硬盘信息
print("\n[硬盘信息]")
for disk in c.Win32_DiskDrive():
# .Model 是硬盘型号,.SerialNumber 是唯一的序列号
print(f" 型号: {disk.Model}")
print(f" 序列号: {disk.SerialNumber}")
print(f" 大小: {int(disk.Size) // (1024**3)} GB")
代码解析:
c = wmi.WMI() 建立与 Windows 管理规范的连接,后续所有查询都靠它。Win32_Processor、Win32_BaseBoard、Win32_DiskDrive 是 WMI 里查询 CPU、主板、硬盘的类。Win32_PhysicalMemory 查内存条。方式二:结合 platform 和 psutil 获取系统概况
这两个库主要用来拿系统概要信息和实时运行状态,跨平台能力很强。
import psutil
import platform
print("[操作系统信息]")
# platform.system() 获取操作系统名称,如 'Windows', 'Linux'[reference:12]
print(f" 系统: {platform.system()}")
# platform.release() 获取操作系统的主版本号[reference:13]
print(f" 版本: {platform.release()}")
# platform.processor() 获取处理器的信息字符串
print(f" 处理器标识: {platform.processor()}")
print(f" 计算机名: {platform.node()}")
print(f" 系统架构: {platform.machine()}")
print("\n[系统运行状态]")
# psutil.virtual_memory().total 获取系统总内存,单位是字节,需要转换为合适的单位。
total_memory = psutil.virtual_memory().total
print(f" 总内存: {total_memory // (1024**3)} GB")
# psutil.disk_usage('/') 获取根目录的磁盘使用情况。你可以改变路径来查看其他盘符。
disk = psutil.disk_usage('/')
print(f" 磁盘 (C:): 总计 {disk.total // (1024**3)}GB, 已用 {disk.used // (1024**3)}GB")
关键点:
platform 模块是跨平台系统信息的基础。psutil 在动态数据上很出色,比如 psutil.virtual_memory() 和 psutil.disk_usage() 能实时反映内存和磁盘使用情况。方式三:使用 uuid 模块生成唯一设备标识符
这个方法不是列硬件清单,而是生成一个相对稳定的设备唯一码,常见于软件授权场景。
import uuid
# 获取计算机的MAC地址并生成一个UUID[reference:16]
node_uuid = uuid.UUID(int=uuid.getnode())
# 取UUID的后12位作为机器码
machine_code = node_uuid.hex[-12:]
print(f"\n[生成的机器码]")
print(f" 唯一ID: {machine_code}")
核心要点:该方法依赖 MAC 地址,网卡变或 MAC 被改,ID 就会变。想更稳定,可以调系统工具(如 wmic csproduct get uuid)拿主板 UUID。
注意事项与安全警示
代码写得好,还要注意错误处理和权限——这是让程序靠谱的常识。
None 或直接报错。try...except 包住 WMI 初始化、注册表查询等容易出错的步骤。wmic 命令行工具可能在后续 Windows 版本中被移除。建议把 wmic 调用封装成函数,后续方便平滑迁移到 Get-WmiObject 等 PowerShell 命令。以上几种方法各有侧重,实际开发时可以根据场景灵活选用。如果需要针对特定硬件(比如内存条、显卡)的查询,可以进一步细化代码。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8