WMI 学习笔记

目录

wmi

托管对象

WMI 提供程序

注册表提供程序

Win32 提供程序

WMI 基础架构

WMI 存储库

命名空间中的类

WMI 核心

一次访问的过程

WMI 使用者

总结

学习资料


上一篇《WMIC学习笔记》讲了 WMIC 工具的入门知识,但使用时不理解有些命令,比如 NAMESPACE、PATH 等,所以我做了一些研究。

wmic 是使用 wmi 的工具,或者说 wmic 是 wmi 服务的客户端。想要理解 wmic 命令,必须先理解 wmi,这篇文章只是简单讲解一些我能理解的、有关 wmi 的概念,有利于我使用 WMIC 工具,并非十分深入,可能有误。

wmi

wmi 体系结构图:

主要部分:托管对象(managed object)、WMI 提供程序(WMI provider)、WMI 基础架构(WMI infrastructure)、WMI 使用者(WMI consumer)。

托管对象

一个托管对象是一个逻辑组件或物理组件,比如硬盘驱动器、网络适配器、数据库系统、操作系统、进程或服务等等。

简单说,如果把组成计算机的各种组件抽象出来,WMI 就针对这些组件管理。

WMI 提供程序

官方文档说:

A WMI provider is a COM object that monitors one or more managed objects for WMI. 

每个 WMI 提供程序是根据自己管理的托管对象形成的,给 WMI 提供操作托管对象的功能,包括从托管对象获取数据和传递消息给托管对象。

一个 WMI 提供程序由 dll 文件和 mof(Managed Object Format)文件组成,它们的文件路径在 C:\Windows\System32\wbem。mof 文件定义了这个提供程序对托管对象所能获取的数据和执行的操作。

下面是一些 WMI 提供程序。

注册表提供程序

注册表提供程序是预安装的,用于访问系统注册表的数据。注册表提供程序有一个 WMI 类:StdRegProv,有很多方法,但没有属性。

Win32 提供程序

Win32 提供程序包括一些有很多方法但很少属性的类,比如 Win32_Process、Win32_LogicalDisk。这个提供程序的 dll 文件是 Stdprov.dll,包含动态返回数据的代码。Win32_LogicalDisk 类被定义在 MOF 文件中,在系统启动时被编译到 WMI 存储库中。

WMI 基础架构

WMI 基础架构就是 WMI 服务,在任务管理器可以看到它的服务进程:

WMI 基础包含两个部分:WMI 核心、WMI 存储库。

WMI 存储库

WMI 存储库保存的是静态数据(动态数据就是从提供程序获取到托管对象的实时数据,比如占用的内存),比如提供程序的类定义。

WMI 存储库是通过 WMI 命名空间(namespace)组织的。WMI 服务在启动时创建了一些命名空间,比如 root\default、root\cimv2 和 root\subscription 等,并且在这些命名空间预安装了一组默认的类定义,比如 Win32 类,WMI 系统类,等等。还有其他的命名空间是由提供程序创建的。

这里的“命名空间”可以理解为 PHP 的命名空间,有着解决命名冲突,对类进行分类,以及定位类的位置等作用。

命名空间中的类

介绍几个命名空间及其含义:

  1. root\default:与 Windows 注册表操作有关的主机类,可以读取、写入、枚举、监视、创建、删除注册表项和值。

  2. root\cimv32:包含从 CIM 存储库派生的类,提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM  用户及组等 Win32 信息资源。

  3. root\Security:用于与 Windows 安全有关的类。

  4. root\WMI:提供对  WDM  设备驱动程序中信息访问的类。

列举这些命名空间的一些类:

分类WMI 接口 
命名空间属性/方法
制造商Root/cimv2

Win32_Computer System

属性:Manufacturer(制造商)、 Model(型号)
CPU Root/cimv2Win32_Processor 属性:Name(CPU 基本情况) Manufacturer(制造商)、 ExtClock(外部时钟频率)、 L2CacheSize(二级缓存大小)
内存Root/cimv2

Win32_Computer

System

属性:TotalPhysicalMemory(内存大小) 
硬盘 Root/cimv2Win32_DiskDrive属性:InterfaceType(类型)、 Size(容量)、Signature(序列号)
Win32_LogicalDisk属性:DeviceID(驱动器名称)、Size(盘容量)、FileSystem(文件系统格式)
网卡Root/cimv2Win32_Network Adapter属性:Name(型号)、Manufacturer(制造商)、NetConnectionID(网络连接名称)
打印机Root/cimv2Win32_Printer属性:Name(名称)、Default(是否默认打印机)、PrintStatus(打印机状态)

主机名、域名、

工作组名

Root/cimv2

Win32_Computer

System

属性:Name(主机名)、Domain(域名)、Workgroup(工作组名)

应用软件

查询

Root/cimv2StdRegProv

方法:

REG_SZ:GetString Value

REG_BINARY:GetBinary Value

REG_DOWRK:GetDWORD value

REG_MULTI_SZ:GetMultiString Value

杀毒软件Root\SecurityCenter2AntiVirusProduct 属性:DisplayName(名称) VersionNumber(版本)
防火墙Root\SecurityCenterFirewallProduct 属性:DisplayName(名称) VersionNumber(版本) 
账户信息Root/ cimv2Win32_UserAccount属性:Name(名称)、Disabled(是否停用)、Lockout(是否锁定)、PasswordExpires(密码是否永不过期)
信息查询Root/ cimv2Win32_Process 属性:Name(进程名称)、 ProcessID(PID)、ExecutablePath(执行文件路径)

WMI 核心

WMI 核心是提供程序、管理程序和WMI 存储库之间的中间处理,可以理解为 MVC 中的 "C"(control),负责对用户提供接口,接收从托管对象和 WMI 存储库获取数据的调度请求。

一次访问的过程

如果用户请求的是静态数据,WMI 核心就从 WMI 存储库获取对应的数据;如果包含动态数据,WMI 核心就把请求传递给提供程序,提供程序获取到托管对象的数据后,再返回给 WMI 核心,最后返回给用户。

WMI 使用者

WMI 使用者就是上图中的第 3 层,这层可以理解是用户层或者客户端,比如 WMIC 工具、Powershell 的 Get-Wmi cmdlet 等等,官方的术语是“管理应用”。一个管理应用通过 WMI 的 COM API 或脚本 API 对数据进行查询和枚举,运行提供程序的方法,或者订阅事件。当然,一个托管对象能返回的数据和执行的操作,是提供程序所定义的。 

总结

托管对象是计算机的各种组件和功能;提供程序管理托管对象和定义其所能返回的数据和执行的操作,有着一系列的类;存储库保存一些初始化的信息,包括类定义和命名空间;WMI 核心负责前面三个部分的联动,给客户端提供服务。

学习资料

渗透测试实战之WMI持久化记录

官方文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值