使用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_类库名

如何使用 WMI 了解进程的 CPU 和内存使用情况?

如何修复 Win32_Printer.Default 字段,以便在远程使用 WMI 时返回正确的值?

wmi.WMI().Win32_ComputerSystem()

使用 Wmi win32_Process 执行远程进程 - 获取进程的标准输出

WMI - 直接访问 Win32_OperatingSystem 的单例实例

(c)2006-2024 SYSTEM All Rights Reserved IT常识