作者:Tim Ammann
介绍
使用 WMI 脚本,可以相对轻松地在 IIS 7.0 及更高版本上管理应用程序和应用程序池。 本文介绍了如何只编写几行 VBScript 代码来完成以下入门级任务:
- 创建和枚举应用程序
- 创建、配置和删除应用程序池
- 启动、停止和回收应用程序池
- 查看应用程序池的状态
- 列出服务器上的所有应用程序池
前几个步骤
确保已启用 IIS 和脚本。
- 如果使用 Windows Vista,请依次打开“控制面板”、“程序和功能”,然后打开“Windows 功能”。 在“Web 管理工具”下,选择“IIS 管理脚本和工具”以启用脚本。
- 如果使用的是 Windows Server® 2008,请打开“服务器管理器”。 使用“添加角色向导”安装 IIS 7.0 Web 服务器。 在“选择角色服务”页上的“管理工具”部分中,选择“IIS 管理脚本和工具”。
请以管理员身份运行命令。 若要打开提升的命令提示符窗口,请单击“开始”、指向“所有程序”、单击“附件”、右键单击“命令提示符”,然后单击“以管理员身份运行”。 如果你以管理员身份打开命令 shell,则从该命令行管理程序运行的所有应用程序都将以管理员身份运行。
以文本格式保存脚本文件,用 .vbs 扩展名保存。 可以使用语法“cscript.exe <scriptname.vbs>”在命令提示符下运行这些脚本文件。
开始前,请使用 AppCmd 工具备份 System32\inetsrv\config\applicationhost.config 文件。 有了备份副本,只需复制原始版本即可将 IIS 还原到其原始状态。 若要进行应用,请执行以下步骤:
a. 打开提升的命令提示符窗口。
b. 键入 cd
%Windir%\system32\inetsrv\
c. Type appcmd add backup backupName 来备份 ApplicationHost.config 文件,其中 backupName 是为备份指定的名称。 将在目录下创建一个具有备份名称的
%Windir%\system32\inetsrv\backup
目录。 如果未指定名称,appcmd 将使用当前日期和时间自动生成目录名称。
创建和枚举应用程序
可以在 IIS 中使用 WMI 脚本轻松创建和枚举应用程序。
创建应用程序
若要创建应用程序,IIS 使用新的应用程序 Create 方法。 这是一种静态方法,采用两个必需的字符串参数:ApplicationPath 和 SiteName。 ApplicationPath 定义新应用程序的虚拟路径,SiteName 包含要在其中创建应用程序的网站的名称。 第三个参数 PhysicalPath 是可选的,指定磁盘上应用程序目录的路径。
ApplicationPath 和 SiteName 是关键属性,在创建应用程序后无法更改(请注意,ApplicationPath 在 UI 中称为“虚拟路径”)。
以下脚本在默认网站上创建名为“NewApp”的新应用程序。 观察对 Application 类定义调用 Create 方法的方式。 将脚本复制到记事本,并将其另存为 AppCreate.vbs。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Define the Path, SiteName, and PhysicalPath for the new application.
strApplicationPath = "/NewApp"
strSiteName = "Default Web Site"
strPhysicalPath = "D:\inetpub\NewApp"
' Create the new application
oWebAdmin.Get("Application").Create _
strApplicationPath, strSiteName, strPhysicalPath
要运行脚本,请打开提升的命令提示符窗口并导航到保存 AppCreate.vbs 文件的目录。 要运行脚本,可在刚刚打开的命令提示符窗口中键入以下内容:
Cscript.exe AppCreate.vbs
请记住,必须为 Create 指定 ApplicationPath 和 SiteName 才能成功完成。 还需要指定 PhysicalPath 属性。 如果为 PhysicalPath 参数指定不存在的目录,则不会为你创建目录。 脚本将以无提示方式终止,应用程序的新节点实际上将显示在 IIS Manager 中。 但当尝试打开新应用程序的节点时,将收到错误“<path> 路径的一部分无法找到”。
枚举应用程序池
创建应用程序后,可以通过 WMI 脚本轻松显示其属性。
以下 VBScript 显示了服务器上的每个应用程序的站点名称、应用程序路径、应用程序池和启用的协议。 该脚本使用 WMI InstancesOf 方法检索所有应用程序,然后循环访问它们以显示其属性。
将代码复制到记事本,并将其另存为 AppEnumerate.vbs。
' Connect to the WMI WebAdministration namespace.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Use InstancesOf to retrieve the applications.
Set oApps = oWebAdmin.InstancesOf("Application")
' Iterate through the applications.
For Each oApp In oApps
WScript.Echo " Web site/Application: " & oApp.SiteName & oApp.Path
WScript.Echo " Application Pool: " & oApp.ApplicationPool
WScript.Echo " Enabled protocol(s): " & oApp.EnabledProtocols
WScript.Echo
Next
要运行脚本,请打开提升的命令提示符窗口并导航到保存 AppEnumerate.vbs 文件的目录。 要运行脚本,可在刚刚打开的命令提示符窗口中键入以下内容:
Cscript.exe AppEnumerate.vbs
接下来,你将了解如何创建、配置和管理托管 Web 应用程序的应用程序池。
创建和配置应用程序池
本部分介绍一些基本但重要的任务,可以使用 WMI 脚本通过应用程序池完成这些任务。 应用程序池将一个或多个应用程序连接到一个或多个工作进程。 应用程序池有助于将应用程序彼此分开,这种隔离提高了它们的安全性和可靠性。
创建应用程序池
若要创建应用程序池,IIS 使用 ApplicationPool 类 Create 方法。 此静态方法具有两个参数:第一个参数 AppPoolName 是指定新应用程序池名称的必需字符串;第二个参数 AutoStart 是可选布尔值。
AutoStart 默认为 true,指定你创建的应用程序池将在创建后启动,并在 IIS 本身启动时自动启动。 如果将 AutoStart 设置为 false,则必须手动启动应用程序池。 然而,若要在应用程序池启动之前对应用程序池中的应用程序进行配置或内容更改,禁用自动启动可能非常有用。
以下示例只需三行代码,就可以创建两个应用程序池“NewAppPool”和“OneMoreAppPool”。 请注意如何调用 Create 方法,不是通过 ApplicationPool 实例,而是通过其类定义调用。
将脚本复制到记事本,并将其另存为 AppPoolCreate.vbs。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
oWebAdmin.Get("ApplicationPool").Create("NewAppPool")
oWebAdmin.Get("ApplicationPool").Create("OneMoreAppPool")
要运行脚本,请打开提升的命令提示符窗口并导航到保存 AppPoolCreate.vbs 文件的目录。 要运行脚本,可在刚刚打开的命令提示符窗口中键入以下内容:
Cscript.exe AppPoolCreate.vbs
以交互方式创建应用程序池
只需增加几行代码,即可创建引发输入框的方便脚本,以便以交互方式创建应用程序池。 与之前一样,将脚本复制粘贴到记事本中,另存为扩展名为 .vbs 的文件,并使用 cscript.exe 运行该文件。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
strNewAppPoolName = InputBox("Enter the name for the new application pool.")
If strNewAppPoolName <> "" Then
oWebAdmin.Get("ApplicationPool").Create(strNewAppPoolName)
End If
将应用程序移动至另一个应用程序池
创建应用程序池后,请向其分配应用程序。 使用 WMI 脚本轻松更改应用程序的应用程序池,但需要记住两个重要事项。 首先,由于 IIS 不会检查指定的应用程序池是否实际存在,因此请确保先创建。 其次,若要保存应用程序池分配更改,请记得使用 Put_ 方法。 Application 类从 WMI 继承 Put_ 方法。
以下脚本将默认网站上的“/NewApp”应用程序的应用程序池更改为“NewAppPool”。 与之前一样,将脚本复制粘贴到记事本中。 将其另存为 AppPoolAssign.vbs,然后使用 cscript.exe 运行它。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Retrieve the NewApp application.
Set oApp = oWebAdmin.Get("Application.SiteName='Default Web Site',Path='/NewApp'")
WScript.Echo "Application Web site and Path: '" & oApp.SiteName & oApp.Path & "'"
WScript.Echo "Old application pool: " & oApp.ApplicationPool
WScript.Echo
' Specify the new application pool name.
oApp.ApplicationPool = "NewAppPool"
' Save the change.
oApp.Put_
' Display the new application pool name.
WScript.Echo
WScript.Echo "New application pool: " & oApp.ApplicationPool
删除特定应用程序池
若要完全删除旧应用程序池,可以使用 ApplicationPool 类从 WMI 继承的 Delete_ 方法。
下一个脚本将删除之前创建的名为“OneMoreAppPool”的应用程序池。 与之前一样,将脚本复制粘贴到记事本中。 将其另存为 AppPoolDelete.vbs,然后使用 cscript.exe 运行它。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppPools = oWebAdmin.InstancesOf("ApplicationPool")
For Each oAppPool In oAppPools
If oAppPool.Name = "OneMoreAppPool" Then
oAppPool.Delete_
Exit For
End If
Next
设置网站的默认应用程序池
如果要将应用程序池设置为网站上所有应用程序的默认应用程序池,请使用 Site 对象的 ApplicationDefaults.ApplicationPool 属性。 同样,使用 Site 对象上的 Put_ 方法保存更改。
以下脚本将默认网站的默认应用程序池设置为之前创建的“NewAppPool”。 将脚本复制粘贴到记事本中,另存为 SetAppPoolDefault.vbs,然后使用 cscript.exe 运行它。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Retrieve the default Web site.
Set oSite = oWebAdmin.Get("Site.Name='Default Web Site'")
' Specify the new default application pool name.
oSite.ApplicationDefaults.ApplicationPool = "NewAppPool"
' Save the change.
oSite.Put_
管理应用程序池
可以使用 WMI 脚本轻松启动、停止和回收和创建应用程序池。 本部分介绍如何执行每项任务。 此外,本部分还演示如何获取应用程序池的当前状态。
停止应用程序池
IIS 的 ApplicationPool.Stop 方法对应于 IIS 6.0 中的 IIsApplicationPool.Stop 方法。
可以通过三行脚本完成停止应用程序池的任务。 将以下脚本复制粘贴到记事本中,另存为 AppPoolStop.vbs,然后使用 cscript.exe 运行它。
' Connect to the WMI WebAdministration namespace.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Specify the application pool.
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")
' Stop the application pool.
oAppPool.Stop
启动应用程序池
IIS 具有 ApplicationPool.Start 方法,对应于 IIS 6.0 中的 IIsApplicationPool.Start 方法。
启动应用程序池同样简单。 将以下脚本复制粘贴到记事本中,另存为 AppPoolStart.vbs,然后使用 cscript.exe 运行它。
' Connect to the WMI WebAdministration namespace.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
' Specify the application pool.
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")
' Start the application pool.
oAppPool.Start
回收应用程序池
IIS 的 ApplicationPool.Recycle 方法对应于 IIS 6.0 中的 IIsApplicationPool.Recycle 方法。
回收应用程序池遵循与上文示例相同的模式;唯一需要注意的是,回收方法仅适用于已启动的应用程序池。
将以下脚本复制粘贴到记事本中,另存为 AppPoolRecycle.vbs,然后使用 cscript.exe 运行它。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")
' Recycle the application pool.
oAppPool.Recycle
获取应用程序池的状态
可以使用 ApplicationPool 对象的 GetState 方法检索应用程序池的运行时状态,该方法将返回从 0 到 4 的枚举值。 以下示例显示了这些值的含义,以及如何使用简单的帮助程序函数来显示它们。 此方法在 IIS 6.0 中没有直接对应项。
将脚本复制粘贴到记事本中,另存为 AppPoolState.vbs,并使用 cscript.exe 运行它。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")
' Get the application pool's name and its state.
WScript.Echo oAppPool.Name & " is " & _
GetStateDescription(oAppPool.GetState) & "."
' The helper function translates the return value into text.
Function GetStateDescription(StateCode)
Select Case StateCode
Case 0
GetStateDescription = "Starting"
Case 1
GetStateDescription = "Started"
Case 2
GetStateDescription = "Stopping"
Case 3
GetStateDescription = "Stopped"
Case 4
GetStateDescription = "Unknown"
Case Else
GetStateDescription = "Undefined value."
End Select
End Function
请注意,返回的值将反映运行脚本时应用程序池的状态。 当然,它不会实时更新。 如果需要,请计划运行脚本的任务,以按设置间隔报告特定应用程序池或池的运行状况。
列出服务器上的应用程序池
可以使用 WMI InstancesOf 方法检索所有应用程序池,然后循环访问它们以显示其属性。 以下代码显示应用程序池及其模式(集成式或 ISAPI)。
将以下脚本复制粘贴到记事本中,另存为 ListAppPools.vbs,然后使用 cscript.exe 运行它。
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppPools = oWebAdmin.InstancesOf("ApplicationPool")
For Each oAppPool In oAppPools
WScript.Echo "Application pool name: " & oAppPool.Name
If oAppPool.ManagedPipelineMode = 0 Then
sAppPoolMode = "Integrated"
ElseIf oAppPool.ManagedPipelineMode = 1 Then
sAppPoolMode = "ISAPI"
End if
WScript.Echo "Application pool mode: " & sAppPoolMode
WScript.Echo
Next
输出应该与下面的内容类似:
Application pool name: DefaultAppPool
Application pool mode: Integrated
Application pool name: Classic .NET AppPool
Application pool mode: ISAPI
结束语
本文介绍了如何使用 WMI 脚本完成以下基本任务:
- 创建和枚举应用程序
- 创建、配置和删除应用程序池
- 启动、停止和回收应用程序池
- 查看应用程序池的状态
- 列出服务器上的所有应用程序池
本文未介绍 Application 和 ApplicationPool 类的其他功能。