Windows COM自动化:PythonForWindows COM接口与WMI查询完全教程 Windows COM自动化PythonForWindows COM接口与WMI查询完全教程【免费下载链接】PythonForWindowsA codebase aimed to make interaction with Windows and native execution easier项目地址: https://gitcode.com/gh_mirrors/py/PythonForWindows想在 Python 中实现Windows COM 自动化吗本教程带你用 PythonForWindows 快速掌握COM 接口调用与WMI 查询初始化 COM 环境、创建任意 COM 对象、用一行代码执行 WMI 查询、枚举进程与服务、甚至通过 WMI 方法创建进程。全文面向新手代码精简看完即可上手。 什么是 COM 与 WMICOMComponent Object Model组件对象模型是 Windows 最核心的对象交互机制——防火墙、任务计划、事件日志等系统组件都通过 COM 接口暴露功能。WMIWindows Management Instrumentation则构建在 COM 之上用类 SQL 的 WQL 语言查询/管理操作系统进程、磁盘、服务、注册表等。手动操作 COM 极其繁琐初始化、CLSID、IID、Variant、引用计数……而 PythonForWindows 把这些全部封装成了 Pythonic 的接口。你的 Python 代码 │ ▼ windows.com ──► 底层 CoCreateInstance / COM vtable │ ▼ windows.winobject.wmi ──► WMI 命名空间 ──► Windows 系统信息 快速开始安装 PythonForWindowsPythonForWindows 无外部依赖仅基于标准库ctypes支持 32/64 位 Python。方式一直接使用 pip 安装python -m pip install PythonForWindows方式二克隆源码安装git clone https://gitcode.com/gh_mirrors/py/PythonForWindows python setup.py install 第一步初始化 COM 环境任何 COM 操作前都需要初始化一次。PythonForWindows 提供windows.com.init()它会自动处理CoInitializeEx与CoInitializeSecurity的常见陷阱如重复调用报错import windows windows.com.init()该函数内部封装在 windows/com.py 中返回值非 0 表示 COM 已在此线程初始化过可安全忽略。 提示WMI 相关功能windows.system.wmi会在首次访问时自动完成 COM 初始化无需手动调用。 COM 接口实战三行代码创建 COM 对象使用任意 COM 接口只需三步建对象 → 造 CLSID → 创建实例。以 Windows 防火墙接口INetFwPolicy2为例完整示例见 samples/com/com_inetfwpolicy2.pyfrom windows import generated_def as gdef from windows.generated_def import interfaces firewall interfaces.INetFwPolicy2() # 1. 创建接口变量 clsid windows.com.IID.from_string(E2B3C97F-6AE1-41AC-817A-F6F92166D7DD) # 2. 生成 CLSID windows.com.create_instance(clsid, firewall) # 3. 创建 COM 实例 for profile in [gdef.NET_FW_PROFILE2_DOMAIN, gdef.NET_FW_PROFILE2_PRIVATE, gdef.NET_FW_PROFILE2_PUBLIC]: enabled gdef.VARIANT_BOOL() firewall.get_FirewallEnabled(profile, enabled) print(profile, -, enabled.value)项目内置了哪些 COM 接口所有接口定义由ctypes_generation/com/目录约 90 个.txt定义文件含 Explorer、Tasks 任务计划、WMI、BITS 等分类自动生成到windows/generated_def/interfaces.py。常用接口举例接口用途定义位置INetFwPolicy2Windows 防火墙开关与规则ctypes_generation/com/INetFwPolicy2.txtITaskService任务计划调度器ctypes_generation/com/Tasks/ITaskService.txtIWbemServices等WMI 全套接口ctypes_generation/com/WMI/IWebBrowser2嵌入式浏览器ctypes_generation/com/WebBrowser/IWebBrowser2.txtICallInterceptorCOM 调用拦截器ctypes_generation/com/ICallInterceptor.txt需要其他接口把接口的.c定义放入ctypes_generation/com/后运行 ctypes_generation/generate.py 重新生成即可见 ctypes_generation/README。进阶用 Python 实现 COM 对象反向 COMPythonForWindows 不仅能调用COM还能实现COM 接口——继承windows.com.COMImplementation并声明IMPLEMENT属性即可让 Python 方法被原生代码回调。典型应用是 COM 调用拦截在 samples/com/icallinterceptor.py 中Python 代码拦截了防火墙接口INetFwPolicy2的每次调用可查看/篡改参数与返回值——这在 COM 安全研究与逆向中非常有用。 WMI 查询入门select 与 query 两种方法WMI 的统一入口是windows.system.wmiWmiManager实例定义于 windows/winobject/wmi.py它像字典一样按命名空间访问默认命名空间为root\cimv2。方法一select —— 按类名枚举实例import windows # 查询所有运行中的进程 processes windows.system.wmi.select(Win32_Process) print(共有 {0} 个进程.format(len(processes)))方法二query —— 执行 WQL 查询语句# 等价于 SQLselect 列 from 表 for vol in windows.system.wmi.query( select Caption,FileSystem,FreeSpace from Win32_LogicalDisk): print(vol[Caption], vol[FreeSpace])两种方法都返回WmiObject列表。WmiObject像字典一样按属性名取值obj[Name]还支持obj.properties查看全部属性名、obj.items()查看全部键值对。完整示例输出见 docs/source/samples_output/wmi_wmi_request.txt。⚙️ WMI 实战查询系统信息与调用系统方法场景 1找出自己的进程信息result windows.system.wmi.select(Win32_Process) us [p for p in result if int(p[ProcessId]) windows.current_process.pid][0] print(us[Name], us[CommandLine])场景 2调用 WMI 方法创建进程不用 CreateProcess这是 WMI 自动化的经典玩法完整代码见 samples/wmi/create_process.pywmispace windows.system.wmi[root\\cimv2] proc_class wmispace.get_object(Win32_Process) inparam proc_class.get_method(Create).inparam # 获取方法入参模板 inparam[CommandLine] rc:\windows\system32\notepad.exe outparam wmispace.exec_method(proc_class, Create, inparam) pid int(outparam[ProcessId]) print(新进程 PID:, pid)WmiObject.get_method()会自动解析方法的输入/输出参数结构完全省去手工拼参数对象的麻烦。 多命名空间与高级用法Windows 有数十个 WMI 命名空间。WmiManager支持用方括号语法访问任意命名空间首次访问时自动建立连接懒加载# 列出所有子命名空间 print(windows.system.wmi.namespaces) # 查询非默认命名空间列出已安装的杀毒软件 security2 windows.system.wmi[rroot\SecurityCenter2] for av in security2.select(AntiVirusProduct): print(av[displayName]) # 枚举某个命名空间中的所有类 for cls in security2.classes: print(cls[__CLASS])需要精细控制超时、流式迭代、删除/创建实例时可下沉到WmiNamespace层 APIAPI说明exec_query(query)返回可迭代枚举器支持自定义超时create_instance_enum(cls)实例枚举deepTrue含子类create_class_enum(super)类枚举get_object(path)获取单个对象/类put_instance()/delete_instance()创建/删除实例exec_method()调用 WMI 方法API 文档见 docs/source/wmi.rst 与 docs/source/com.rst。❓ 常见问题FAQQ1调用 COM 报 RPC_E_TOO_LATE 怎么办windows.com.init()已内置处理——微软官方 Python 构建可能已提前调用CoInitializeSecurity此错误会被自动吞掉无需担心。Q2查询超时会怎样WmiEnumeration.next(timeout)默认使用WBEM_INFINITE无限等待超时时抛出WindowsError(WBEM_S_TIMEDOUT)可传入秒级超时参数控制。Q3WMI 错误信息看不懂WMI 接口的错误检查会自动把WBEMSTATUS错误码映射到异常信息中见 windows/winobject/wmi.py 中的WmiComInterface.errcheck异常消息即错误含义。Q432 位 Python 能查 64 位进程吗不能。WMI 受 WoW64 限制32 位 Python 只能看到 32 位进程。需要 64 位进程信息请用 64 位 Python 运行。 核心文件速查表文件说明windows/com.pyCOM 初始化、create_instance、IID/Variant/SafeArraywindows/winobject/wmi.pyWmiManager/WmiNamespace/WmiObject全套 WMI APIwindows/winobject/task_scheduler.py基于 COM 的任务计划封装samples/com/防火墙、COM 拦截器示例samples/wmi/WMI 查询、方法调用示例ctypes_generation/com/90 个 COM 接口原始定义tests/test_wmi.pyWMI 功能测试用例tests/test_com.pyCOM 功能测试用例✅ 小结COM 初始化一行windows.com.init()搞定所有底层细节调用 COM 接口三行代码创建任意 COM 对象90 接口开箱即用WMI 查询windows.system.wmi.select(类名)或query(WQL语句)结果即字典WMI 方法调用get_method()exec_method()轻松实现创建进程等高级操作多命名空间方括号语法懒加载连接如windows.system.wmi[rroot\SecurityCenter2]。从防火墙开关到进程管理再到 COM 调用拦截PythonForWindows 让 Windows COM 自动化像写普通 Python 一样简单。【免费下载链接】PythonForWindowsA codebase aimed to make interaction with Windows and native execution easier项目地址: https://gitcode.com/gh_mirrors/py/PythonForWindows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考