模块介绍
WMI介绍
Windows Management Instrumentation 翻译过来是Windows 管理规范,简称WMI,是基于 Windows 的操作系统上管理数据和操作的基础结构。 尽管可以编写 WMI 脚本或应用程序来自动执行远程计算机上的管理任务,但 WMI 还会向操作系统和产品的其他部分提供管理数据。 例如,System Center Operations Manager 或 Windows 远程管理。
来源:Windows Management Instrumentation – Win32 apps | Microsoft Learn
需要了解更多就请你访问上方来源微软官方对WMI的介绍。
Python WMI 模块
Python WMI 模块是 pywin32 之上的轻量级包装器扩展,并隐藏了 Python 所需的一些凌乱管道与 WMI API 通信。它是纯 Python,并且已经过针对所有 从 2.5 到 3.4 的 Python 版本。理论上它应该适用于任何最近的 pywin32 的版本。
相关地址
- PyPI: https://pypi.python.org/pypi/WMI/
- Github: https://github.com/tjguk/wmi
- 文档地址
- 中文互联网环境我在使用的时候浏览了至少10+内容,都没有发现有官方文档地址,GitHub这些也没有列出,嘿嘿,不过下面就是,你可以在文档中看到更详细的使用教程和案例:
- 文档地址:https://timgolden.me.uk/python/wmi/contents.html
通过上述介绍,你应该可以明白,Python wmi模块的功能很多,能实现的事情也很多,不单单只是标题中提到的获取电脑CPU、网卡、硬盘等信息功能。
下面只使用wmi模块电脑CPU、网卡、硬盘等信息,获取到这些信息可以在写软件授权的时候进行使用,利用这些信息生成序列号进行授权,来保护我们写的软件避免滥用…
模块使用
安装
pip install wmi
使用国内源
豆瓣源
pip install wmi -i https://pypi.douban.com/simple
华为源
pip install wmi -i https://mirrors.huaweicloud.com/repository/pypi/simple
更多关于pip管理模块的方法请看:Python pip命令大全。
获取设备信息
创建实例
# -*- coding: utf-8 -*-
import wmi
c = wmi.WMI() # 下面的代码都会基于这个实例
获取CPU信息
获取CPU信息使用wmi.Win32_Processor() 方法,返回值是一个列表。
注意:获取cpu序列号需要花费较长的时间。
cpu_info = c.Win32_Processor()
print(type(cpu_info)) # <class 'list'> list类型,列表中的元素是一个含cpu信息的wmi._wmi_object对象
print(cpu_info) # [<_wmi_object: b'xxxxxx"'>]
for cpu in cpu_info:
print(type(cpu)) # <class 'wmi._wmi_object'>
print(cpu) # instance of Win32_Processor { ... } 全部打印 查看都有哪些属性 然后直接通过.获取就好了。
# 文章后面的其他方法也是一样的 你想要看全部的信息就打印它查看,
# 然后通过对应的名字获取 后续的方法文章不再贴出全部的输出结果。
print(cpu)
输出结果
部分信息我”**************”替代(其实应该没啥必要,不过只是想尽可能的减少个人信息泄露…),你运行后会显示你电脑实际的信息:
instance of Win32_Processor
{
AddressWidth = 64;
Architecture = 9;
AssetTag = "To Be **************";
Availability = 3;
Caption = "Intel64 **************";
Characteristics = 252;
CpuStatus = 1;
CreationClassName = "Win32_Processor";
CurrentClockSpeed = 2600;
CurrentVoltage = 12;
DataWidth = 64;
Description = "**************";
DeviceID = "CPU0";
ExtClock = 100;
Family = 205;
L2CacheSize = 9216;
L3CacheSize = 18432;
L3CacheSpeed = 0;
Level = 6;
LoadPercentage = 2;
Manufacturer = "GenuineIntel";
MaxClockSpeed = 2600;
Name = "**************";
NumberOfCores = 12;
NumberOfEnabledCore = 12;
NumberOfLogicalProcessors = 16;
PartNumber = "To Be **************";
PowerManagementSupported = FALSE;
ProcessorId = "**************";
ProcessorType = 3;
Role = "CPU";
SecondLevelAddressTranslationExtensions = FALSE;
SerialNumber = "To Be Filled By O.E.M.";
SocketDesignation = "U3E1";
Status = "OK";
StatusInfo = 3;
SystemCreationClassName = "Win32_ComputerSystem";
SystemName = "**************";
ThreadCount = 16;
UpgradeMethod = 65;
Version = "";
VirtualizationFirmwareEnabled = FALSE;
VMMonitorModeExtensions = FALSE;
};
直接获取部分信息
# 通过cpu_info[0]可以获取直接第一个cpu信息 不需要再for循环
processor_id = cpu_info[0].ProcessorId # 直接获取cpu序列号 获取cpu序列号需要花费较长的时间
name = cpu_info[0].Name # cpu名称
number_of_cores = cpu_info[0].NumberOfCores # cpu核心数
thread_count = cpu_info[0].ThreadCount # cpu线程
# 不一一举例了...
获取网卡信息
获取网卡信息使用wmi.Win32_NetworkAdapterConfiguration() 方法,返回值是一个列表。
network_adapter_infos = c.Win32_NetworkAdapterConfiguration()
print(network_adapter_infos)
# 获取所有网卡MAC地址
for n in network_adapter_infos:
if n.MACAddress:
print("MAC地址", n.MACAddress)
获取硬盘信息
获取硬盘信息使用wmi.Win32_DiskDrive() 方法,返回值是一个列表。
注意:当设备存在多个硬盘的时候,wmi.Win32_DiskDrive() 方法返回的硬盘信息数据顺序是随机的。
disk_info = c.Win32_DiskDrive()[0]
print(disk_info)
# 直接获取部分信息
print("硬盘厂商",disk_info.Manufacturer)
print("硬盘型号", disk_info.Model)
print("硬盘sn", disk_info.SerialNumber)
print("硬盘大小", int(disk_info.Size) / (1024 * 1024 * 1024)) # 默认是字节单位 计算为GB
其他方法
还整理了一些其他方法,返回值都是列表,可以直接打印然后获取自己想要的信息就可以了。
# 获取主板信息
board_info = c.Win32_BaseBoard()
# 获取BIOS信息
bios_info = c.Win32_BIOS()
# 获取设备制造商 型号等信息
computer_info = c.Win32_ComputerSystem()
# 获取操作系统相关信息 系统名称 sn号...
operating_info = c.Win32_OperatingSystem()
# 获取进程
process = c.Win32_Process()
# 获取服务
service = c.Win32_Service()
使用注意
注意
在获取CPU信息和获取硬盘信息我分别给出了注意的点,这里在重复下,如果你需要使用上述的方法获取设备信息,然后进行使用的话,就需要注意,:
- 获取cpu序列号需要花费较长的时间。
- 当设备存在多个硬盘的时候,wmi.Win32_DiskDrive() 方法返回的硬盘信息数据顺序是随机的。
解决
关于CPU信息获取时间的问题,CPU我本子的13代i5,大概要1.3秒左右好像(反正至少1秒+),所以CPU信息我觉得可以不获取。例如只在你用于做软件授权,如果是需要每次都验证的,那么每次都要等1秒以上,我觉得对用户也不是那么友好。
关于设备多个硬盘数据随机的情况,可以使用Python sort()函数对wmi.Win32_DiskDrive() 方法返回的数据进行一次排序,然后在使用索引去获取,这样就获取到的都是一样的了,关于Python sort()函数,可以看我之前写的文章(Python sort()函数详解 – Python列表排序函数)。