第 1 课:简单的 WMI 任务
如何运行命令行管理脚本
要点 您必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能运行脚本和可执行文件。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行脚本和可执行文件。在命令提示符下,键入 runas /user:administrative_accountname "script or executable command"。
编写命令行管理脚本
- 从“开始”菜单,单击“运行”。
- 在“打开”框中,键入 Notepad。
- 单击“确定”。
- 通过执行下列操作之一创建测试行:
- 对于 VBScript,请键入:WScript.Echo "This is a test"
- 对于 JScript,请键入 WScript.Echo("This is a test");
注意 由于 JScript 区分大小写,因此请确保在同一文件中不要混淆 VBScript 和 JScript。
- 在“文件”菜单上,单击“保存”。
- 在“保存类型”列表中,单击“所有文件”。请不要将该文件保存为“文本文档 (*.txt)”,因为它会自动将 .txt 添加到文件名中,会妨碍它的运行。
- 在“文件名”框中,键入文件的名称,以驱动器号和完整路径开头。如果管理脚本是以 VBScript 编写的,则请用 .vbs 文件扩展名保存该文件 - 例如,C:\WmiTutorial.vbs。如果管理脚本是以 JScript 编写的,则请用 .js 文件扩展名保存该文件 - 例如,C:\WmiTutorial.js。
- 单击“保存”。在每次进行更改后一定要保存该文件。
在命令行管理脚本上设置安全性
- 从“开始”菜单,单击“运行”。
- 在“打开”框中,键入 Explorer。
- 单击“确定”。
- 浏览到包含脚本文件的文件夹。
要查看本地驱动器,请双击“我的电脑”。
- 右键单击脚本文件的名称,然后单击“属性”。
- 单击“安全性”选项卡,以显示该文件的访问控制列表 (ACL),然后设置 ACL,以将访问权限限制为 Administrators 组。
详细信息,请参阅访问控制。
- 设置完 ACL 之后,请单击“确定”。
从命令提示符窗口运行命令行管理脚本
- 从“开始”菜单,单击“运行”。
- 在“打开”框中,键入 Cmd,然后单击“确定”。
- 通过执行下列操作之一将目录转到脚本文件的位置:
- 如果提示符显示“D:\>”或“D:\Documents and Settings\myname”,并且脚本文件位于 C 驱动器上,请键入 C:,然后按 Enter。如果脚本文件位于该驱动器的子文件夹中,则请键入 cd foldername,以转到该文件夹,然后按 Enter。
- 要查看您所在的文件夹的内容,请键入 dir,按 Enter,然后查找您的脚本。在提示符指出您已经位于包含脚本的文件夹之后,就可以运行该脚本了。
- 要用 CScript 引擎运行 WmiTutorial.vbs 文件,请键入:CScript WmiTutorial.vbs
注意 可能会显示一个上面写着“This is a test”的窗口。当您使用多个 WScript.Echo 行编写较长的脚本时,接收每行的弹出式窗口是单调乏味的过程。因此要强制 WScript.Echo 行在命令提示符窗口中显示,请键入:CScript /nologo WmiTutorial.vbs,以调用您的脚本。现在,当您按 Enter 时,应在命令提示符窗口中看到“This is a test”。
- 在记事本(使用该程序对脚本进行更改)和命令提示符窗口(用来运行您的脚本)之间来回切换。命令提示符窗口的一个节省时间的功能是,您可以按键盘上的向上箭头来自动重复您键入的最后一行。
简单 WMI 任务的基本模式
所有简单的 WMI 任务都遵循下面的基本模式:
- 与 WMI 建立连接。如果您只对一台计算机进行更改,这是可选的。
- 通过 WMI 连接到计算机。此步骤始终是必需的。
- 创建一个访问特定数据所需的适当的对象的实例。
- 通过使用实例化的对象,对配置进行更改,该过程可能包括收集数据、更改属性、添加对象或删除对象。
- 如果对数据存储(在这种情况下为 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 信息,返回值 providerObj 是 SWbemService 对象。单击该页上指向 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。保留所有权利。