ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wpxxsyzx

上一道冷门的菜(在VBA中使用WMI,,到此结束)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-6-24 10:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 2楼 Zamyi 的帖子

本帖已被收录到知识树中,索引项:WMI应用
求助高人,问题见此贴http://club.excelhome.net/thread-733647-1-1.html

TA的精华主题

TA的得分主题

发表于 2011-6-24 10:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享了

TA的精华主题

TA的得分主题

发表于 2011-6-24 10:28 | 显示全部楼层
虽然不懂,但甚感惊叹,顶一个,顶十个百个。。。。。。。

TA的精华主题

TA的得分主题

发表于 2011-6-24 10:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好教程,顶一个。

以前经常用VBS里的WMI来创建一个桌面快捷方式、改个注册表的值什么的,还真没系统地学习过,希望楼主继续更新,谢谢!

TA的精华主题

TA的得分主题

发表于 2011-6-24 10:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
非常好,收藏了

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-24 11:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你应该发现我们使用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 编辑 ]

枚举类的属性和方法.rar

13.92 KB, 下载次数: 384

例1-修改后的服务管理器.rar

28.06 KB, 下载次数: 382

例10关机.rar

10.44 KB, 下载次数: 396

例11-虚拟内存.rar

12.48 KB, 下载次数: 368

TA的精华主题

TA的得分主题

发表于 2011-6-24 12:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了,不过暂时用不上。

TA的精华主题

TA的得分主题

发表于 2011-6-24 12:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-24 13:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-24 13:46 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-21 10:47 , Processed in 0.040827 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表