日期:2014-05-17  浏览次数:20672 次

使用脚本程序管理Windows网络(3)

使用脚本程序管理Windows网络(3)
2010年11月19日
  使用脚本程序管理Windows网络 第三部分:理解WMI
  了解Windows Management Instrumentation(WMI)是如何工作,以及如何使用VBScript脚本,本文最初发表于windowsnetworking.com。
  在本系列专题的前两篇文章中,我们了解到如何使用VBScript修改一个Windows计算机的一个网络适配器的IP地址。其中,我们还学到了很多关于Windows脚本编写的基本概念,如类、对象、属性、方法和不同类型的变量,包括字符串变量、整数变量、数组和集合。我们还了解到一些关于写好脚本的基本方法,如定义变量、实现错误处理、接受用户设置、显示验证输出,以及通过注释来文档化脚本。
  我们的最终脚本已经按要求工作了,但可能仍有一些方面你觉得难以理解。比如,让我们看一下下面这一行:
  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
  在我的第一篇文章,对于这一行我作了以下评论:“通过定义一个objWMIService对象并将它赋值为GetObject方法返回的句柄,就可以连接到本地计算机的root\cimv2命名空间了”。
  这究竟意味着什么呢?到底什么是WMI,它究竟是如何工作的呢?而且为什么它对于想要了解如何编写脚本来管理Windows电脑的你来说是如此重要的呢?
  理解WMI
  大约在Window98出现或是更早以前,WMI就已经出现,只是这那之前它有一个不大相同的名称:基于Web的企业管理(WBEM) 。 WBEM是由Microsoft,Cisco,Intel,Compaq和BMC Software共同开发的技术,目的是为是更容易管理企业环境中的桌面系统和服务器系统。WMI提供了一个模型以表示、存储和查询Windows计算机的配置和状态信息以及其他运行状况。开发人员可以使用WMI写脚本或托管的代码去查看和修改设置在Windows电脑上的配置,以此查看Windows的应用和服务的状态,同时还做了很多其他有助于管理员进行Windows网络部署、维护和故障排除的其他的功能。
  换句话说, WMI表示:
  ●Windows――只工作在安装了Microsoft Windows的计算机上工作;
  ●管理――可以用来管理这些电脑;
  ●检测工具――提供查看和修改这些计算机上配置的工具。
  有一个很好的比喻是把Windows电脑比一个汽车,而WMI则作为你车上的控制台的电子(仪表),以显示上你车子的速度、引擎温度、RPMS 等等。这些仪表板的控制并不是它们自身完成的――你仍然要想出办法通过获取这些电子信息并且以一个可读的形式显示出来。使用WMI写VBScripts就是如同创造仪表板显示元件一样,整合到汽车的仪表盘中,以告诉你所想知道的信息并控制你的引擎。换句话说,Windows安装了通过WMI构建的所有这些工具――你只需要弄清楚如何使用它就可以通过它做一些有用的事情,比如改变你机器的IP地址、查看当前的时区、重启远程机器、显示已安装的修复程序列表等等。
  WMI命名空间
  我们要了解关于MWI的所有事,现在还不够。实际上,要找出WMI是否可以做一些特别的事情是需要一点耐心和领会能力的。让我们首先考虑WMI命名空间。在WMI术语,一个名字空间是类和类的实例的一种逻辑数据库。下面是一个简单的shownamespaces.vbs脚本,它列举了在根命名空间下的所有WMI命名空间:
  Set objWMIService = GetObject("winmgmts:\\.\root")
  Set colNamespaces = objWMIService.InstancesOf("__NAMESPACE")
  For Each objNamespace In colNamespaces
  WScript.Echo objNamespace.Name
  Next
  下面是在WindowsXP 机器上运行这个脚本的结果:
  C:\scripts>cscript ShowNamespaces.vbs
  Microsoft (R) Windows Script Host Version 5.6
  Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
  SECURITY
  RSOP
  Cli
  SecurityCenter
  WMI
  CIMV2
  Policy
  Microsoft
  DEFAULT
  directory
  subscription
  每个这样的命名空间都是一个可能的来源,你可以查询关于Window计算机某个状态或配置的资料(而且也可以经常修改配置)。这些命名空间是像硬盘驱动器上的文件夹分层次地组织的。例如,我们可以通过下面的方式修改我们脚本的第一行来显示在root\CIMN2命名空间下的所有的命名空间:
  Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
  当你运行修改后脚本时,输出结果是这样的:
  C:\scripts>cscript ShowNamespaces.vbs
  Microsoft (R) Windows Script Host Version 5.6
  Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
  ms_409
  Applications
  事实上,root\ CIMV2是Windows机器上默认的WMI命名空间。这意味着,如果你在脚本的第一行里不指定连接的命名空间,那么WMI默认就会自动连接到root\ CIMV2命名空间。因此,如果我们将第一行改为:Set objWMIService = GetObject("winmgmts:\\") ... 我们会得到与上面相同的结果。请注意,我们去掉了winmgmts:\\.\\root\CIMV2句号后面的内容。如果你还记得在我们的第一篇文章,这个句号表示本地计算机,同时默认地WMI假设你想要在本地计算机上工作,这意味着你可以去掉句号后面的部分。而编写脚本最好的做法是在脚本中使用变量(来定义它们),以下是一个更广泛使用的可以用来显示WMI命名空间脚本:
  Option Explicit
  On Error Resume Next
  Dim strComputer
  Dim strWMINamespace
  Dim objWMIService
  Dim colNamespaces
  Dim objNamespace
  strComputer = "."
  strWMINamespace = "\root\CIMV2"
  Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
  Set colNamespaces = objWMIService.InstancesOf("__NAMESPACE")
  For Each objNamespace In colNamespaces
  WScript.Echo objNamespace.Name
  Next
  为什么要把它变得这么复杂呢?主要的原因是增加灵活性!举例来说,如果我们需要运行在远程计算机上运行这个脚本,我们可以改变strComputer为远程计算机的IP地址值。或者如果我们需要显示命名空间的不同部分,我们可以添加几行到我们的脚本中以接受用户对strWMINamespace变量的输入。
  WMI提供者
  找到合适的命名空间只是第一个挑战(虽然大部分的情况下连接到默认的命名空间就已经足够了)。你还必须访问正确的提供者,以便取回或更新你的目标系统的数据。下面是一个ShowProviders.vbs脚本,可以显示root\CIMV2命名空间的所有WMI提供者:
  Option Explicit
  On Error Resume Next <