《WMI 脚本入门第三部分.pdf》由会员分享,可在线阅读,更多相关《WMI 脚本入门第三部分.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、14-6-12WMI 脚本入门:第三部分 脚本入门:第三部分10(共 11)对本文的评价是有帮助发布日期:9/9/2004|更新日期:9/9/2004Greg Stemp、Dean Tsaltas 和 Bob WellsMicrosoft CorporationEthan Wilansky网络设计小组摘要:定义 WMI 脚本库并展示如何使用它来访问和管理 WMI 托管资源。通览 7 个可以用 WMI 脚本库创建的基本脚本类型,它们用于如创建、删除、检索托管资源实例等任务。脚本编写的同仁们大家好!已经有好一段时间没见了。与其用借口让您厌烦 比如我们正在完成 Microsoft Windows 2
2、000 脚本指南(以后会有更多关于它的内容)不如让我们就此开始,好么?我们将从 WMI 脚本入门系列暂停的内容开始,将您的注意力转向 WMI 脚本之谜剩下的部分 WMI 脚本库。在深入本节内容之前,让我们简要地回顾一下到目前为止我们已经讨论过的内容。在 WMI 脚本入门:第一部分中,我们讨论了 WMI 的结构和主要组件,因为它们与 WMI 脚本相关。在 WMI 脚本入门:第二部分中,我们讨论了公共信息模型(Common Information Model,CIM),它是存放 WMI 托管资源蓝图(类定义)的知识库。虽然我们知道许多人都跳过了第二部分(基于“Rate this page”的点击量
3、),我们还是假定您已经了解了这部分内容。如果不知道,我想,您知道该到哪里去找到它。本页内容WMI 脚本库定义 解释 WMI 脚本库对象模型 Scripting Guys 的 WMI 脚本模板指南 检索托管资源实例 显示托管资源属性 修改托管资源的属性 调用托管资源方法 创建托管资源的一个新实例 删除托管资源实例 订阅事件 就到这里吧 WMI 脚本库定义那么,到底什么是 WMI 脚本库呢?让我们用一个比喻来回答这个问题。回想一下您计算机上的立体声系统或媒体播放器。所有立体声系统的共同点是什么?对,它们都有音量控制、高音和低音控制,对收音机来说就是调谐器,可能还有均衡器。无所谓您是否选择听贝多芬、
4、齐柏林飞船乐队、Art of Noise,或者无论是谁的音乐,控制器总是同样工作。WMI 脚本库就像(不是真正像,只是将就我们)您立体声系统上的控制器。就是说,WMI 脚本库提供了一套一致的控制器(以自动化对象的形式),它们允许您访问并管理 WMI 托管资源。无论您是正在管理计算机、事件日志、操作系统、进程、服务或选择您所喜爱的资源都无所谓,WMI 脚本库中的对象总是同样工作。WMI 脚本库中的自动化对象提供的一致性,通过您使用 WMI 脚本库可以执行的有限任务最佳地传达出来。总的来说,您可以使用 WMI 脚本库创建七个基本脚本类型。1.您可以检索 WMI 托管资源实例。2.您可以读取 WMI
5、 托管资源属性。3.您可以修改 WMI 托管资源属性。4.您可以调用 WMI 托管资源的方法。5.您可以创建 WMI 托管资源的新实例。14-6-12WMI 脚本入门:第三部分 WMI 托管资源的实例。7.您可以预定事件来监视 WMI 托管资源的创建、修改和/或删除。您可以将 7 个基本脚本类型当作脚本模板。就像音量控制器调节任何 CD、盒式磁带、8 轨磁带或.wma 文件的音量一样,WMI 脚本模板可以用于管理任何 WMI 托管资源。一旦对模板的了解充分到足以管理一类 WMI 托管资源之后,您就可以轻易地改写相同的模板来管理成百个其他的 WMI 托管资源了。WMI 脚本库对象模型既然我们已经
6、确定 WMI 脚本库是整个 WMI 基础结构的控制面板,那么就让我们打开它并一探究竟。在本系列第一部分的图1 中,为您展示了 WMI 脚本库的实现位置是在物理驻留在%SystemRoot%system32wbem 目录中的名为 wbemdisp.dll的单一自动化组件中。总的来说,WMI 脚本库是 24 个自动化对象(在 Windows 2000 及更早版本中为 19 个)组成,其中的 21 个在 图 1 所示的WMI 脚本库对象模型关系图中进行了说明。现在,在您认为必须了解所有 24 个对象的、多得可怕的详细信息,感觉要崩溃之前,让我们礼貌的指出,您不需要那样做。实际上,您会非常高兴知道,仅
7、需对图 1 中所展示的两到三个对象有基本理解,您就可以创建前面列出的 7 个脚本模板中的 6 个。那些对象是什么呢?稍安毋躁,您得停停,等我们说完。除了在 wbemdisp.dll 的 Windows XP 和 Windows Server 2003 版中的 24 个自动化对象外,脚本库还包含 13 个枚举。枚举只是一组相关常数的别名。我们不会在这里讨论这组常数,因为它们在 WMI SDK 中讲得非常清楚了。要了解更多关于WMI 脚本常数的信息,参阅 WMI SDK 中的脚本 API 常数。在许多方面,您可以将 WMI 脚本库中的自动化对象比做由 ADSI 提供的核心接口。我们这么说是什么意思
8、呢?是这样,ADSI核心接口(例如,IADs 和 IADsContainer)为 Active Directory 中的脚本对象提供了一个一致的方法 不论对象的类和属性。同样地,WMI 脚本库中的自动化对象为 WMI 托管资源提供了一个一致并且统一的脚本模型。理解 WMI 脚本库(wbemdisp.dll)中的自动化对象与驻留在 CIM 知识库(objects.data)中的托管资源类定义之间的关系很重要。正如我们在第二部分中解释的,托管资源类定义是通过 WMI 公开的计算机资源的蓝图。除了定义可以托管的资源之外,蓝图还为每个托管资源定义了唯一的方法和属性。另一方面,WMI 脚本库提供了通常意
9、义上的自动化对象脚本集,用于验证并连接到 WMI,以及随后访问 WMI 托管资源的实例。一旦使用 WMI 脚本库获得了 WMI 托管资源的实例后,您就可以访问由托管资源的类定义定义的方法和属性 就好像这些方法和属性就是脚本库自己的一部分一样。14-6-12WMI 脚本入门:第三部分 1.WMI 脚本库对象模型 wbemdisp.dll返回页首 解释 WMI 脚本库对象模型虽然图 1 初看上去不是很直观,但 WMI 脚本库对象模型对 WMI 脚本如何工作的机制提供了大量的深入探察。图 1 中的线指向通过调用原始对象的方法(或访问属性)获得的对象。例如,调用 SWbemLocator Connec
10、tServer 方法,返回一个SWbemServices 对象。调用 SWbemServices ExecNotificationQuery 方法,返回 SWbemEventSource 对象。另一方面,调用 SWbemServices ExecQuery 或 InstancesOf 方法,返回 SWbemObjectSet 集合。调用 SWbemServicesGet 方法,返回 SWbemObject。让我们将出现在本系列第一部分和第二部分的 WMI 脚本与对象模型比较一下,来看看它们是如何工作的。通常对于多数 WMI脚本而言,每个脚本执行三个基本步骤。1.每个脚本都由连接到在目标计算机上
11、的 WMI 服务开始。该脚本将 Microsoft Visual Basic Scripting Edition(VBScript)的 GetObject 函数与 WMI 连接字符串结合起使用,连接字符串是由 WMI 名字对象“winmgmts:”,后跟到目标计算机和命名空间的 WMI 对象路径组成。strComputer=.Set objSWbemServices=GetObject(winmgmts:&strComputer&rootcimv2)用这种方法连接到 WMI 返回一个对图 1 中所示的 SWbemServices 对象的引用。一旦获得了一个对SWbemServices 对象的引
12、用,您就可以调用 SwbemServices 的方法之一了。调用的 SWbemServices 方法主要取决于您创建的 WMI 脚本的类型。2.下一步,使用 SWbemServices InstancesOf 方法,每个脚本检索一个 WMI 托管资源实例。Set colSWbemObjectSet=objSWbemServices.InstancesOf(Win32_Service)14-6-12WMI 脚本入门:第三部分 总是 返回一个 SWbemObjectSet 集合。如图 1 中 SWbemServices 和 SWbemObjectSet 对象之间的连线所示,SWbemObjectS
13、et 是 SWbemServices 可以返回的三个 WMI 脚本库对象类型之一。3.最后,通过枚举 SWbemObjectSet 中的实例,每个脚本访问了一个 WMI 托管资源的属性。For Each objSWbemObject In colSWbemObjectSet WScript.Echo Name:&objSWbemObject.NameNext如图 1 所示,SWbemObjectSet 集合中的每个托管资源实例都由一个 SWbemObject 表示。在 WMI 脚本库中的 24 个自动化对象中,有三个最重要的 也就是说,您应该最先学习的对象 SWbemServices、SWbe
14、mObjectSet 和 SWbemObject。为什么?因为 SWbemServices、SWbemObjectSet 和SWbemObject 是几乎每个 WMI 脚本都必不可少的修补部分。实际上,如果我们重新回顾 ADSI 类比,SWbemServices、SWbemObjectSet 和 SWbemObject 是对应 WMI 脚本,IADs 和 IADsContainer 是对应 ADSI脚本。(Scripting Guys 免费放送:对于还未涉足 ADSI 脚本编写的人来说,这里有个技巧 那就是,在 ADSI 库提供的 6个接口中,IADs 和 IADsContainer 是您应该
15、首先学习的。相信我们。)SWbemServices 是一个对象,它表示到在本地或远程计算机上的 WMI 命名空间的一个已验证连接。另外,SWBemServices 在每个 WMI 脚本中都扮演重要的角色。例如,您使用 SWbemServices InstancesOf 方法来检索托管资源的所有实例。同样,您将 SWbemServices ExecQuery 方法与一个 WQL(WMI 查询语言)查询结合使用来检索托管资源的所有或一个子集的实例。此外,您使用 SWbemServices ExecNotificationQuery 方法来订阅表示托管环境中更改的事件。SWbemObjectSet
16、是一个零个或更多 SWbemObject 对象的集合。为什么是零?因为对一台计算机来说拥有 比如说,一个磁带驱动器(由 Win32_TapeDrive建模)的零个实例是有可能的。SWbemObjectSet 中的每个 SWbemObject 都可以表示两件事之一:1.WMI 托管资源的实例。2.类定义的实例。SWbemObject 是扮作您正在管理的资源的多身份对象。例如,如果您检索 Win32_Process 托管资源的实例,SWbemObject 呈现出模拟 Win32_Process 类定义的身份,如图 2 左侧所示。另一方面,如果您检索 Win32_Service托管资源的实例,SWb
17、emObject 呈现出模拟 Win32_Service 类的身份,如图 2 右侧所示。图 2.SWbemObject 扮作 Win32_Process 和 Win32_Service如果仔细研究图 2,您会注意到 SWbemObject 公开了两个截然不同的方法和属性集。带有以下划线结尾的名称的顶部集合是 SWbemObject 的一部分,它驻留在 wbemdisp.dll 中。下划线是用来防止它与托管资源类定义所定义的方法和属性的名称14-6-12WMI 脚本入门:第三部分 SWbemObject 的一部分。它们由 CIM 中的托管资源类定义进行定义。当您检索一个实例或托管资源的实例时,S
18、WbemObject 动态地绑定到由托管资源类定义进行定义的方法和属性。您使用 SWbemObject 来调用方法并访问在托管资源类定义中定义的属性,就好像方法和属性是 SWbemObject 的一部分。SWBemObject 变换为在 CIM 中定义的任何托管资源的能力是让 WMI 脚本如此直观的原因。一旦您知道了如何连接并检索实例,那么一切就都集中到SWbemObject。好吧。那么 WMI 脚本库对象模型还告诉您什么呢?这个对象模型告诉您,可以将 VBScript(或 WSH)的 GetObject 函数与 WMI 名字对象(winmgmts:)以及一个 WMI 对象路径(例如,“Com
19、puterNameNamespace:ClassName.KeyProperty=Value”)结合使用,以直接创建 SWbemServices 和 SWbemObject。另一方面,SWbemLocator、SWbemLastError、SWbemObjectPath、SWbemNamedValueSet、SWbemSink、SWbemDateTime 和 SWbemRefresher 对象是使用 VBScript(或 WSH)的 CreateObject 函数创建的。剩下的对象不能使用GetObject 或 CreateObject 来创建。相反,它们是通过调用一个方法或访问一个属性得到的
20、。对象模型也告诉您,WMI 脚本库中的 7 个对象公开了一个 SWbemSecurity 对象,就像紧挨着该对象下面或右侧的安全标注图标指示的一样。如需更多关于指定脚本库对象、方法或属性的信息,参阅 WMI SDK 文档 中的 WMI 的脚本 API。要了解 WMI 脚本库的基本机制,让我们将注意力转移到我们前面列出的 7 个 WMI 脚本模板。在我们继续之前,来一两段关于变量命名惯例的内容怎么样?关于变量命名惯例的三言两语在随后的示例脚本中,用来引用每个 WMI 自动化对象的变量名称都遵循一致的命名惯例。每个变量都根据在 WMI 脚本库中的自动化对象的名称来命名,以“obj”为前缀(为了说明
21、对象引用)或“col”(为了说明集合对象引用)。例如,一个引用SWbemServices 对象的变量命名为 objSWbemServices。一个引用 SWbemObject 的变量命名为 objSWbemObject。而一个引用 SWbemObjectSet 的变量命名为 colSWbemObjectSet。这为什么如此重要?当然,人们可以争论说它不重要。但是,这个想法是帮助您理解在 WMI 脚本中的不同点上您正在使用的WMI 对象的类型。如果它有帮助,那很好。如果没有,就忽略它好了。另一件略微重要需要紧记的事情是,对象引用变量名称可以是任何符合您喜好的名称。如果您更喜欢像“foo”和“ba
22、r”,或者“dog”和“cat”这样的变量名,那也可以。并没有要求规定您必须将一个对 SWbemServices 对象的引用命名为 objSWbemServices。这只是我们如何做而已。返回页首 Scripting Guys 的 WMI 脚本模板指南不可否认,WMI 有非常难于学习而且更难于使用的名声。在许多方面,与其说得到这个名声是因为 WMI 的确很难,还不如说只是因为它太大了。WMI 可以用于管理计算机硬件、计算机软件和几乎这二者范围内的任何事。有人会想当然地认为,任何包含了如此众多不同元素的技术一定是很难的。事实上,按照众多标准方法,可以用 WMI 执行很多任务。例如,您已经看到了一
23、个模板是如何作为脚本的基础的,这些脚本返回关于几乎任何托管资源的信息。在本系列的第一部分中,相同的基本脚本(有一两个较小的改动)被用于返回像安装的内存、服务和事件日志中的事件记录那样全异的项。下列主题提供了基本的 WMI 脚本模板,可以用于:检索托管资源实例。显示托管资源属性。修改托管资源属性。调用托管资源方法。创建托管资源的新实例。删除托管资源的实例。订阅事件以监控托管资源的创建、修改和/或删除。在我们开始之前,需要确保我们非常清楚的一个重要点是:您能(和不能)对托管资源做什么是由在通用信息模型(CommonInformation Model,CIM)储存库中的托管资源蓝图(即类定义)来决定
24、的,而不是 WMI 脚本库决定的。这就是为什么本系列的第二部分 稍显重要了(暗示,暗示)。还不相信么?我们会给您一些示例的。14-6-12WMI 脚本入门:第三部分 WbemTest.exe、WMI CIM Studio、WMIC.exe 或者一个脚本来检查该属性的“Write”限定符。(见图 7 或本系列第二部分中的清单 C 作为如何检查属性限定符例子。)如果“Write”限定符没有为属性定义,那么默认的值是“False”,它意味着该属性是只读的。再举一个例子:如果资源的类定义将 SupportsCreate 类的限定符设置为“True”,那么您只能创建托管资源的新实例。您如何确定一个托管资
25、源类定义将 SupportsCreate 设置为“True”?再次,如图 7 所示以及本系列第二部分的清单 C 中的所示,您检查该托管资源的类限定符。注 在事情情况中,您会发现一些托管资源可以被创建、更新和/或删除,即使该托管资源的类定义不能设置为适当的限定符。我们被告知这种情况正在被更正。在开始前还要说一件事。下列所有脚本模板都是设计用于本地计算机。这是通过将变量 strComputer 的值设置为一个点(.)来实现的。要在远程计算机上运行脚本,只要将 strComputer 的值设置为远程计算机的名称即可。例如,这行代码会让一个脚本在一台名为 atl-dc-01 的计算机上运行:strCo
26、mputer=atl-dc-01返回页首 检索托管资源实例到现在为止,我们一直使用 SWbemServices InstancesOf 方法来检索托管资源实例,如清单 1 中所示。清单 1.使用 SWbemServices InstancesOf 检索服务信息strComputer=.Set objSWbemServices=GetObject(winmgmts:&strComputer&rootcimv2)Set colSWbemObjectSet=objSWbemServices.InstancesOf(Win32_Service)For Each objSWbemObject In co
27、lSWbemObjectSet WScript.Echo Display Name:&objSWbemObject.DisplayName&vbCrLf&_ State:&objSWbemObject.State&vbCrLf&_ Start Mode:&objSWbemObject.StartMode&vbCrLfNext虽然 InstancesOf 的确获得了成功,但是您只想要实例或属性的一个子集的情形又怎么样呢?假设您想要优化实例和属性恢复到最小的网络流量。在这种情况下,您会非常高兴听到 WMI 支持大量强大的查询工具。查询 WMI 是向匹配一些预定义条件的托管资源发出请求的过程。例如,
28、WMI 查询只能请求那些处于 Stopped(停止)状态的带有 StartMode of Auto(自动的启动模式)的服务。WMI 查询为检索托管资源实例及其属性提供了比 InstancesOf 方法更有效率的机制。WMI 查询只返回那些匹配查询的实例和属性,但是 InstancesOf 总是返回一个指定资源的所有实例以及每个实例的所有属性。同样,查询是在与对象路径中一致的目标计算机上进行的,而不是在运行脚本的源计算机上。因此,WMI 查询可以显著地减少像 InstancesOf 那样更低效率的数据检索机制造成的网络流量。要查询 WMI,使用 WMI 查询语言(WQL)构造一个查询字符串。查询
29、字符串定义了必须被满足的条件来获得成功匹配的结果。在查询字符串定义后,查询使用 SWbemServices ExecQuery 方法提交到 WMI 服务。满足查询的托管资源实例以SWbemObjectSet 集合的形式返回到脚本中。使用 WQL 和 ExecQuery 方法(而不是 InstancesOf)为创建只返回您感兴趣的项的脚本提供了灵活性。例如,您可以使用基本的 WQL 查询来返回一个给定托管资源的所有实例的所有属性,如清单 2 所示。这与 InstancesOf 方法返回的信息是一样的。如果比较清单 1 和 2,您会注意到第 3 行的粗体部分是两个脚本间唯一的差别。清单 2.使用
30、SWbemServices ExecQuery 检索服务信息strComputer=.Set objSWbemServices=GetObject(winmgmts:&strComputer&rootcimv2)Set colSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROM Win32_Service)For Each objSWbemObject In colSWbemObjectSet WScript.Echo Display Name:&objSWbemObject.DisplayName&vbCrLf&_ State:&objS
31、WbemObject.State&vbCrLf&_ Start Mode:&objSWbemObject.StartMode&vbCrLfNext您也可以使用 WQL 来创建有目标的查询,即做下列事情的查询:14-6-12WMI 脚本入门:第三部分 DisplayName,State,StartMode FROM Win32_Service返回一个类的选定的实例的所有属性。SELECT*FROM Win32_Service WHERE State=Stopped返回一个类的选定实例的选定属性。SELECT DisplayName,State,StartMode FROM Win32_Servi
32、ce WHERE State=Stopped创建有目标的查询有时会显著地提高数据返回的速度。(例如,只返回那些在应用程序事件日志中含有 EventCode 0 的事件要比返回所有事件日志中的所有事件快的多。)有目标的查询也让对返回的数据的工作变得更轻松。例如,假设您只想要应用程序事件日志中带有 EventCode 0 的事件,使用有目标的查询将只返回那些项目。相反,InstancesOf 将返回所有事件,而且您将不得不单独地检查每个事件并确定它是否:1.来自应用程序事件日志并且,2.带有 EventCode 0。虽然这可以完成,但是这太低效了而且对您来说需要额外的工作。有目标的查询还可以减少返
33、回的数据的数量,对在网络上运行的脚本来说这是个重要的考虑。表 1 展示了一些不同查询类型的相关数字。如您所见,通过各种查询类型返回的数据的数量是有相当大的差别的。表 1.比较不同的 WMI 实例检索方法和查询方法/WQL 查询返回的字节objSWbemServices.InstancesOf(Win32_Service)157,398objSWbemServices.ExecQuery(SELECT*FROM Win32_Service)156,222objSWbemServices.ExecQuery(SELECT Name FROM Win32_Service)86,294objSWbem
34、Services.ExecQuery(SELECT StartMode FROM Win32_Service)88,116objSWbemServices.ExecQuery(SELECT StartMode FROM Win32_Service WHERE State=Running)52,546objSWbemServices.ExecQuery(SELECT StartMode,State FROM Win32_Service WHEREState=Running)56,314objSWbemServices.ExecQuery(SELECT*FROM Win32_Service WHE
35、RE Name=WinMgmt)27,852objSWbemServices.Get(Win32_Service.Name=WinMgmt)14,860此时,我们希望我们已经说服了您,关于 ExecQuery 要比 InstancesOf 更好的问题。现在让我们从清单 2 转到一个通用的WMI 脚本模板,它可以轻易地被修改以检索任何 WMI 托管资源的实例。清单 3 包含我们第一个模板。清单 3.用于检索托管资源实例的模板strComputer=.strNamespace=rootcimv2strClass=Win32_ServiceSet objSWbemServices=GetObject
36、(winmgmts:&strComputer&strNamespace)Set colSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROM&strClass)For Each objSWbemObject In colSWbemObjectSet WScript.Echo Display Name:&objSWbemObject.DisplayName WScript.Echo State:&objSWbemObject.State WScript.Echo Start Mode:&objSWbemObject.StartMode14-6-
37、12WMI 脚本入门:第三部分 WMI 类使用这个模板:1.将 strClass 的值设置为目标托管资源的相应的 WMI 类。2.如必要,将 strNamespace 的值设置为目标类的 WMI 命名空间。3.替换显示属性及其值的 For Each 循环中的语句。删除下列行,并用在显示的属性值的相应的代码行替换它们。WScript.Echo Display Name:&objSWbemObject.DisplayNameWScript.Echo State:&objSWbemObject.StateWScript.Echo Start Mode:&objSWbemObject.StartMod
38、eScripting Guys 免费放送 如果您正在使用一个返回许多实例的托管资源(为了讨论的目的,我们将“许多”定义为超过 1000),您可以通过使用可选标记优化 ExecQuery 的行为。例如,假设您使用 ExecQuery 来查询事件日志记录(由 Win32_NTLogEvent 类建模)。如您已知的,事件日志会包含成千上万条记录。默认情况下,您可能会遇到与返回大量结果集相关的性能问题,比如事件日志查询。必须用这种方法来实现的原因是,WMI 为每个实例缓存了一个SWbemObject 引用,或者在我们的例子中,是为每个事件日志记录。为了避免这个问题,您可以让 ExecQuery 来返回
39、一个只进 SWbemObjectSet,如下所示。strComputer=.strNamespace=rootcimv2strClass=Win32_NTLogEventConst wbemFlagReturnImmediately=&h10Const wbemFlagForwardOnly=&h20Set objSWbemServices=GetObject(winmgmts:&strComputer&strNamespace)Set colSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROM&strClass,_ WQL _ wbemF
40、lagReturnImmediately+wbemFlagForwardOnly)Insert remainder of script here(e.g.,For Each Next loop).注 wbemFlagReturnImmediately 标记(它是在我们前面简要说明的枚举之一中定义的)是默认的 ExecQuery 行为并且是半同步的。重要的优化是添加 wbemFlagForwardOnly 标记。将 wbemFlagReturnImmediately 与wbemFlagForwardOnly 结合将获得一个只进的枚举数。只进的枚举数要比默认的枚举数执行快很多,因为 WMI 不维护
41、对在 SWbemObjectSet 中对象的引用。返回页首 显示托管资源属性清单 3 中所示脚本的一个限制是,它需要您事先知道您想要检索和显示的所有属性的名称。如果您想要显示一个资源的所有属性的值,但是您既不知道这些属性的名称,也不想键入需要显示每个属性值的 40 或 50 行代码,这又怎么办呢?在这种情况下,您可以使用清单 4 中的模板,它自动检索并显示一个类中发现的每个属性的值。清单 4.Scriptomatic lite 模板strComputer=.strNamespace=rootcimv2strClass=Win32_ProcessSet objSWbemServices=GetO
42、bject(winmgmts:&strComputer&strNamespace)Set colSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROM&strClass)Wscript.Echo Scriptomatic Lite-Class:&strClassWscript.Echo=&String(Len(strClass),=)&vbCrLfintInstance=1For Each objSWbemObject In colSWbemObjectSet14-6-12WMI 脚本入门:第三部分 WScript.Echo Instance
43、:&intInstance&vbCrLf&-For Each objSWbemProperty In objSWbemObject.Properties_ strPropertyValue=ConvertPropertyValueToString(objSWbemProperty.Value)WScript.Echo objSWbemProperty.Name&:&strPropertyValue Next WScript.Echo intInstance=intInstance+1Function ConvertPropertyValueToString(ByVal PropertyValu
44、e)If IsObject(PropertyValue)Then ConvertPropertyValueToString=ElseIf IsNull(PropertyValue)Then ConvertPropertyValueToString=ElseIf IsArray(PropertyValue)Then ConvertPropertyValueToString=Join(PropertyValue,)Else ConvertPropertyValueToString=CStr(PropertyValue)End IfEnd Function要用其他 WMI 类使用这个模板:1.将 s
45、trClass 的值设置为针对目标托管资源的适当的 WMI 类。2.如必要,将 strNamespace 的值设置为针对目标类的 WMI 命名空间。返回页首 修改托管资源的属性在 Windows 2000 中,WMI 是主要的只读技术。在 Windows 2000 rootcimv2 命名空间中定义的 4,395 个属性中,只有39 个属性是可写的。这些数字在 Microsoft WindowsXP 中又增加了,在大约 6560 个属性中有 145 个是可写的。这个数字在 Windows Server 2003 中甚至更大了。清单 5 中的模板演示了如何修改一个可写的属性。这个脚本检索由 Wi
46、n32_OSRecoveryConfiguration 类模拟的托管资源的所有实例。(在这种情况下,这个类只包含单个实例。)这个脚本为三个属性(DebugInfoType、DebugFilePath 和OverWriteExistingDebugFile)提供了新的值并使用 SWbemObject Put_ 方法提交了改变(因此配置操作系统恢复选项)。如果您忘记调用 Put_ 方法,这些更改将不会被应用。注 此模板只对可写的属性起作用。试图更改只读的属性将导致错误。要确定一个属性是否为可写的,检查此属性的“Write”限定符。清单 5.用于修改托管资源的可写属性的模板strComputer=.
47、strNamespace=rootcimv2strClass=Win32_OSRecoveryConfigurationSet objSWbemServices=GetObject(winmgmts:&strComputer&strNamespace)Set colSWbemObjectSet=objSWbemServices.ExecQuery(SELECT*FROM&strClass)For Each objSWbemObject In colSWbemObjectSet objSWbemObject.DebugInfoType=1 objSWbemObject.DebugFilePath
48、=c:tmpmemory.dmp objSWbemObject.OverWriteExistingDebugFile=False objSWbemObject.Put_Next请注意,在 For Each 循环中 SWbemObject 是如何用以:(1)直接访问与修改由 Win32_OSRecoveryConfiguration类定义的属性;(2)调用其本身的 Put_ 方法来提交所作更改。要用其他实现可写属性的 WMI 类使用此模板:14-6-12WMI 脚本入门:第三部分 strClass 的值设定为目标托管资源的相应 WMI 类。2.如必要,将 strNamespace 的值设定为目标
49、类的 WMI 命名空间。3.替换配置新属性值的 For Each 循环中的语句。删除下列行,并用正在被修改的属性的相应的代码行替换它们:objSWbemObject.DebugInfoType=1objSWbemObject.DebugFilePath=c:tmpmemory.dmpobjSWbemObject.OverWriteExistingDebugFile=False返回页首 调用托管资源方法在托管资源的类定义中定义的方法允许您在托管资源上执行操作。例如,Win32_Service 类包含让您执行诸如启动与停止服务的方法;Win32_NTEventlogFile 包含备份和清除事件日志
50、的方法;Win32_OperatingSystem 包含重新启动或关闭计算机的方法。清单 6 提供了一个模板,能够用来编写调用 WMI 托管资源方法的脚本。这个特定的脚本使用 Win32_Service 类的StopService 方法来停止本地计算机上的“警报器”服务。注 在调用在托管资源的类定义中定义的方法之前,该方法必须实现。如何确定一个方法是否实现?检查此方法的实现限定符。TRUE 值表明一个方法有由提供程序提供的实现。已经说过,应注意有些方法不定义实现限定符,即使方法已经实现。下面显示的 Win32_Service StopService 方法就是这样一个例子。确定一个方法是否被实现