VB 使用WMI编程讲座(原创)
一、认识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 , \进程ID\ ListView1.ColumnHeaders.Add , \进程名\ ListView1.ColumnHeaders.Add , \路径\ 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(\ss\返回Win32_Process类名标识的所有实例 i = 0
For Each objSWbemObject In objSWbemObjectSet '枚举每一个Win32_Process的实例
ListView1.ListItems.Add , \将进程ID添加到ListView1第一列
ListView1.ListItems(\e '将进程名添加到ListView1第二列
If Not IsNull(objSWbemObject.ExecutablePath) Then _
ListView1.ListItems(\ExecutablePath '将进程路径添加到ListView1第三列 i = i + 1
Next
Set objSWbemObjectSet = Nothing End Sub
Private Sub Command2_Click() Dim TMBack As Long
If ListView1.SelectedItem.Text <> \
If MsgBox(\确实要结束进程[\(1) & \吗?\
Set objSWbemObjectSet = objSWbemServices.ExecQuery(\T * FROM Win32_Process WHERE Handle = '\t & \查询Win32_Process类中Handle属性等于指定值的所有实例 For Each objSWbemObject In objSWbemObjectSet
TMBack = objSWbemObject.Terminate '终止指定进程 Next
If TMBack = 0 Then
MsgBox ListView1.SelectedItem.SubItems(1) & \已经被终止!\
Else
MsgBox ListView1.SelectedItem.SubItems(1) & \不能被终止!\
End If
Command1_Click '刷新进程列表 End If End If End Sub
呵呵,我们没有用任何系统的API函数却千真万确的实现了进程管理这个系
统级的应用,而且采用的是标准的面向对象的编程,其实这段代码仅仅实现了我们在前面提到的一篇“自己做进程管理器”的帖子中用API函数也能实现的功能。嗯???怎么?还能比这更强?哈哈,当然!!下一讲我们分析该例程时,还会告诉各位,将该例程稍加修改,就可以在你的局域网中对任何一台WIN2000以上的计算机进行进程管理!晕!那不是我就能在我的局域网中为所欲为了吗?别急,那当然是有条件的,微软当然不会允许未经授权就可以随便控制其它的计算机的。
因为本人平时工作还是比较忙的,只有抽空就继续写,打算每星期写一讲,本次算是第一讲,下一讲主要结合本讲的例程,介绍在VB中使用WMI的基本方法。
二、VB中使用WMI的基本方法
上一讲我们初步了解了一下WMI,并在VB中使用WMI对象做了一个进程管理器,为加深各位的对WMI对象引用方法的程序结构印象和增加兴趣,我们再举一个例子,就是枚举当前系统所有服务的名称、状态和启动类型等。与例程1一样,首先建立一个新工程具有Form1窗体,在菜单中的【工程】—【部件】下,添加“Microsoft Windows Common Controls 6.0”,在菜单中的【工程】—【引用】下,添加“Microsoft WMI Scripting V1.1 Library”,然后在Form1窗体上添加1个ListView1,在代码窗口添加如下代码(例程2):
Option Explicit
Dim objSWbemLocator As SWbemLocator Dim objSWbemServices As SWbemServices Dim objSWbemObjectSet As SWbemObjectSet Dim objSWbemObject As SWbemObject
Dim strComputer As String, strNameSpace As String, strClass As String
Private Sub Form_Load() Dim i As Long