Python实现获取Windows设备信息

 更新时间:2026年04月26日 09:52:19   作者:元Y亨H  
这篇文章主要为大家详细介绍了如何在Python中获取设备网络标识(MAC地址)的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

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

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

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 地址。原因如下:

虚拟网卡的干扰

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

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

随机地址回退机制

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

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

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

如果目的是为了唯一识别设备(如软件授权、指纹识别),建议获取 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()}")

4. 总结与建议

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

 笔记提示:

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

5.知识扩展

在 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、内存、磁盘、网络等实时资源时作为重要补充。

详细代码示例及解析

准备工作:安装依赖库

对于非 Python 内置的模块,你需要先进行安装。建议使用 pip 在命令行中进行安装。

# 建议使用 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_ProcessorWin32_BaseBoardWin32_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 命令。

你对哪部分的实现,或是针对特定硬件的查询更感兴趣呢?我可以进一步为你提供更详细的代码示例。

到此这篇关于Python实现获取Windows设备信息的文章就介绍到这了,更多相关Python获取Windows设备信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现删除windows下的长路径文件

    Python实现删除windows下的长路径文件

    这篇文章主要为大家详细介绍一下如何利用Python语言实现删除windows下的长路径文件功能,文中的示例代码讲解详细,具有一定参考借鉴价值,感兴趣的可以了解一下
    2022-07-07
  • Python中使用__new__实现单例模式并解析

    Python中使用__new__实现单例模式并解析

    单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。 这篇文章主要介绍了Python中使用__new__实现单例模式并解析 ,需要的朋友可以参考下
    2019-06-06
  • 打包迁移Python env环境的三种方法总结

    打包迁移Python env环境的三种方法总结

    平常工作中可能遇到python虚拟环境迁移的场景,总结了如下几个方法,下面这篇文章主要给大家介绍了关于打包迁移Python env环境的三种方法,需要的朋友可以参考下
    2024-08-08
  • python自动化神器pyautogui使用步骤

    python自动化神器pyautogui使用步骤

    这篇文章主要给大家介绍了关于python自动化神器pyautogui使用步骤的相关资料,在Python当中不仅代码简单,而且有着非常丰富的模块,pyautogui就可以称之为自动化操作的"神器",需要的朋友可以参考下
    2023-07-07
  • Django DRF路由与扩展功能的实现

    Django DRF路由与扩展功能的实现

    这篇文章主要介绍了Django DRF路由与扩展功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Python+Redis实现布隆过滤器

    Python+Redis实现布隆过滤器

    布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。这篇文章主要介绍了Python+Redis实现布隆过滤器,需要的朋友可以参考下
    2019-12-12
  • Github Copilot结合python的使用方法详解

    Github Copilot结合python的使用方法详解

    最近也是听说github出了一种最新的插件叫做copilot,于是申请了,下面这篇文章主要给大家介绍了关于Github Copilot结合python使用的相关资料,需要的朋友可以参考下
    2022-04-04
  • Matlab中的mat数据转成python中使用的npy数据遇到的坑及解决

    Matlab中的mat数据转成python中使用的npy数据遇到的坑及解决

    这篇文章主要介绍了Matlab中的mat数据转成python中使用的npy数据遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Pandas_cum累积计算和rolling滚动计算的用法详解

    Pandas_cum累积计算和rolling滚动计算的用法详解

    今天小编就为大家分享一篇Pandas_cum累积计算和rolling滚动计算的用法详解,具有好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 在pyCharm中下载第三方库的方法

    在pyCharm中下载第三方库的方法

    这篇文章主要介绍了在pyCharm中下载第三方库的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论