WMI 脚本入门 第二部分.pdf
《WMI 脚本入门 第二部分.pdf》由会员分享,可在线阅读,更多相关《WMI 脚本入门 第二部分.pdf(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、14-6-15WMI 脚本入门:第二部分 脚本入门:第二部分发布日期:09/06/2004|更新日期:09/06/2004Greg Stemp、Dean Tsaltas、Bob Wells、Microsoft Corporation、My.Settings、My.User 和 My.WebServicesEthan Wilansky网络设计小组摘要:Scripting Guys 继续他们对编写 WMI 脚本的讨论,这次集中在 CIM 储存库和 CIM 类以帮助您巧用 WMI 脚本的全部强大功能。如果要建造一所房子,您需要知道如何阅读和解释建筑图。如果要制造一个电子器具,您需要知道如何阅读和解释
2、示意图。那么如果要编写一个 WMI 脚本,您猜到了,需要知道如何解释 WMI 对于管理的蓝图 CIM 储存库。CIM 储存库,在 WMISDK 中也称为 WMI 储存库,是存储建模 WMI 托管资源的类定义的 WMI 架构。为了强调 CIM 和 CIM 类的重要性,仔细考虑在 WMI 脚本入门:第一部分中展示的 4 个脚本,以及下面的清单 1 和清单 2。清单 1 是来自第一部分的服务脚本的一个略有增强的版本,而清单2 是使用 Win32_OperatingSystem 类的相同脚本的另一个变体。注 如果您对清单 1 和 2 有疑惑,我们建议您阅读(或视具体情况重读)本系列内容的第一部分。清单
3、 1:使用 WMI 和 VBScript 检索服务信息strComputer=.Dot(.)equals local computer in WMISet objWMIService=GetObject(winmgmts:&strComputer)Set colServices=objWMIService.InstancesOf(Win32_Service)For Each objService In colServices WScript.Echo Name:&objService.Name&vbCrLf&_ Display Name:&objService.DisplayName&vbCr
4、Lf&_ Description:&objService.Description&vbCrLf&_ Path Name:&objService.PathName&vbCrLf&_ Start Mode:&objService.StartMode&vbCrLf&_ State:&objService.State&vbCrLfNext清单 2:使用 WMI 和 VBScript 检索操作系统信息strComputer=.Set objWMIService=GetObject(winmgmts:&strComputer)Set colOperatingSystems=objWMIService.In
5、stancesOf(Win32_OperatingSystem)For Each objOperatingSystem In colOperatingSystems Wscript.Echo Name:&objOperatingSystem.Name&vbCrLf&_ Caption:&objOperatingSystem.Caption&vbCrLf&_ CurrentTimeZone:&objOperatingSystem.CurrentTimeZone&vbCrLf&_ LastBootUpTime:&objOperatingSystem.LastBootUpTime&vbCrLf&_
6、LocalDateTime:&objOperatingSystem.LocalDateTime&vbCrLf&_ Locale:&objOperatingSystem.Locale&vbCrLf&_ Manufacturer:&objOperatingSystem.Manufacturer&vbCrLf&_ OSType:&objOperatingSystem.OSType&vbCrLf&_ Version:&objOperatingSystem.Version&vbCrLf&_ Service Pack:&objOperatingSystem.ServicePackMajorVersion&
7、_ .&objOperatingSystem.ServicePackMinorVersion&vbCrLf&_ Windows Directory:&objOperatingSystem.WindowsDirectoryNext在本系列文章第一部分中的每个脚本以及本文的清单 1 和 2 中,唯一有区别的特征是标识 WMI 托管资源的类名和每个类属性14-6-15WMI 脚本入门:第二部分 CIM 类在WMI 脚本中扮演的重要角色。一旦知道如何编写一个脚本来管理一类 WMI 托管资源,您就可以对其他托管资源使用相同的基本技术。当然,知道一个托管资源的类名以及该类的相应属性只是本文的一部分。在您能
8、够巧用 WMI 脚本的全部强大功能之前,您需要对 CIM 储存库和 CIM 类的结构了解得再多一些。为什么呢?我们将给出两个重要的理由。1.了解如何浏览 CIM 将帮助您确定通过 WMI 公开的计算机和软件资源。2.了解如何解释托管资源的蓝图(类定义),将帮助您理解可以在托管资源上执行的任务。无论使用什么 WMI 工具,这两点都成立,无论使用 WMI 脚本库、WMI 命令行工具(wmic.exe),或者企业管理应用程序,您都需要知道如何浏览 CIM 并解释 CIM 类。一个不那么明显但是同样重要的学习 CIM 的原因是,CIM 是 WMI 托管资源的极好的文档资源。没错,如果需要关于 WMI类
9、的详细信息,可以使用 WMI SDK。但是,如果不 需要关于 WMI 类的详细信息呢?假设您只想知道正在运行的 MicrosoftWindows 版本是否支持一个指定的类、方法或属性。那么,看看目标计算机的 CIM 吧。例如,我们经常被问及“为什么 TechNet 的脚本中心里的加入计算机到域脚本在 Windows 2000 中不能用?”回答是,因为在 Windows 2000 中的 Win32_ComputerSystem 类(它是在脚本中使用的 WMI 类)不支持JoinDomainOrWorkGroup 方法。在内置于 Windows XP 和 Windows Server 2003 的
10、 WMI 版本中,JoinDomainOrWorkGroup 方法被添加到 Win32_ComputerSystem 类中。那么如何了解或学习它呢?一种方法是使用我们在第一部分中列出的 WMI 工具集合。另一种更强大、灵活的方法是使用 WMI脚本库。关于 WMI,真正酷的事情之一是,您可以使用 WMI 脚本库来学习 WMI。没错,用编写 WMI 脚本来检索 WMI 托管资源相同的方法,您也可以编写 WMI 脚本来学习关于 WMI 本身的各种有趣的详细信息。您可以编写 WMI 脚本来列出CIM 储存库中所有的命名空间和类。您可以编写脚本来列出一台启用 WMI 的计算机上安装的所有提供程序。您甚至
11、可以编写WMI 脚本来检索托管资源类定义。无论选择使用现有的工具或者创建自己的工具,您都需要对 CIM 储存库的结构有一个基本的了解。所以,让我们从第一部分停止的地方开始,仔细了解一下 WMI 的管理蓝图 CIM 储存库。在整个讨论中,我们将使用 WMI 脚本库为您说明如何检索WMI 配置信息和托管资源类定义。管理蓝图在第一部分中,我们说到 WMI 的基本思路是 来自不同来源的配置和管理信息能够用一种架构统一地表示,而 CIM 储存库就是针对 WMI 的架构。可以将架构想象为蓝图或者代表现实世界中存在的某事物的模型。就好像建筑图构建物理结构的模型(例如,房子),WMI CIM 构建构成计算机的
12、硬件、操作系统和软件的模型。CIM 是 WMI 的数据模型。注 虽然 CIM 储存库能够存储一些数据(而且它确实存储了),但是它的主要目的是构建管理环境的模型。CIM 不是为存储它所定义的大量管理信息而设计的。相反,大部分数据是根据需要动态地从 WMI 提供程序检索的。一个例外是 WMI 操作数据。WMI 操作数据(例如,命名空间信息、提供程序注册信息、托管资源类定义和永久事件订阅)存储于 CIM 储存库中。图 1 提供了一个 CIM 储存库的内部结构和组织的概念化视图。如图 1 所示,CIM 使用类来创建数据模型。不可否认,CIM 包含的类远超过关系图中展示的 11 个 上次我们在 Wind
13、ows Server 2003 上统计大约有 5000 个。要了解的重要内容是,CIM 储存库是定义 WMI 托管环境和每个通过 WMI 公开的可托管资源的类存储。图 1 中展示三个重要的 CIM 概念,您需要了解它们以成功地浏览并解释 WMI 架构。1.CIM 储存库被划分为多个命名空间。2.每个命名空间包含下面一个或多个类的组:系统类、核心和公共类和/或扩展类。3.有三种主要的类类型:抽象、静态和动态。抽象类 是用于派生(定义)新的抽象和非抽象类的模板,不能用于检索托管资源的实例。静态类 定义物理存储在 CIM 储存库中的数据 最常见的是 WMI 配置和操作数据。动态类 是为从提供程序中动
14、态检索的 WMI 托管资源建模的类。称作关联类的第四种类类型,也是受支持的。关联类 是一个抽象、静态或动态的类,描述两个类或托管资源之间的关系。暂时别太担心关于 CIM 类类型问题,我们很快就会在一个更实际的环境中讨论 CIM 类类型。让我们更详细地看看每一个 CIM 概念。14-6-15WMI 脚本入门:第二部分 1:CIM 储存库的结构化视图 WMI 架构注 CIM 物理驻留在 Windows XP 和 Windows Server 2003 中名为%SystemRoot%system32wbemRepositoryFSobjects.data 的文件内。Windows 2000 和 Wi
15、ndows NT 4.0 ServicePack 4 将 CIM 存储在%SystemRoot%system32wbemRepositorycim.rep 中。而在 Windows Millennium Edition(Me)、Windows 98 和 Windows 95 OSR 2.5 操作系统中,CIM 存储在%windir%systemwbemRepositorycim.rep 中。命名空间定义CIM 类被组织到命名空间中。命名空间是 CIM 使用的分区机制,控制托管资源类定义的范围和可见性。CIM 中的每个命名空间包含一个表现特定技术或管理区域的相关类的逻辑组。命名空间中的所有类必须
16、有一个唯一的类名,一个命名空间中的类不能从另一个命名空间中的类派生,这就是为什么您将发现在多个命名空间中定义的相同的系统、核心以及公共类。多数为 Windows 托管资源建模的类驻留在 root/cimv2 命名空间中。不过,按照图 1 中的建议,rootcimv2 不是您唯一需要注意的命名空间。例如,事件日志、性能计数器、Windows 安装程序和 Win32 提供程序都将它们的托管资源类定义存储在rootcimv2 命名空间中。另一方面,注册表提供程序将其类定义存储在 rootDEFAULT 命名空间中。另外,新的 WindowsServer 2003 DNS 提供程序将其托管资源类定义存
17、储在 rootMicrosoftDNS 命名空间中。命名空间使用那么,命名空间如何影响您的 WMI 脚本呢?每个 WMI 脚本都作为初始化连接步骤(上个月我们简要地讨论过)的一部分连接到一个命名空间,如下所示:strComputer=.Set wbemServices=GetObject(winmgmts:&strComputer)如上,如果没有指定目标命名空间,则脚本连接到由下列注册表设置识别的命名空间:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWBEMScriptingDefault 命名空间默认的命名空间设置是 WMI 脚本,%PATH%环境变量的默认设置是操
18、作系统。当您通过命令提示提交了一个命令而没有指定命令的完全限定路径时,操作系统使用%PATH%环境变量来定位该命令的可执行文件。如果操作系统不能找到这个文件,就会产生错误。14-6-15WMI 脚本入门:第二部分 WMI 脚本中检索一个托管资源时,如果没有指定命名空间,CIMOM(WMI 服务)就在默认的命名空间寻找该托管资源的蓝图(类定义)。如果 CIMOM 在默认的命名空间中找不到托管资源类定义,就会产生一个WBEM_E_INVALID_CLASS(0 x80041010)错误。注 不要将默认的命名空间设置与 rootDEFAULT 命名空间相混淆。它们是不相关的,除非您将 rootDEF
19、AULT 设置为您的默认命名空间。命名空间 rootcimv2 被初始配置为脚本默认的命名空间;但是,默认的脚本命名空间可以很容易地进行更改。因此,您应该始终 在您的 WMI 脚本中标识一个托管资源的命名空间,而不是采用默认设置。如果上个月就遵照了我们自己的建议,所有 4个清单(以及本文的清单 1 和 2)中的连接步骤就应该编写如下:strComputer=.Set wbemServices=GetObject(winmgmts:&strComputer&rootcimv2)将目标命名空间添加到连接字符串会告诉 CIMOM 在 CIM 中到哪里去寻找托管资源类定义,很像完全限定路径告诉操作系统
20、到底去哪里寻找一个文件。当您指定了目标命名空间,默认的命名空间就不使用了。管理脚本的默认命名空间您可以像清单 3 和清单 4中展示的那样,将 WMI 脚本库与 Win32_WMISetting 类结合使用来读取和更改脚本的默认命名空间。Win32_WMISetting 是一个为 WMI 服务的操作参数建模的动态类。可写的属性表示脚本的默认命名空间是ASPScriptDefaultNamespace。清单 3 使用了相同的 3 个 WMI 脚本编写步骤 连接、检索和显示 我们一直在使用的步骤,不过有一个明显的改变。正如前面建议的,我们在传递到 Microsoft Visual Basic Scr
21、ipting Edition(VBScript)的 GetObject 函数的 WMI 连接字符串中,指定 Win32_WMISetting 类的完全限定命名空间。那么,这里您会认为 Microsoft 没有遵循他们自己的建议。我们不但在清单 3 中遵循我们命名空间的建议,而且从此以后我们将限定命名空间。是的,如果想在您的 WMI 脚本中避免无效的类错误,它就是那么的重要。清单 3:为使用 WMI 和 VBScript,检索脚本的默认命名空间strComputer=.Set objWMIService=GetObject(winmgmts:&strComputer&rootcimv2)Set
22、colWMISettings=objWMIService.InstancesOf(Win32_WMISetting)For Each objWMISetting in colWMISettings Wscript.Echo Default namespace for scripting:&_ objWMISetting.ASPScriptDefaultNamespace Next要运行清单 3 中的示例脚本,将这段脚本复制并粘贴到您最喜欢的文本编辑器中,保存脚本(扩展名为.vbs),然后如图 2 所示运行脚本。您应该看到本地计算机的默认命名空间回显到控制台中。图 2:GetDefaultNam
23、espace.vbs 输出要设置脚本的默认命名空间,执行与清单 3 中的相同脚本编写步骤,但要做一个重要的更改 好吧,如果您在数脚本行数的话就算两个。您应该使用 SWbemObject 来设置后面跟有调用 SWbemObject 的 Put_ 方法的属性来将更改提交到 WMI 托管资源,而不要使用 WMI 脚本库的 SWbemObject 从 WMI 托管资源的实例中读取属性。设置和提交操作在清单 4 中的For Each 循环内执行,因为 SWbemServices InstancesOf 方法总是返回一个 SWbemObjectSet 集合,即便是只有一个目标 WMI 托管资源实例,如 W
24、in32_WMISetting。清单 4:用 WMI 和 VBScript 设置脚本的默认命名空间14-6-15WMI 脚本入门:第二部分 objWMIService=GetObject(winmgmts:&strComputer&rootcimv2)Set colWMISettings=objWMIService.InstancesOf(Win32_WMISetting)For Each objWMISetting in colWMISettings objWMISetting.ASPScriptDefaultNamespace=rootcimv2 objWMISetting.Put_Nex
25、t不要太专注于 WMI 脚本库的结构,因为我们将在本系列的第三部分中详细说明 WMI 脚本库。现在,让我们把注意力转回到CIM。列出命名空间到目前为止,我们已经用相同的 WMI 脚本技术来检索动态的 WMI 托管资源的实例。例如,在第一部分中,我们使用相同的脚本模板来检索物理内存、服务、事件日志记录和进程。在第二部分中,我们检索服务、操作系统信息和脚本的默认命名空间。这表明,您可以使用相同的 WMI 脚本技术来从 CIM 中检索命名空间信息。象在托管资源脚本中的情况一样,您需要对脚本做的唯一更改就是目标类名。命名空间信息作为 _NAMESPACE 类的一个静态实例存储在 CIM 中。_NAME
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WMI 脚本入门 第二部分 脚本 入门 第二 部分
限制150内