使用Python玩转WMI进行Win32api/com进行Windows编程开发
Posted 天府云创
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python玩转WMI进行Win32api/com进行Windows编程开发相关的知识,希望对你有一定的参考价值。
最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WMI。本文打算更进一步,让我们使用Python玩转WMI。
1 什么是WMI
具体请看微软官网对WMI的介绍。这里简单说明下,WMI的全称是Windows Management Instrumentation,即Windows管理规范。它是Windows操作系统上管理数据和操作的基础设施。我们可以使用WMI脚本或者应用自动化管理任务等。
从Using WMI可以知道WMI支持如下语言:
Application language | Topic |
---|---|
Scripts written in Microsoft ActiveX script hosting, including Visual Basic Scripting Edition (VBScript) and Perl | Scripting API for WMI.
Start with Creating a WMI Script. For script code examples, see WMI Tasks for Scripts and Applications and the TechNet ScriptCenterScript Repository. |
Windows PowerShell | Getting Started with Windows PowerShell
WMI PowerShell Cmdlets, such as Get-WmiObject. |
Visual Basic applications | Scripting API for WMI. |
Active Server Pages | Scripting API for WMI.
Start with Creating Active Server Pages for WMI. |
C++ applications | COM API for WMI.
Start with Creating a WMI Application Using C++ and WMI C++ Application Examples (contains examples). |
.NET Framework applications written in C#, Visual Basic .NET, or J# | Classes in the Microsoft.Management.Infrastructure namespace. (The System.Management namespace is no longer supported). For more information, see WMI .NET Overview. |
很遗憾,WMI并不原生支持Python。不过没有关系,它支持VB,而Python中的两个第三方库wmi和win32com,均能以类似VB的用法来使用。那么接下来,我们来讲讲如何使用。
2 使用WMI
2.1 使用wmi库操作WMI
以下是一个遍历所有进程,所有服务的示例:
1 2 3 4 5 6 7 8 9 | import wmi c = wmi . WMI ( ) # 遍历进程 for process in c . Win32_Process ( ) : print process . ProcessId , process . Name # 遍历服务 for service in c . Win32_Service ( ) : print service . ProcessId , service . Name |
可以看到,使用起来非常简单。但是有两个问题:一是wmi库实在是太慢了,能不能快点?二是如何知道例子中process和service有哪些属性(比如ProcessId等)?由于wmi库是动态生成底层执行语句,用dir(process)这种方式是获取不到ProcessId这种属性的。
针对第一个问题,我们可以使用win32com这个库来解决,它相较于wmi的速度快了很多。而第二个问题,先卖个关子,后文会有介绍。
2.2 使用win32com库操作WMI
win32com能模仿VB的行为,想了解如何使用win32com来操作WMI,最直接的方式是了解如何使用VB来操作WMI。在微软的官网上提供了很多现成的例子:WMI Tasks: Processes, WMI Tasks: Services。
其中一个例子关于进程是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
strComputer
=
"."
Set
objWMIService
=
GetObject
(
"winmgmts:"
&
"impersonationLevel=impersonate!\\\\"
&
strComputer
&
"\\root\\cimv2"
)
Set
colProcesses
=
objWMIService
.
ExecQuery
(
"Select * from Win32_Process"
)
For
Each
objProcess
in
colProcesses
Wscript
.
Echo
"Process: "
&
objProcess
.
Name
sngProcessTime
=
(
CSng
(
objProcess
.
KernelModeTime
)
+
CSng
(
objProcess
.
UserModeTime
)
)
/
10000000
Wscript
.
Echo
"Processor Time: "
&
sngProcessTime
Wscript
.
Echo
"Process ID: "
&
objProcess
.
ProcessID
Wscript
.
Echo
"Working Set Size: "
&
objProcess
.
WorkingSetSize
WMI使用的WIN32_类库名
如何修复 Win32_Printer.Default 字段,以便在远程使用 WMI 时返回正确的值? wmi.WMI().Win32_ComputerSystem() |