Python 获取 Windows 设备信息笔记

1. 基础实现(常用但有局限)

在 Python 中,我们通常使用 uuidsocket 库来快速获取设备网络标识。

python 复制代码
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}")

2. 核心问题:为什么 MAC 地址会变化?

在安装了 VMware 或 VirtualBox 等虚拟机软件后,原本稳定的脚本可能会输出不同的 MAC 地址。原因如下:

A. 虚拟网卡的干扰

uuid.getnode() 的原理是获取硬件地址。安装虚拟机后,系统会增加多个虚拟网卡(如 VMnet1, VMnet8)。

  • 多网卡竞争:脚本可能会随机抓取到虚拟网卡的 MAC 地址,而非物理网卡(WiFi/以太网)的地址。
  • 优先级变动:当物理网卡断开(如拔掉网线)时,系统可能会将虚拟网卡作为默认接口返回。

B. 随机地址回退机制

根据 RFC 4122 协议,如果 uuid.getnode() 无法获取到真实硬件地址,它会随机生成一个 48 位的值。

  • 识别方法:检查 MAC 地址的第一个字节。如果其最低有效位为 1(即第二个字符为 1, 3, 5, 7, 9, B, D, F 之一),说明这是一个随机地址。

3. 更稳定的替代方案:硬件 UUID

如果目的是为了唯一识别设备(如软件授权、指纹识别),建议获取 Windows 主板的 UUID,这不会受网卡变动或虚拟机的影响。

推荐方案 (Python 调用 WMIC)

python 复制代码
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()}")

4. 总结与建议

标识符 稳定性 适用场景 风险
MAC 地址 一般 网络通信、局域网识别 易受虚拟机、多网卡、随机化影响
主机名 内部网络标识 用户可随时更改
硬件 UUID 极高 软件授权、设备指纹 需系统权限(通常 cmd 即可)

💡 笔记提示:

  • 在 Windows 上运行 Python 脚本时,确保已将 Python 添加至系统变量 PATH
  • 如果必须获取物理网卡的 MAC,建议使用 psutil 库遍历所有网卡并过滤掉包含 "VMware" 或 "Virtual" 字样的接口。

需要我帮你补充如何用 psutil 过滤虚拟网卡的具体代码吗?

相关推荐
comedate1 天前
Windows / Linux GPU 虚拟内存布局差异与 CUDA 越界访问行为
linux·windows·mmu·cuda 越界访问
程序员三藏1 天前
Python+requests实现接口自动化测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
IT技术分享社区1 天前
Windows桌面时钟推荐:始终置顶、无级缩放、支持全屏游戏显示时间
windows·微软技术·电脑技巧·桌面美化·电脑干货
一直走下去-明1 天前
简单的http抓包解包完整代码
开发语言·python
雷帝木木1 天前
数据湖与数据仓库:从理论到实践
人工智能·python·深度学习·机器学习
数字化转型分享点滴1 天前
机加工车间上线 SH‑AIOT 物联网会遇到哪些常见实施难点
python·物联网
0566461 天前
agent学习——流式响应与文本切分
网络·python·学习
OPEN-F1 天前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式
新网企兴1 天前
2026年陕西做GEO推广,找新网企兴解决获客难题
python·搜索引擎
青 春 记 忆1 天前
LeetCode 142. 环形链表 II|Python 解法详解
python·leetcode·链表