WordPress课程广告

Python wmi模块 获取电脑CPU、网卡、硬盘等信息

释放双眼,带上耳机,听听看~!

模块介绍

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 的版本。

相关地址

通过上述介绍,你应该可以明白,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列表排序函数)。

给TA打赏
共{{data.count}}人
人已打赏
Python内置函数Python笔记

Python reversed 函数 - 对序列进行逆序操作

2024-4-20 20:13:28

Python笔记

Python pip命令大全

2024-5-10 14:53:32

WordPress网站建设宣传图片
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
展开目录