最近有同事问我——怎么在Windows上用Python读取本地服务列表。
我想了一下,实际上并不难,相反还很简单。
基本上,Win32API是一个办法,但是需要让程序更简单,所以使用WMI。
来看代码:
import wmi
wmiobj = wmi.WMI()
services = wmiobj.Win32_Service()
for i in services:
print("%d:%s -> %s [%s]" %(services.index(i) + 1,i.Name,i.Caption,i.State) )
来看运行结果:
来我们来看看代码
第一行import wmi是导入wmi模块
如果导入失败,请pip install wmi安装即可,无依赖
wmiobj = wmi.WMI()
wmi.WMI方法会返回一个_wmi_namespace的对象。
而实际上,WMI是Windows上的一个插件,你可以把它理解为一个类似com插件的玩意,总而言之,WMI是微软为Windows管理员而设计的,它可以让我们避免使用API去查询一些服务。
他们的工作流程往往是这样的:
我们使用WMI工具查询的时候:WMI -> API -> Windows内核 -> 返回数据
当我们使用python上wmi模块时:
python-wmi -> WMI工具 -> API -> Windows内核 -> WMI工具 -> python-wmi
当我们使用wmi.WMI()方法的时候,返回的_wmi_namespace对象就相当于我们的WMI工具了。
我们甚至可以_wmi_namespace.query(wql,……)去使用wql查询,会返回我们想要的结果集。
wmiobj.Win32_Service()返回所有一个列表,要明白的就是使用所有WMI上的类,返回的都是一个列表,不管你的结果是什么,哪怕结果集只有1个数据,也是以列表形式,列表内为_wmi_object对象,也就是我们的查询结果。
Win32_Service返回的对象,有很多的属性和一些方法(可用于启动、修改、删除和创建等等),具体可以查阅微软WMI手册。
常用的只有这些:
Name:服务的名字
Caption:服务的显示名称(标题)
State:服务的运行状态
Statue:服务的状态(是否可用)
Description:服务的描述
PathName:可执行文件的路径名
等等
所有属性:
百家号:斌哥说Python【独家发布】