您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > VB使用WMI编程讲座(原版整理)(持续更新)
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是WindowsManagementInstrumentation(Windows管理工具)的缩写,是内置在Windows2000、WindowsXP和WindowsServer2003系列操作系统中核心的管理支持技术。基于由DistributedManagementTaskForce(DMTF)所监督的业界标准,WMI是一种规范和基础结构,通过它可以访问、配置、管理和监视所有的—几乎所有的Windows资源。呵呵,不要对这段文字进行咬文嚼字,通俗的讲,就是WMI是一个用于管理Windows系统的对象,就像ADO对象是用于数据库操作的。利用WMI我们可以管理Windows系统中的磁盘、事件日志、文件、文件夹、文件系统、网络组件、操作系统设置、性能数据、打印机、进程、注册表设置、安全性、服务、共享、用户、组等等。而WMI适用的运得环境也是有些限制的,WMI附带在WindowsMe、Windows2000、WindowsXP和WindowsServer2003之中。对于Windows98和WindowsNT4.0,可以访问并搜索“WindowsManagementInstrumentation(WMI)CORE1.5(Windows95/98/NT4.0)”。注意:在WindowsNT4.0上安装并运行WMI之前,需要首先安装ServicePack4或更高版本。WMI需要的其他软件包括:1.MicrosoftInternetExplorer5.0或更高版本。2.WindowsScriptHost(WSH)。Windows2000、WindowsXP、WindowsServer2003、和WindowsMe附带的WSH,而不是WindowsNT4或Windows98附带的WSH。您可以从以下地址下载WSH的最新版本——包括在WindowsXP和WindowsServer2003之中——是WSH5.6。要使WMI脚本可以正常的运行,Windows里的WMI服务(winmgmt)保证是运行的,这样才可以实现WMI里的更多功能。好了,关于WMI的一些基本的信息资料就说到这,要想看更多的可以到MicroSoft网站的MSDN找。大家都喜欢通过例程来学东西,那我们也先编一段程序来看看。不知道大家看到过没有本人在本论坛中曾经写过一篇“自己做进程管理器”的帖子,在那篇帖子里主要是采用API函数罗列出当前系统下正在运行的所有进程,下面我们利用WMI也来做一个进程管理器。首先建立一个新工程具有Form1窗体,在菜单中的【工程】—【部件】下,添加“MicrosoftWindowsCommonControls6.0”,在菜单中的【工程】—【引用】下,添加“MicrosoftWMIScriptingV1.1Library”,然后在Form1窗体上添加1个ListView1和Command1、Command2,在代码窗口添加如下代码(例程1):OptionExplicitDimobjSWbemLocatorAsNewSWbemLocatorDimobjSWbemServicesAsSWbemServicesDimobjSWbemObjectSetAsSWbemObjectSetDimobjSWbemObjectAsSWbemObjectPrivateSubForm_Load()Me.Caption=进程管理器Command1.Caption=刷新Command2.Caption=结束进程ListView1.ColumnHeaders.ClearListView1.ColumnHeaders.Add,a,进程ID,600ListView1.ColumnHeaders.Add,b,进程名,2000ListView1.ColumnHeaders.Add,c,路径,6000ListView1.View=lvwReportCommand1_Click'刷新进程列表EndSubPrivateSubCommand1_Click()DimiAsLongListView1.ListItems.Clear'清空ListViewSetobjSWbemServices=objSWbemLocator.ConnectServer()'连接到本机的WMI,返回一个对SWbemServices对象的引用SetobjSWbemObjectSet=objSWbemServices.InstancesOf(Win32_Process)'返回Win32_Process类名标识的所有实例i=0ForEachobjSWbemObjectInobjSWbemObjectSet'枚举每一个Win32_Process的实例ListView1.ListItems.Add,a&i,objSWbemObject.Handle'将进程ID添加到ListView1第一列ListView1.ListItems(a&i).SubItems(1)=objSWbemObject.Name'将进程名添加到ListView1第二列IfNotIsNull(objSWbemObject.ExecutablePath)Then_ListView1.ListItems(a&i).SubItems(2)=objSWbemObject.ExecutablePath'将进程路径添加到ListView1第三列i=i+1NextSetobjSWbemObjectSet=NothingEndSubPrivateSubCommand2_Click()DimTMBackAsLongIfListView1.SelectedItem.TextThenIfMsgBox(确实要结束进程[&ListView1.SelectedItem.SubItems(1)&]吗?,vbYesNo)=vbYesThenSetobjSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROMWin32_ProcessWHEREHandle='&ListView1.SelectedItem.Text&')'查询Win32_Process类中Handle属性等于指定值的所有实例ForEachobjSWbemObjectInobjSWbemObjectSetTMBack=objSWbemObject.Terminate'终止指定进程NextIfTMBack=0ThenMsgBoxListView1.SelectedItem.SubItems(1)&已经被终止!ElseMsgBoxListView1.SelectedItem.SubItems(1)&不能被终止!EndIfCommand1_Click'刷新进程列表EndIfEndIfEndSub呵呵,我们没有用任何系统的API函数却千真万确的实现了进程管理这个系统级的应用,而且采用的是标准的面向对象的编程,其实这段代码仅仅实现了我们在前面提到的一篇“自己做进程管理器”的帖子中用API函数也能实现的功能。嗯???怎么?还能比这更强?哈哈,当然!!下一讲我们分析该例程时,还会告诉各位,将该例程稍加修改,就可以在你的局域网中对任何一台WIN2000以上的计算机进行进程管理!晕!那不是我就能在我的局域网中为所欲为了吗?别急,那当然是有条件的,微软当然不会允许未经授权就可以随便控制其它的计算机的。因为本人平时工作还是比较忙的,只有抽空就继续写,打算每星期写一讲,本次算是第一讲,下一讲主要结合本讲的例程,介绍在VB中使用WMI的基本方法。二、VB中使用WMI的基本方法上一讲我们初步了解了一下WMI,并在VB中使用WMI对象做了一个进程管理器,为加深各位的对WMI对象引用方法的程序结构印象和增加兴趣,我们再举一个例子,就是枚举当前系统所有服务的名称、状态和启动类型等。与例程1一样,首先建立一个新工程具有Form1窗体,在菜单中的【工程】—【部件】下,添加“MicrosoftWindowsCommonControls6.0”,在菜单中的【工程】—【引用】下,添加“MicrosoftWMIScriptingV1.1Library”,然后在Form1窗体上添加1个ListView1,在代码窗口添加如下代码(例程2):OptionExplicitDimobjSWbemLocatorAsSWbemLocatorDimobjSWbemServicesAsSWbemServicesDimobjSWbemObjectSetAsSWbemObjectSetDimobjSWbemObjectAsSWbemObjectDimstrComputerAsString,strNameSpaceAsString,strClassAsStringPrivateSubForm_Load()DimiAsLongMe.Caption=服务ListView1.ColumnHeaders.ClearListView1.ColumnHeaders.Add,,名称,2600ListView1.ColumnHeaders.Add,,状态,1000ListView1.ColumnHeaders.Add,,启动类型,1000ListView1.ColumnHeaders.Add,,路径,2600ListView1.ColumnHeaders.Add,,登录身份,1400ListView1.View=lvwReportstrComputer=.'计算机名,.为本机strNameSpace=root\cimv2'指定命名空间为root\cimv2strClass=Win32_Service'指定类为Win32_ServiceSetobjSWbemLocator=CreateObject(WbemScripting.SWbemLocator)'建立1个WBEM对象的引用指针SetobjSWbemServices=objSWbemLocator.ConnectServer(strComputer,strNameSpace)'连接到指定计算机、命名空间的WMI,返回一个对SWbemServices对象的引用SetobjSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROM&strClass)'通过WQL查询,返回指定类的所有实例ForEachobjSWbemObjectInobjSWbemObjectSetListView1.ListItems.Add,a&i,objSWbemObject.DisplayName'将服务名称添加到ListView1第一列ListView1.ListItems(a&i).SubItems
本文标题:VB使用WMI编程讲座(原版整理)(持续更新)
链接地址:https://www.777doc.com/doc-2853993 .html