第 1 课:简单的 WMI 任务

如何运行命令行管理脚本

要点 要点 您必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能运行脚本和可执行文件。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行脚本和可执行文件。在命令提示符下,键入 runas /user:administrative_accountname "script or executable command"

编写命令行管理脚本

  1. 从“开始”菜单,单击“运行”。
  2. 在“打开”框中,键入 Notepad
  3. 单击“确定”。
  4. 通过执行下列操作之一创建测试行:
    • 对于 VBScript,请键入:WScript.Echo "This is a test"
    • 对于 JScript,请键入 WScript.Echo("This is a test");
  5. 注意 注意 由于 JScript 区分大小写,因此请确保在同一文件中不要混淆 VBScript 和 JScript。

  6. 在“文件”菜单上,单击“保存”。
  7. 在“保存类型”列表中,单击“所有文件”。请不要将该文件保存为“文本文档 (*.txt)”,因为它会自动将 .txt 添加到文件名中,会妨碍它的运行。
  8. 在“文件名”框中,键入文件的名称,以驱动器号和完整路径开头。如果管理脚本是以 VBScript 编写的,则请用 .vbs 文件扩展名保存该文件 - 例如,C:\WmiTutorial.vbs。如果管理脚本是以 JScript 编写的,则请用 .js 文件扩展名保存该文件 - 例如,C:\WmiTutorial.js
  9. 单击“保存”。在每次进行更改后一定要保存该文件。

在命令行管理脚本上设置安全性

  1. 从“开始”菜单,单击“运行”。
  2. 在“打开”框中,键入 Explorer
  3. 单击“确定”。
  4. 浏览到包含脚本文件的文件夹。
    要查看本地驱动器,请双击“我的电脑”。
  5. 右键单击脚本文件的名称,然后单击“属性”。
  6. 单击“安全性”选项卡,以显示该文件的访问控制列表 (ACL),然后设置 ACL,以将访问权限限制为 Administrators 组。 详细信息,请参阅访问控制
  7. 设置完 ACL 之后,请单击“确定”。

从命令提示符窗口运行命令行管理脚本

  1. 从“开始”菜单,单击“运行”。
  2. 在“打开”框中,键入 Cmd,然后单击“确定”。
  3. 通过执行下列操作之一将目录转到脚本文件的位置:
    • 如果提示符显示“D:\>”或“D:\Documents and Settings\myname”,并且脚本文件位于 C 驱动器上,请键入 C:,然后按 Enter。如果脚本文件位于该驱动器的子文件夹中,则请键入 cd foldername,以转到该文件夹,然后按 Enter。
    • 要查看您所在的文件夹的内容,请键入 dir,按 Enter,然后查找您的脚本。在提示符指出您已经位于包含脚本的文件夹之后,就可以运行该脚本了。
  4. 要用 CScript 引擎运行 WmiTutorial.vbs 文件,请键入:CScript WmiTutorial.vbs

    注意 注意 可能会显示一个上面写着“This is a test”的窗口。当您使用多个 WScript.Echo 行编写较长的脚本时,接收每行的弹出式窗口是单调乏味的过程。因此要强制 WScript.Echo 行在命令提示符窗口中显示,请键入:CScript /nologo WmiTutorial.vbs,以调用您的脚本。现在,当您按 Enter 时,应在命令提示符窗口中看到“This is a test”。

  5. 在记事本(使用该程序对脚本进行更改)和命令提示符窗口(用来运行您的脚本)之间来回切换。命令提示符窗口的一个节省时间的功能是,您可以按键盘上的向上箭头来自动重复您键入的最后一行。

简单 WMI 任务的基本模式

所有简单的 WMI 任务都遵循下面的基本模式:

  1. 与 WMI 建立连接。如果您只对一台计算机进行更改,这是可选的。
  2. 通过 WMI 连接到计算机。此步骤始终是必需的。
  3. 创建一个访问特定数据所需的适当的对象的实例。
  4. 通过使用实例化的对象,对配置进行更改,该过程可能包括收集数据、更改属性、添加对象或删除对象。
  5. 如果对数据存储(在这种情况下为 IIS 配置数据库属性)进行了更改,请加以保存。

要与 WMI 建立连接,请在脚本文件中使用下面的一行代码。LocatorObj 是可以更改为任何值的变量名。

VBScript
set  locatorObj = CreateObject("WbemScripting.SWbemLocator")
JScript
var  locatorObj = new ActiveXObject("WbemScripting.SWbemLocator");

WbemScripting 对象是 WMI 的基本对象,如同 WScript 对象是一般脚本任务的基本对象一样。

如果您了解使用哪些必要的 SDK,那么编写脚本的速度会快得多。请在 WMI SDK 的 WMI Reference, Scripting API for WMI 部分中查找 SWbemLocator 对象。定义了两个方法,其中一个方法我们在下面将使用,这就是 ConnectServer

在 WMI SDK 中,查找为 ConnectServer 方法列出的参数。大多数参数都是可选的,描述中提供了它们的默认值。例如,如果您在调用该方法时未指定计算机名,那么 WMI 就假定您需要连接到您在其上运行脚本的计算机。

要使用用户名和密码连接到一台计算机,请在脚本文件中使用下面的一行代码。此行代码可能在此页上分两行显示,但在脚本文件中应在同一行中输入。请记住,使用与脚本中第一行中所使用的语言相同的语言,并记住,用户名必须是该计算机上的管理员。

下面的示例使用了管理员帐户本身。用运行 Windows Server 2003 家族以及 IIS 6.0 的计算机的名称替换 MyMachine,并用管理员密码替换 Password

VBScript
set  providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2", "MyMachine\administrator", "Password")
JScript
var  providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2", "MyMachine\\administrator", "Password");

在 JScript 中,\ 字符是特殊的转义符,因此必须键入两次。现在就运行您的脚本,检查使用 ConnectServer 方法是否有错误。如果产生错误,则请在 WMI SDK 的 WMI Reference, Scripting API for WMI 部分中查找 ConnectServer。那里您会发现一个错误值表以及可能的原因,它们可能会帮助您找到解决办法。命令提示符窗口中的错误文本也常常会提供足够的信息。

根据有关 ConnectServer 的 WMI SDK 信息,返回值 providerObjSWbemService 对象。单击该页上指向 SWbemService 的链接以查看可用的方法。花一些时间熟悉一下可以用此 WMI 对象执行的任务。阅读 Get 方法(下面我们将使用)的参数的描述。

要创建 IIS 帮助中 IIS WMI 提供程序参考中列出的相应 IIS WMI 对象的实例,请使用 Get 方法。在下面一行代码中,我们创建了 IIsWebVirtualDir (WMI) 对象的实例,该对象连接到计算机上列出的第一个网站的根虚拟目录。

VBScript
set  nodeObj = providerObj.Get("IIsWebVirtualDir='W3SVC/1/Root'")
JScript
var  nodeObj = providerObj.Get("IIsWebVirtualDir='W3SVC/1/Root'");

配置数据库路径 W3SVC/1/Root 必须与 IIS 管理对象类型 IIsWebVirtualDir 相匹配,如 KeyType 的“参考”部分的“访问位置”表中所列出的那样。举一个不同的例子,如果您已连接到一个网站,则 IIS 管理对象类型是 IIsWebServer,项类型将是 W3SVC/n,其中 n 是网站号码。

我们应该注意到有多种方法达到这一效果。下表提供了在不需要传递用户名和密码的情况下三种实例化 nodeObj 的方法。研究每一种方法,发现它们之间的区别,以便帮助您更好地理解有什么样的可能性。第一种方法是已经在您的脚本中使用的方法。

VBScript
set locatorObj = CreateObject("WbemScripting.SWbemLocator")
set providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2")
set nodeObj = providerObj.Get("IIsWebVirtualDir='W3SVC/1/Root'")
set providerObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2")
set nodeObj = providerObj.get("IIsWebVirtualDir='W3SVC/1/ROOT'")
set nodeObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2:IIsWebVirtualDirSetting='W3SVC/1/ROOT'")
JScript
var locatorObj = new ActiveXObject("WbemScripting.SWbemLocator");
var providerObj = locatorObj.ConnectServer("MyMachine", "root/MicrosoftIISv2");
var nodeObj = providerObj.Get("IIsWebVirtualDir='W3SVC/1/Root'");
var providerObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2");
var nodeObj = providerObj.get("IIsWebVirtualDir='W3SVC/1/ROOT'");
var nodeObj = GetObject("winmgmts://MyMachine/root/MicrosoftIISv2:IIsWebVirtualDir='W3SVC/1/ROOT'")

现在您已经与默认网站的根虚拟目录建立了连接,可以使用 nodeObj 变量对配置进行更改了。请参阅 IIsWebVirtualDir (WMI) 以确定您可以使用的方法和属性。例如,要卸载 ASP 应用程序而不卸载所有的子应用程序,请使用下面的一行代码中的 AppUnload 方法:

VBScript
nodeObj.AppUnload False
JScript
nodeObj.AppUnload(false);

在 IIS 管理器中,这与单击默认网站的“主目录”属性页的“卸载”按钮的效果相同。

要查看其中一个属性的内容,请使用下面任意一行代码:

VBScript
WScript.Echo "AppRoot = " & nodeObj.AppRoot
' 或,
WScript.Echo "AppRoot = " & nodeObj.Properties_("AppRoot").Value
JScript
WScript.Echo("AppRoot = " + nodeObj.AppRoot);
// 或,
WScript.Echo("AppRoot = " + nodeObj.Properties_("AppRoot").Value)

每一行代码的输出都应是下面的文字:

AppRoot = /LM/W3SVC/1/ROOT
两行的效果相同。第二行代码可以作为变量来传递属性名称,在需要编写一个允许用户作为属性名称传递参数的情况下,这一点很重要。在 WMI SDK 中,在 SWbemObject 下查找 Properties_ 属性,以了解详细信息。Properties_ 属性返回一组 SWbemProperty 对象,这些对象是 Value 属性的出处。

要点 要点 WMI 中的一切都是通过对象关系进行连接的。您访问一个对象之后,可以通过调用返回其他对象的方法来访问到这些对象。这就是为什么您编写脚本时以 WbemScripting 对象在顶端开始的原因。在使用 IIS WMI 提供程序的情况下,没有一长串对象,因此通常可以直接连接到您需要的对象。

要更改一个属性并将更改保存到 IIS 配置数据库,请使用下面几行代码。Put_ 方法已在 SWbemObject 下的 WMI SDK 中列出:

VBScript
nodeObj.AppIsolated = 1
' 或,
nodeObj.Properties_("AppIsolated").Value = 1
' 保存更改。
nodeObj.Put_
JScript
nodeObj.AppIsolated = 1;
// 或,
nodeObj.Properties_("AppIsolated").Value = 1;
// 保存更改。
nodeObj.Put_();

运行您的脚本。是否有错误?您应该收到错误“修改只读对象或属性的操作失败”。如第 3 课:从 IIS 配置数据库来组织数据中所学到的那样,CIM_ManagedSystemElement 类只包含对象的只读属性和方法。我们需要连接到 IIsWebVirtualDirSetting (WMI) 对象才能访问我们可以读取和写入的属性。从您的脚本中删除以前的几行代码,实例化一个新对象,并使用下面的代码设置 AppFriendlyName 属性:

VBScript
set nodeObj = providerObj.Get("IIsWebVirtualDirSetting='W3SVC/1/Root'")
WScript.Echo "Before: AppFriendlyName = " & nodeObj.AppFriendlyName
nodeObj.Description = "Default Root Application"
' 或,
nodeObj.Properties_("AppFriendlyName").Value = "Default Root Application"
' 保存更改。
nodeObj.Put_
WScript.Echo "After: AppFriendlyName = " & nodeObj.AppFriendlyName
JScript
var nodeObj = providerObj.Get("IIsWebVirtualDirSetting='W3SVC/1/Root'");
WScript.Echo("Before: AppFriendlyName = " + nodeObj.AppFriendlyName);
nodeObj.Description = "Default Root Application";
// 或,
nodeObj.Properties_("AppFriendlyName").Value = "Default Root Application";
// 保存更改。
nodeObj.Put_();
WScript.Echo("After: AppFriendlyName = " + nodeObj.AppFriendlyName);

运行此应用程序时,应有如下输出:

Before: AppFriendlyName = Default Application
After: AppFriendlyName = Default Root Application

在 IIS 管理器中,这与更改默认网站的“主目录”属性页的“应用程序名”的效果相同。

相关主题

© 1997-2003 Microsoft Corporation。保留所有权利