|
楼主 |
发表于 2011-6-24 11:24
|
显示全部楼层
你应该发现我们使用WMI的最终目的就是为了得到类的属性,从属性中取得我们需要的值,例如例1里DisplayName、StartMode、Stopped、StartName、Description都是类的属性,分别存储着服务的"名称", "状态", "启动类型", "登录身份", "描述"。你可能要问:每个类中有多少属性,我们想要的结果在那个属性里。
类的属性和方法
下面用两个例子解决解决你的问题
例8、该例可列出指定的类的所有属性,sheet1里添加CommandButton1,代码如下:
Dim WMILocator As New SWbemLocator '定义一个指向WMI的指针
Dim WMIServices As SWbemServices
Dim WMIObject As SWbemObject
Dim WMIProperty As SWbemProperty '定义变量指向类的属性
Private Sub CommandButton1_Click()
Sheet1.Columns(2).Clear
Sheet1.Range("b1") = "属性"
Set WMIServices = WMILocator.ConnectServer()
Set WMIObject = WMIServices.Get("Win32_Process")
i = 2
For Each WMIProperty In WMIObject.Properties_
Sheet1.Range("b" & i).Value = WMIProperty.Name
i = i + 1
Next
Set WMIObject = Nothing
Set WMIProperty = Nothing
Set WMIQualifier = Nothing
End Sub
更换例中的类名就可以列出其他类的属性了。
获取类的属性值只是从系统获得信息,而使用类的方法我们才能操控系统。
对上例左如下修改就可以枚举了的方法了
1、用Dim WMIMethod As SWbemMethod '定义变量指向类的方法替换Dim WMIProperty As SWbemProperty
2、修改循环为:
For Each WMIMethod In WMIObject.Methods_
Sheet1.Range("a" & i).Value = WMIMethod.Name
i = i + 1
Next
替换Set WMIObject = WMIServices.Get("Win32_Process")中的类名就可以枚举其他类的属性和方法了。
现在我们还没有接触到类的方法,很抱歉,例1中的服务管理器和进程管理还不能进行任何操作,下面我们就修改例1,借此学习类的方法
例1 修改,sheet1里添加CommandButton2和CommandButton3,利用上面例子提供的方法查看Win32_Process类的属性和方法,发现它有一个StopService方法(停止服务)和StartService方法(启动服务)代码如下:
Private Sub CommandButton2_Click()
If ActiveCell.Count = 1 And ActiveCell.Column = 1 And ActiveCell.Row > 2 And ActiveCell.Value <> "" Then
Set WMIServices = WMILocator.ConnectServer()
Set WMIObjectSet = WMIServices.ExecQuery("SELECT * FROM Win32_Service WHERE Caption = '" & ActiveCell.Value & "'")
For Each WMIObject In WMIObjectSet
WMIObject.STARTService
此句使用STARTService方法启动你所选的服务
Next
End If
End Sub
Private Sub CommandButton3_Click()
If ActiveCell.Count = 1 And ActiveCell.Column = 1 And ActiveCell.Row > 2 And ActiveCell.Value <> "" Then
Set WMIServices = WMILocator.ConnectServer()
Set WMIObjectSet = WMIServices.ExecQuery("SELECT * FROM Win32_Service WHERE Caption = '" & ActiveCell.Value & "'")
For Each WMIObject In WMIObjectSet
WMIObject.STOPService
此句使用STOPService方法停止你所选的服务
Next
End If
End Sub
单击按钮后再服务管理器界面单击“操作”—“刷新”后查看结果。程序没有考虑容错功能,要想做得逼真,还需增加判断”Stopped”(是否已启动)和”Disabled”(是否已禁用)属性的语句,根据判断的结果决定是否对所选项进行启动和停止操作,自己动手试一下。查看Win32_Service类的方法,还有PauseService(暂停)、ResumeService(继续)、ChangeStartMode(改变启动方式)等许多方法,利用这些方法你还可以让程序实现更多功能。
把例子中的类换成"Win32_Process" ,同时把例子中STOPService 方法换成"Win32_Process"类的Terminate方法(使结束、停止),你的程序就可以停止进程了(同样的道理,须增加判断进程是否为系统进程,是否可以被停止)。附件中仅做了停止IE。
你可以用以上例子随时知道哪些服务和进程处于运行状态,根据你的需要可以随时停止或启动它。
上面例子中的方法没有参数,但是有的方法需要参数。在看一个有参数的方法的例子:
例9、关闭你的计算机(例子中为了测试实际是注销功能),VB中关闭计算机用API药写好长的代码,也可以用shell shutdown语句,这种方法能用 的前提是你的机器中必须要有SHUTDOWN.EXE这个程序,这个例子使用"Win32_OperatingSystem"类的Win32Shutdown方法实现。它的好处是:即使SHUTDOWN.EXE已被你删除也会照样关机,添加按钮,代码如下:
Option Explicit
Dim WMILocator As New SWbemLocator
Dim WMIServices As SWbemServices
Dim WMIObjectSet As SWbemObjectSet
Dim WMIObject As SWbemObject
Private Sub CommandButton1_Click()
Set WMIServices = WMILocator.ConnectServer()
'WMIServices.Security_.Privileges.Add wbemPrivilegeShutdown, True
Set WMIObjectSet = WMIServices.InstancesOf("Win32_OperatingSystem")
For Each WMIObject In WMIObjectSet
WMIObject.Win32Shutdown 0&
Next
Application.Quit
End Sub
参数说明:
0 -退出(注销) , 1 -关机, 2 -重启动
4 -强制退出(注销),即不通知现在活动应用程序让其先自我关闭
5 -强制关机, 6 -强制重启动, 8 -关闭电源, 12--强制关闭电源
除了方法,更改某些属性的值也能实现对系统的操作,再看一个例子:
Option Explicit
Dim WMILocator As New SWbemLocator '定义一个指向WMI的指针
Dim WMIServices As SWbemServices
Dim WMIObjectSet As SWbemObjectSet
Dim WMIObject As SWbemObject
Private Sub CommandButton1_Click()
Set WMIServices = WMILocator.ConnectServer()
'WMIServices.Security_.Privileges.Add wbemPrivilegeCreatePagefile, True
Set WMIObjectSet = WMIServices.InstancesOf("Win32_PageFileSetting")
For Each WMIObject In WMIObjectSet
WMIObject.Name = "d:\pagefile.sys"
WMIObject.InitialSize = "512"
WMIObject.MaximumSize = "1024"
WMIObject.Put_
Next
Set WMIObject = Nothing
Set WMIObjectSet = Nothing
End Sub
修改后可以右键“我的电脑”查看(不用我说了吧),重启后生效。(与界面操作不同,不会出现要求重启的对话框)
如果你把例10里的参数修改为注销以外的值,或者你运行例11,恰巧你的虚拟内存不再d盘,你会得到一个错误提示。这是因为改动系统设置等操作关系到系统的安全,盖茨不会让你轻易实现的,你需要增加特殊的权限。如果要想不受限制运行以上两例,你要把两例中被注释掉的以下两句取消注释。这两句就是用于增加权限的。
'WMIServices.Security_.Privileges.Add wbemPrivilegeCreatePagefile, True
'WMIServices.Security_.Privileges.Add wbemPrivilegeShutdown, True
按说在第二部分开头提到的ConnectServer方法参数的第六部分(StrAuthority :权限信息)设置权限也可以,但是经过N次实验,在那里设置权限都以失败告终。(why,还没有找到关于这个参数的具体设置说明,那位知道,拜托告诉我)
另外,如果你急于练习,用前面的方法获取了一个类的实例并给实例的属性赋值的话,十有八九你同样会得到一个错误提示。这是因为并不是每一个属性都是可写的,并且大部分属性是只读的,(在VBA中也是这样,只不过VBA中的属性大部分是可读写的)。微软真的很麻烦啊,我怎么知道那个属性是可写的?属性是否可写是由属性的限定符决定的,不过列出每个属性的限定符真的很简单!
就到这里吧,关于权限设置和属性限定符下次再说。85楼继续
[ 本帖最后由 wpxxsyzx 于 2011-6-29 08:23 编辑 ] |
|