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 15:03 | 显示全部楼层
本帖已被收录到知识树中,索引项:WMI应用
必须收藏!虽然还看不懂。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-24 16:46 | 显示全部楼层
明天周末,写不成了,周一再继续。

TA的精华主题

TA的得分主题

发表于 2011-6-25 09:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

收藏一下

收藏一下,谢谢楼主

TA的精华主题

TA的得分主题

发表于 2011-6-27 08:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
表示支持,不错啊,继续

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-29 08:22 | 显示全部楼层
上节遗留了两个问题,先来看第一个——限定符
其实不仅仅属性有限定符,类本身和类的方法也有限定符,根据名字理解,限定符就是对它们的使用进行了限制,我们必须按规定使用它们。说白了就是它们能干什么、不能干什么。
我们用Dim定义的WMIObject 、WMIProperty、WMIMethod、对象都有个Qualifiers_属性,里面包含限定符的信息(它是一个集合),用Dim WMIQualifier As SWbemQualifier定义一个WMIQualifier对象,然后在以上三种对象的Qualifiers_集合中遍历就可以枚举限定符了。如何枚举限定符就不在详细说明了,更新后的例子里已可以枚举限定符了

关于限定符WMI有详细的列表,不一一列举了,简单说几个我认为比较重要的:
1、类限定符:类限定符提供了关于使用类的操作信息。例如:
A、Abstract:表明该类是抽象类
B、Dynamic:表明该类是动态类
C、Association:表明该类是关联类
D、没有以上三个限定符的表明该类是静态类
E、Provider 限定符告诉您服务这个类的提供程序。例如,Win32_Service 类的 Provider 限定符告诉您这个类使用 CIMWin32 提供程序 (cimwin32.dll), Win32_NTLogEvent 类的 Provider 限定符表明Win32_NTLogEvent 类使用 MS_NT_EVENTLOG_PROVIDER 提供程序 (ntevt.dll)。
F、Privileges 限定符告诉您要使用这个类所需要的专用特权。例如,Win32_NTLogEvent 类的 Privileges 限定符告诉您在 Win32_NTLogEvent 类可以用来管理安全日志前,SeSecurityPrivilege 必须被启用。
2、属性限定符:属性限定符提供关于使用每个属性的信息。例如:
A、CIMType 限定符告诉您该属性的数据类型。
B、Read 限定符指出这个属性是可读的。
C、Write 限定符指出您是否可以修改属性的值。例如,例11里Win32_PageFileSetting类的 WMIObject.InitialSize属性被标记为可写,例1中所有 Win32_Service 属性都没有write限定符,说明它们都是只读的。
D、Key 限定符指出该属性是类的键,并且用于识别在相同资源集合中的托管资源的唯一实例。
3、方法限定符:方法限定符提供关于使用每个方法的信息。例如:
A、ValueMap 限定符列举方法的返回值。
B、Privileges 限定符告诉您调用这个方法所需的专用特权。例如例9 Win32_OperatingSystem类的Win32Shutdown方法的Privileges限定符告诉你要使用该方法你要拥有wbemPrivilegeShutdown特权。
第二个问题——特殊权限
就像例9和11一样有些类和属性必须拥有它们的限定符规定的特权才能使用,不啰嗦了,给出特权的取值和说明列表:
常量名                       常量值    说明
wbemPrivilegeCreateToken        1        创建一个Token对象(仅赋予本地安全权限)
wbemPrivilegePrimaryToken       2        替换进程一级的Token对象(仅赋予本地安全权限)
wbemPrivilegeLockMemory         3        锁定内存页面
wbemPrivilegeIncreaseQuota      4        增加配额
wbemPrivilegeMachineAccount    5        在域中创建机器账户
wbemPrivilegeTcb               6        用作操作系统的一部分,主要用来提供背景服务,一般不赋予任何用户账户
wbemPrivilegeSecurity           7        管理审计并查看、保存、删除安全日志
wbemPrivilegeTakeOwnership     8        占有对象(比如文件夹、打印机)
wbemPrivilegeLoadDriver         9        加载和卸载设备驱动
wbemPrivilegeSystemProfile       10       记录系统性能
wbemPrivilegeSystemtime         11      设置系统时间
wbemPrivilegeProfileSingleProcess  12       记录独立进程(的示范性能)
wbemPrivilegeIncreaseBasePriority  13       改变进程的执行优先权
wbemPrivilegeCreatePagefile       14      创建页面文件
wbemPrivilegeCreatePermanent    15       创建永久共享对象
wbemPrivilegeBackup            16       创建备份文件和目录而不用考虑文件系统的权限
wbemPrivilegeRestore            17       还原文件和目录而不用考虑文件系统的权限
wbemPrivilegeShutdown          18       在本机关闭系统
wbemPrivilegeDebug             19       调试程序,一般由编程者用于处理比较低级的对象,比如线程
wbemPrivilegeAudit              20        生成安全审计的日志条目
wbemPrivilegeSystemEnvironment  21      修改固件环境值(存储在非易失性RAM中,一般存储在基于RISC的系统
wbemPrivilegeChangeNotify        22      避开遍历,允许访问目录中的子文件夹而不用访问它们的父文件夹
wbemPrivilegeRemoteShutdown    23       远程关闭系统
wbemPrivilegeUndock            24       从坞站移除计算机
wbemPrivilegeSyncAgent          25       同步目录服务器数据
wbemPrivilegeEnableDelegation    26       使计算机和用户账户能被信任以进行委派
要添加特权,请在利用指针连接到本机的WMI,返回一个对 SWbemServices 对象的引用后进行,即Set WMIServices = WMILocator.ConnectServer() 语句之后,语法如下:
WMIServices.Security_.Privileges.Add 特权值, True。
例9、11分别用以下两句获得了关机和修改页面文件的权利
WMIServices.Security_.Privileges.Add wbemPrivilegeShutdown, True
'WMIServices.Security_.Privileges.Add wbemPrivilegeCreatePagefile, True
第三个问题
WMI主要和管理系统有关,并且可以进行远程控制,所以安全性是很重要的。安全性主要影响操作远程计算机。它要求模拟和身份验证设置(当然还包括用户和口令)。原因如下:
1、如果用于远程连接的远程计算机和帐户配置不当,Windows 防火墙可能会造成访问被拒绝的错误(例如“RPC 服务器不可用”错误)。
如果你要操作远程计算机,请根据情况设置以下两项。
2、Windows 2000 和更高版本的默认 Impersonation(模拟) 级别为“Impersonate”,但之前的版本Windows的默认Impersonation 级别为“Identify”。如果使用WMI的机器和被操作的机器的系统平台不一样,您要指定 Impersonation(模拟)级别以实现不同版本的协调和兼容。
模拟类型的取值:
常量值                              常量名    说明
wbemImpersonationLevelAnonymous       1        没有提交任何连接证书,一般是失败,默认使用原版本的WMI1.01
wbemImpersonationLevelIdentify           2        要求远程对象标识调用程序证书,一般是失败,默认使用WMI1.1

wbemImpersonationLevelImpersonate       3        允许远程对象使用调用程序证书,推荐设置,默认使用WMI1.5

wbemImpersonationLevelDelegate          4        当连接到其他对象时允许远程对象使用调用程序证书
要添加模拟级别,请在利用指针连接到本机的WMI,返回一个对 SWbemServices 对象的引用后进行,即Set WMIServices = WMILocator.ConnectServer() 语句之后,语法如下:
WMIServices.Security_. ImpersonationLevel.Add 模拟级别值, True。
3、获得和远程计算机的通讯后,机器之间传递的数据有时是很重要的,例如使用ConnectServer方法将用户名和密码作为参数发送,这些数据不能被别人截获。Authentication(身份验证)级别规定机器间传递的数据如何进行安全保护。
验证类型的取值:
常量值                              常量名    说明
WbemAuthenticationLevelDefault          0        默认的Windows验证设置t
WbemAuthenticationLevelNone            1        没有验证
WbemAuthenticationLevelConnect         2         仅在初始连接期间验证
WbemAuthenticationLevelCall             3         仅在每个服务器请求开始时验证
WbemAuthenticationLevelPkt             4         验证来自客户的每个数据包
WbemAuthenticationLevelPktIntegrity      5         验证来自客户的每个数据包,并校验数据没有被篡改
WbemAuthenticationLevelPktPrivacy       6         对数据加密,最安全的验证
要添加模拟级别,请在利用指针连接到本机的WMI,返回一个对 SWbemServices 对象的引用后进行,即Set WMIServices = WMILocator.ConnectServer() 语句之后,语法如下:
WMIServices.Security_. AuthenticationLevel.Add身份验证值, True。
总结一下使用WMI的基本步骤:
1、根据你想要的结果寻找合适的类
2、查看类的限定符,如果存在Privileges 限定符,记下Privileges 限定符的值。
3、在利用指针连接到本机的WMI,返回一个对 SWbemServices 对象的引用后,即Set WMIServices = WMILocator.ConnectServer() 语句之后用
WMIServices.Security_. AuthenticationLevel.Add Privileges 限定符的值, True。添加特权。
4、如果要用到类的属性,请查看你要使用的属性的限定符,如果存在Privileges 限定符,记下
Privileges 限定符的值。添加特权(方法同上)。
5、如果要用到类的方法,请查看你要使用的方法的限定符,如果存在Privileges 限定符,记下Privileges 限定符的值。添加特权(方法同上)。
再来看量个例子:
例12,设置系统的时间。(例子中把系统时间设置为我注册ExcelHome的时间2011/03/03 08:26)
考虑到时间是系统的组成部分,所以连接到Win32_OperatingSystem类,查看类的限定符,没有发现Privileges 限定符,说明使用该类不需要特权,枚举该类的方法,发现该类有一个setdatetime
方法,继续查看该方法的限定符,发现了Privileges 限定符,其值为SeSystemTimePrivilege,说明要使用该方法需要先添加特权。代码如下:
Option Explicit

Dim WMILocator As New SWbemLocator
Dim WMIServices As SWbemServices
Dim WMIObject As SWbemObject
Dim WMIObjectSet As SWbemObjectSet

Private Sub CommandButton1_Click()
Set WMIServices = WMILocator.ConnectServer()
WMIServices.Security_.Privileges.Add wbemPrivilegeSystemtime, True‘添加特权
Set WMIObjectSet = WMIServices.InstancesOf("Win32_OperatingSystem")
For Each WMIObject In WMIObjectSet
    WMIObject.setdatetime "20110629170026.000000+480"
Next
End Sub
参数格式为yyyymmdd(日期)hhmmss(时间).000000+480,六个零是用于校准时间差,不详细解释了,+480是因为我们所在的时区和格林威治时间相差8个小时。(看看控制面板中时区选项你就明白了)
例13、建立共享文件夹,本例把C盘下的VBA文件夹建立共享(请先在C盘下建一个你要共享的文件夹,例子中是VBA文件夹,可能需要刷新一下才能看到结果)。
不用想,应该连接到Win32_share类,查看类的限定符,没有发现Privileges 限定符,说明使用该类不需要特权,枚举该类的方法,发现该类有一个create方法,继续查看该方法的限定符,没有Privileges 限定符,说明使用该方法不需要特权。代码如下:
Option Explicit

Dim WMILocator As New SWbemLocator
Dim WMIServices As SWbemServices
Dim WMIObject As SWbemObject

Private Sub CommandButton1_Click()
Set WMIServices = WMILocator.ConnectServer()
WMIServices.Security_.Privileges.Add wbemPrivilegeSystemtime, True
Set WMIObject = WMIServices.Get("Win32_share")
WMIObject.create "c:\vba", "我爱VBA", 0, 10, "sfsfsd"
End Sub
"c:\vba":要建立共享的文件夹的全路径。(要共享的文件夹必须存在,当然你也可以使用Win32_Directory类先建立该文件夹)
"我爱VBA":共享名
0:共享类型(0代表文件夹,当然还可以把磁盘共享)
10:允许的最大同时连接数
"sfsfsd":说明(可以省略)
如果你细心从头到尾阅读了本贴,你会有一个疑问,我怎么知道那个方法不需要参数。而那个方法又需要参数,参数是什么?很遗憾,那个高中没毕业的家伙没有提供枚举所有类的方法的参数的功能,所以我也没法告诉你。但是,所有WMI类的方法都可以在MSDN上找到用法和参数说明。
好像到这已经把WMI的使用说完了,但是,能不能实时监测系统是否发生了改变呢?例如,是否有人进行了打印,是否有人插入或拔出U盘,某个服务是否被启动或停止等等。答案是肯定的,这需要订阅WMI的事件,下次再说吧。
例子在一楼

TA的精华主题

TA的得分主题

发表于 2011-6-29 09:16 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-30 10:40 | 显示全部楼层
到此结束吧,关于使用WMI事件实时监测系统的部分不再写了,对VBA没什么用处。

TA的精华主题

TA的得分主题

发表于 2011-6-30 12:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-7-10 00:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主威武,学习了!

TA的精华主题

TA的得分主题

发表于 2011-7-11 12:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好文留印学习
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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