由底至上是:
• 托管资源
• WMI 基础结构
• 使用者
托管资源
托管资源是任意逻辑或物理组件,通过使用 WMI 进行公开和管理。可以使用 WMI 管理的 Windows 资源包括:计算机系统、磁盘、外围设备、事件日志、文件、文件夹、文件系统、网络组件、操作系统子系统、性能计数器、打印机、进程、注册表设置、安全性、服务、共享、SAM 用户和组、Active Directory、Windows 安装程序、Windows 驱动程序模式 (WDM) 设备驱动程序,以及 SNMP 管理信息基 (MIB) 数据等。WMI 托管资源通过一个提供程序与 WMI 通讯。
WMI 基础结构
中间层是 WMI 基础结构。WMI 由四个主要组件构成:公共信息模型对象管理器(Common Information Model Object Manager,CIMOM)、公共信息模型(Common Information Model,CIM)储存库,以及提供程序。这三个 WMI 组件共同提供通过其定义、公开、访问和检索配置和管理数据的基础结构,为了叙述和理解方便,我们在本文中就将这三个组件通称为CIM储存库。第四个组件是 WMI 脚本对象库,就是我们前面几个例程都必须引用的“Microsoft WMI Scripting V1.1 Library”对象库,就我们来说 — 就是使用者,首先就是通过WMI 脚本库与CIM储存库打交道去管理系统的各种托管资源。因此我们重点关注的应该是CIM储存库和WMI脚本对象库。
CIM 储存库
WMI 的基本思想是 — 可以用一个架构统一表示来自不同源的配置和管理信息。CIM 就是这个架构,还调用了模型化托管环境和定义每个由 WMI 公开的数据块的对象储存库或类存储。该架构基于 DMTF 公共信息模型标准。
CIM 由类 组成。类是一个 WMI 托管资源的一个模型。CIM 类通常表示动态资源,就是说托管资源的实例并不存储在 CIM 中,而是通过基于使用者请求的提供程序动态检索。其原因很简单,大多数 WMI 托管资源的操作状态更改很频繁,因而必须按需读取以确保检索的是最新的信息,就象我们例程1中的进程和例程2中的服务随时都在变动的。
注在 CIM 的上下文中,储存库这一术语有些被误解。尽管 CIM 是一个储存库,而且能够存储静态数据,但其主要角色是存储托管资源的模型。
CIM 类是分级组织的,每一级的子类从父类继承。DMTF 维护一组核心和公共基类,系统和应用程序软件开发人员(如 Microsoft 的那些)从这些类派生和创建系统(或应用程序)特定的扩展类。
类被分组到命名空间 中,命名空间是表示一个特定的管理区域的类逻辑组。例如,命名空间 root/cimv2 包括大部分表示通常与计算机和操作系统相关联的资源的类。在前面的例程中使用的类(Win32_Process、Win32_Service 和为Win32_ShortcutFile)驻留在命名空间 root/cimv2,它们只是在 CIM 中定义的数百个类中的三个。
CIM 类由属性和方法构成。属性描述 WMI 托管资源的配置和状态,方法是在 WMI 托管资源上执行操作的可执行函数。
注 不要将由 CIM 定义的方法和属性与由 WMI 脚本对象库中的自动化对象提供的方法和属性相混淆。
WMI 脚本对象库
WMI 脚本对象库提供一组应用对象集,WMI 脚本对象库中的这些对象为 WMI 基础结构提供一个一致且统一的模型。如前面所示,一旦您了解如何使用 WMI 脚本对象库检索一个托管资源类型,您就可以轻松使用相同的步骤来检索其它的 WMI 托管资源。例如,您可以使用前面列出的 5个例程中的任何一个,并很容易地修改这个脚本来检索在远程计算机上的事件日志记录 (Win32_NTLogEvent) 信息、处理器 (Win32_Processor) 信息、操作系统 (Win32_OperatingSystem) 信息,或者由 WMI 公开的数百个托管资源中的任何一个。
使用者
使用者就是利用WMI的人,就是我们喽,或者说是可以利用WMI编程的程序语言,就不多说了
本节就到这里吧,下一讲我们详细分析一下CIM的结构。
一、认识WMI
通常VB程序员经常抱怨VB在编制Windows系统软硬件设备控制方面的程序比较困难,即使能实现一些功能,那也是要通过调用繁复的API函数,即难找寻到合适的函数,又难以理解设置函数中的各项参数,尤其是调试异常困难,动不动整个程序连带VB环境一起死悄悄。此外,用API编程几乎完全抛弃了面向对象的编程方法,迫使我们回到过程方式的编程。那怎么办呢?^_^别急,微软在WIN2000系统中推出了VBScript脚本语言替代原来的批命令,同时提供了一个供VBScript管理Windows系统的对象WMI。那这个WMI对象我们VB能用吗?答案是肯定的,当然能用,而且用起来还非常方便,在网上也已经有了一些VB写的利用WMI实现Windows系统管理编程的例程,但却缺少系统性介绍使用VB对WMI编程的资料。本文就针对此问题,进行一个尝试。当然要学习WMI编程,需要有一定的VB基础,但要求不高,只要会用控件、对象,能理解和使用对象的方法、属性,但不需要任何API方面的知识和编程经验。
首先我们要知道什么是WMI?WMI是Windows Management Instrumentation (Windows管理工具)的缩写,是内置在 Windows 2000、Windows XP 和 Windows Server 2003 系列操作系统中核心的管理支持技术。基于由 Distributed Management Task Force (DMTF) 所监督的业界标准,WMI 是一种规范和基础结构,通过它可以访问、配置、管理和监视所有的 — 几乎所有的 Windows 资源。
呵呵,不要对这段文字进行咬文嚼字,通俗的讲,就是WMI是一个用于管理Windows系统的对象,就像ADO对象是用于数据库操作的。利用WMI我们可以管理Windows系统中的磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。
而WMI适用的运得环境也是有些限制的, WMI 附带在 Windows Me、Windows 2000、Windows XP 和 Windows Server 2003 之中。对于 Windows 98 和 Windows NT 4.0,可以访问http://www.microsoft.com/downloads并搜索“Windows Management Instrumentation (WMI) CORE 1.5 (Windows 95/98/NT 4.0)”。注意:在 Windows NT 4.0 上安装并运行 WMI 之前,需要首先安装 Service Pack 4 或更高版本。
WMI 需要的其他软件包括:
1. Microsoft Internet Explorer 5.0 或更高版本。
2. Windows Script Host(WSH)。Windows 2000、Windows XP、Windows Server 2003、和 Windows Me 附带的 WSH,而不是 Windows NT4 或 Windows 98 附带的 WSH。您可以从以下地址下载 WSH http://www.microsoft.com/downloads. WSH 的最新版本—— 包括在 Windows XP 和 Windows Server 2003 之中——是 WSH 5.6。
要使WMI脚本可以正常的运行,Windows里的WMI 服务(winmgmt)保证是运行的,这样才可以实现WMI里的更多功能。好了,关于WMI的一些基本的信息资料就说到这,要想看更多的可以到MicroSoft网站的MSDN找。
大家都喜欢通过例程来学东西,那我们也先编一段程序来看看。不知道大家看到过没有本人在本论坛中曾经写过一篇“自己做进程管理器”的帖子,在那篇帖子里主要是采用API函数罗列出当前系统下正在运行的所有进程,下面我们利用WMI也来做一个进程管理器。首先建立一个新工程具有Form1窗体,在菜单中的【工程】—【部件】下,添加“Microsoft Windows Common Controls 6.0”,在菜单中的【工程】—【引用】下,添加“Microsoft WMI Scripting V1.1 Library”,然后在Form1窗体上添加1个ListView1和Command1、Command2,在代码窗口添加如下代码(例程1):
Option Explicit
Dim objSWbemLocator As New SWbemLocator
Dim objSWbemServices As SWbemServices
Dim objSWbemObjectSet As SWbemObjectSet
Dim objSWbemObject As SWbemObject
Private Sub Form_Load()
Me.Caption = "进程管理器"
Command1.Caption = "刷新"
Command2.Caption = "结束进程"
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , "a", "进程ID", 600
ListView1.ColumnHeaders.Add , "b", "进程名", 2000
ListView1.ColumnHeaders.Add , "c", "路径", 6000
ListView1.View = lvwReport
Command1_Click '刷新进程列表
End Sub
Private Sub Command1_Click()
Dim i As Long
ListView1.ListItems.Clear '清空ListView
Set objSWbemServices = objSWbemLocator.ConnectServer() '连接到本机的WMI,返回一个对 SWbemServices 对象的引用
Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Process") '返回Win32_Process类名标识的所有实例
i = 0
For Each objSWbemObject In objSWbemObjectSet '枚举每一个Win32_Process的实例
ListView1.ListItems.Add , "a" & i, objSWbemObject.Handle '将进程ID添加到ListView1第一列
ListView1.ListItems("a" & i).SubItems(1) = objSWbemObject.Name '将进程名添加到ListView1第二列
If Not IsNull(objSWbemObject.ExecutablePath) Then _