赞
踩
目录
上一篇《WMIC学习笔记》讲了 WMIC 工具的入门知识,但使用时不理解有些命令,比如 NAMESPACE、PATH 等,所以我做了一些研究。
wmic 是使用 wmi 的工具,或者说 wmic 是 wmi 服务的客户端。想要理解 wmic 命令,必须先理解 wmi,这篇文章只是简单讲解一些我能理解的、有关 wmi 的概念,有利于我使用 WMIC 工具,并非十分深入,可能有误。
wmi 体系结构图:
主要部分:托管对象(managed object)、WMI 提供程序(WMI provider)、WMI 基础架构(WMI infrastructure)、WMI 使用者(WMI consumer)。
一个托管对象是一个逻辑组件或物理组件,比如硬盘驱动器、网络适配器、数据库系统、操作系统、进程或服务等等。
简单说,如果把组成计算机的各种组件抽象出来,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_Process、Win32_LogicalDisk。这个提供程序的 dll 文件是 Stdprov.dll,包含动态返回数据的代码。Win32_LogicalDisk 类被定义在 MOF 文件中,在系统启动时被编译到 WMI 存储库中。
WMI 基础架构就是 WMI 服务,在任务管理器可以看到它的服务进程:
WMI 基础包含两个部分:WMI 核心、WMI 存储库。
WMI 存储库保存的是静态数据(动态数据就是从提供程序获取到托管对象的实时数据,比如占用的内存),比如提供程序的类定义。
WMI 存储库是通过 WMI 命名空间(namespace)组织的。WMI 服务在启动时创建了一些命名空间,比如 root\default、root\cimv2 和 root\subscription 等,并且在这些命名空间预安装了一组默认的类定义,比如 Win32 类,WMI 系统类,等等。还有其他的命名空间是由提供程序创建的。
这里的“命名空间”可以理解为 PHP 的命名空间,有着解决命名冲突,对类进行分类,以及定位类的位置等作用。
介绍几个命名空间及其含义:
root\default:与 Windows 注册表操作有关的主机类,可以读取、写入、枚举、监视、创建、删除注册表项和值。
root\cimv32:包含从 CIM 存储库派生的类,提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组等 Win32 信息资源。
root\Security:用于与 Windows 安全有关的类。
root\WMI:提供对 WDM 设备驱动程序中信息访问的类。
列举这些命名空间的一些类:
分类 | WMI 接口 | ||
---|---|---|---|
命名空间 | 类 | 属性/方法 | |
制造商 | Root/cimv2 | Win32_Computer System | 属性:Manufacturer(制造商)、 Model(型号) |
CPU | Root/cimv2 | Win32_Processor | 属性:Name(CPU 基本情况) Manufacturer(制造商)、 ExtClock(外部时钟频率)、 L2CacheSize(二级缓存大小) |
内存 | Root/cimv2 | Win32_Computer System | 属性:TotalPhysicalMemory(内存大小) |
硬盘 | Root/cimv2 | Win32_DiskDrive | 属性:InterfaceType(类型)、 Size(容量)、Signature(序列号) |
Win32_LogicalDisk | 属性:DeviceID(驱动器名称)、Size(盘容量)、FileSystem(文件系统格式) | ||
网卡 | Root/cimv2 | Win32_Network Adapter | 属性:Name(型号)、Manufacturer(制造商)、NetConnectionID(网络连接名称) |
打印机 | Root/cimv2 | Win32_Printer | 属性:Name(名称)、Default(是否默认打印机)、PrintStatus(打印机状态) |
主机名、域名、 工作组名 | Root/cimv2 | Win32_Computer System | 属性:Name(主机名)、Domain(域名)、Workgroup(工作组名) |
应用软件 查询 | Root/cimv2 | StdRegProv | 方法: REG_SZ:GetString Value REG_BINARY:GetBinary Value REG_DOWRK:GetDWORD value REG_MULTI_SZ:GetMultiString Value |
杀毒软件 | Root\SecurityCenter2 | AntiVirusProduct | 属性:DisplayName(名称) VersionNumber(版本) |
防火墙 | Root\SecurityCenter | FirewallProduct | 属性:DisplayName(名称) VersionNumber(版本) |
账户信息 | Root/ cimv2 | Win32_UserAccount | 属性:Name(名称)、Disabled(是否停用)、Lockout(是否锁定)、PasswordExpires(密码是否永不过期) |
信息查询 | Root/ cimv2 | Win32_Process | 属性:Name(进程名称)、 ProcessID(PID)、ExecutablePath(执行文件路径) |
WMI 核心是提供程序、管理程序和WMI 存储库之间的中间处理,可以理解为 MVC 中的 "C"(control),负责对用户提供接口,接收从托管对象和 WMI 存储库获取数据的调度请求。
如果用户请求的是静态数据,WMI 核心就从 WMI 存储库获取对应的数据;如果包含动态数据,WMI 核心就把请求传递给提供程序,提供程序获取到托管对象的数据后,再返回给 WMI 核心,最后返回给用户。
WMI 使用者就是上图中的第 3 层,这层可以理解是用户层或者客户端,比如 WMIC 工具、Powershell 的 Get-Wmi cmdlet 等等,官方的术语是“管理应用”。一个管理应用通过 WMI 的 COM API 或脚本 API 对数据进行查询和枚举,运行提供程序的方法,或者订阅事件。当然,一个托管对象能返回的数据和执行的操作,是提供程序所定义的。
托管对象是计算机的各种组件和功能;提供程序管理托管对象和定义其所能返回的数据和执行的操作,有着一系列的类;存储库保存一些初始化的信息,包括类定义和命名空间;WMI 核心负责前面三个部分的联动,给客户端提供服务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。