使用 IIS 7.0 的 WMI 提供程序管理站点

作者:Saad Ladki

介绍

本文档使用 IIS WebAdministration 命名空间演练站点管理,以此来介绍 WMI。 了解如何创建、删除、停止、启动和修改站点 - 所有任务都可以轻松转换为应用程序池和虚拟目录等对象。

使用 WMI,可以查看特定网站的属性,创建或删除站点,或查看服务器上的所有站点。 本文档将指导你完成与站点相关的大多数任务,并提供 WMI 的基本简介。

本文中的任务和章节包括:

对于其他对象(如 ApplicationPool),其中许多任务都以类似的方式执行。 阅读完本文后,可以挑战一下自己,看看是否可以运用在这里学到的内容来创建、删除和修改 ApplicationPool 对象。

本文档广泛使用 CIM Studio;如果不熟悉,请参阅 CIM Studio

开始前

安装 IIS

必须安装 IIS 7.0 或更高版本才能完成本文档中的步骤。 如果可以浏览到 http://localhost/ 并收到标准的 IIS“正在构建”页面,则 IIS 已安装到你的计算机上。 如果未安装 IIS,请参阅在 Windows Vista 上安装 IIS 以获取安装说明。

安装 WMI 提供程序

通过选择“管理工具”(或 Web 管理工具)下的“IIS 管理脚本和工具”组件来安装 IIS WMI 提供程序。 在 Windows Vista 中,这位于 Internet Information Services 下的“Windows 功能”对话框中。 在 Windows Server® 2008 上,位于 Web 服务器 (IIS) 角色下的服务器管理器中。

安装 WMI 工具(包括 CIM Studio)

安装 WMI 工具套件。

所需的权限和用户帐户控制 (UAC)

你必须是管理员才能连接到 WebAdministration WMI 命名空间。 这意味着你已以下列方式之一登录:

  • Windows Server 2008 上的内置管理员帐户
  • 管理员组的成员,并且你禁用了用户帐户控制 (UAC),或者
  • 已启用管理员组成员和 UAC。

如果是第一种或第二种情况,则在本文中不会遇到任何权限问题。

如果是第三种情况,将遇到“拒绝访问”错误。 通过始终以管理员身份打开命令提示符并从提升的命令提示符启动 CIM Studio 来避免这些问题。

若要以管理员身份打开命令提示符窗口,请依次单击“开始”、“所有程序”、“附件”,右键单击“命令提示符”,然后选择“以管理员身份运行”。

若要从提升的命令提示符启动 CIM Studio:

  1. 以管理员身份打开命令提示符。
  2. 键入 %systemdrive%\Program Files\WMI Tools\studio.htm,然后按 Enter。

创建备份

在开始之前备份重要的 IIS 配置文件,以便在完成后将系统还原到其原始状态。

  1. 打开命令提示符。
  2. 键入 %windir%\system32\inetsrv\appcmd add backup IIS7\_WMI\_CIMStudioLab

预期输出:

BACKUP object "IIS7_WMI_CIMStudioLab" added
  • 完成后,通过以管理员身份打开命令提示符并键入 %windir%\system32\inetsrv\appcmd restore backup IIS7\_WMI\_CIMStudioLab,将 IIS 还原到其原始状态。

预期输出:

Restored configuration from backup "IIS7_WMI_CIMStudioLab"

1.获取站点实例

要获取站点实例,请单击“开始”,单击“开始搜索”框,键入 notepad.exe,然后按 Enter。 将以下脚本行粘贴到记事本中:

Set oIIS = GetObject("winmgmts:root\WebAdministration")

单击“文件”、“另存为...”以打开“保存”对话框。 找到对话框底部的“另存为类型:”文本框,并将其值从“文本文档(*.txt)”更改为“所有文件”。 将文件另存为“GetSite.vbs”。

“另存为”对话框的屏幕截图,其中将“另存为”类型更改为“所有文件”。

单击“开始”,单击“开始搜索”框,键入 cmd.exe,然后按 Enter。 键入 cd %SystemDrive%\Users\Administrator\Desktop,然后按 Enter。 键入 cscript //h:cscript,然后按 Enter。 这会将默认脚本宿主设置为 cscript.exe,后者会将其输出发送到从中启动它的命令窗口。 有关详细信息,请阅读从 Windows 运行脚本

键入 GetSite.vbs,然后按 Enter。 如果脚本运行时没有错误,则表示已成功连接到“WebAdministration”命名空间。 有关“winmgmts:root\WebAdministration”字符串的详细信息,请阅读构造名字对象字符串。 我们将向 GetSite.vbs 脚本添加四行。 这四行脚本将获取 Default Web Site,然后通过打印其两个属性来确认成功。

Set oIIS = GetObject("winmgmts:root\WebAdministration")
Set oSite = oIIS.Get("Site.Name='Default Web Site'")            
WScript.Echo "Retrieved an instance of Site " 
WScript.Echo "        Name: " & oSite.Name 
WScript.Echo "        ID:   " & oSite.ID

返回到 cmd 提示符并运行 GetSite.vbs。 应会看到以下输出:

检索了站点的实例

名称:Default Web Site

ID:1

要了解“Get”的原理,请单击“开始”、“所有程序”、“WMI 工具”,最后单击“WMI CIM Studio”。 连接到 WebAdministration 命名空间(请参阅使用 CIM Studio 了解 IIS WMI 提供程序),并搜索 Site 类。 CIM Studio 中的右窗格显示 Site 的属性。 Name 属性位于键图标旁边,下面以红色圆圈显示。

“名称”属性的屏幕截图,其中强调并设置为 W M I C I M Studio 对话框中的键属性。

类可以具有一个或多个“key”属性;由一个或多个键构成的集合用于唯一标识对象。 有关更多详细信息,请阅读描述实例对象路径。实际上,字符串“Site.Name='Default Web Site'”表示“获取 Site 对象的实例,其键属性 Name 等于“Default Web Site”。 如果可以理解这一点,请尝试一些更困难的内容。

2.获取应用程序实例

要获取应用程序实例,请打开 CIM Studio 并搜索 Application 类。 请注意,Application 类具有两个键属性:“SiteName”和“Path”,如以下屏幕截图所示。

W M I M Studio 对话框中“应用程序密钥属性”设置为“路径”和“站点名称”的屏幕截图。

单击“开始”,单击“开始搜索”框,键入 notepad.exe,然后按 Enter。 将以下脚本行粘贴到记事本中。 第二行脚本指定两个 Application 键属性的值。 请注意,此字符串的格式为:<object_name>.<key_property>='<value>',<key_property>='<value>,其中键属性及其值用逗号分隔。

Set oIIS = GetObject("winmgmts:root\WebAdministration") 
Set oApp = oIIS.Get("Application.SiteName='Default Web Site',Path='/'")
WScript.Echo "Successfully retrieved: '" & oApp.SiteName & oApp.Path & "'"

单击“文件”、“另存为...”以打开“保存”对话框。 找到对话框底部的“另存为类型:”文本框,并将其值从“文本文档(*.txt)”更改为“所有文件”。 将文件另存为“GetApp.vbs”,保存在桌面上。

单击“开始”,单击“开始搜索”框,键入 cmd.exe,然后按 Enter。

键入 cd %SystemDrive%\Users\Administrator\Desktop,然后按 Enter。

键入 GetApp.vbs,然后按 Enter。 可以看到以下输出:

已成功检索: 'Default Web Site/'

3.创建站点实例

要创建站点实例,请再次查看 CIM Studio 文章中介绍的方法参数。 在 CIM Studio 中搜索 Site 类。 在右窗格中选择“方法”选项卡。

W M I C I M Studio 对话框中“站点方法”选项卡的屏幕截图。

右键单击“Create”方法并选择“编辑方法参数”。 你将看到下面的对话框,其中显示了 Create 方法的参数。 单击“取消” 。

“创建方法参数”的屏幕截图,包括名称、类型和值。

现在我们知道此方法采用哪些参数,我们将通过将以下脚本行粘贴到记事本来创建这些参数的变量。

Set oIIS = GetObject("winmgmts:root\WebAdministration")
        
' Create a binding for the site
Set oBinding = oIIS.Get("BindingElement").SpawnInstance_
oBinding.BindingInformation = "*:80:www.newsite.com"
oBinding.Protocol = "http"

' These are the parameters we pass to the Create method
name = "NewSite"
physicalPath = "C:\inetpub\wwwroot"
arrBindings = array(oBinding)

单击“文件”、“另存为...”以打开“保存”对话框。 找到对话框底部的“另存为类型:”文本框,并将其值从“文本文档(*.txt)”更改为“所有文件”。 将文件另存为“CreateSite.vbs”,保存在桌面上。

单击“开始”,单击“开始搜索”框,键入 cmd.exe,然后按 Enter。

键入 cd %SystemDrive%\Users\Administrator\Desktop,然后按 Enter。

键入 CreateSite.vbs,然后按 Enter。 脚本应该会成功运行。

返回到 CIM Studio,再次右键单击“创建方法”,这次选择“方法限定符...”。 生成的对话框如下所示,表明“Create”方法是静态方法。 单击“取消” 。

“创建方法限定符”的屏幕截图,其中强调了静态布尔限定符。

必须从对象定义调用静态方法。 下面的脚本示例显示了检索对象实例和检索对象定义之间的差异:

Set oIIS = GetObject("winmgmts:root\WebAdministration")        
' In order to retrieve an object instance, the object's key properties
' and their values must be specified in the WMI object instance path
Set oSite = oIIS.Get("Site.Name='Default Web Site'")    
' The object definition can be retrieved by specifying the name
' of the object without any key properties and values
Set oSiteDefn = oIIS.Get("Site")

在 CreateSite.vbs 脚本中添加几行以创建站点:

Set oIIS = GetObject("winmgmts:root\WebAdministration")
' Create a binding for the site
Set oBinding = oIIS.Get("BindingElement").SpawnInstance_
oBinding.BindingInformation = "*:80:www.newsite.com"
oBinding.Protocol = "http"
' These are the parameters we pass to the Create method
name = "NewSite"
physicalPath = "C:\inetpub\wwwroot"
arrBindings = array(oBinding)
' Get the Site object definition
Set oSiteDefn = oIIS.Get("Site")
' Create site!!
oSiteDefn.Create name, arrBindings, physicalPath
WScript.Echo "Site created successfully!"

返回到 cmd 提示符并运行 CreateSite.vbs。 可以看到以下输出:

站点已成功创建!

若要查看站点已创建的证据,请键入 notepad %windir%\system32\inetsrv\ApplicationHost.config。 键入 Ctrl+F 以显示记事本的“查找”对话框。 在“查找内容:”文本框中键入 NewSite,然后单击“查找下一个”按钮。 这会转到已定义新站点的 <sites> 节:

<site name="NewSite" id="2">
   <application path="/">
      <virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:80:www.newsite.com" />
   </bindings>
</site>

有关创建/删除/修改对象的其他说明

并非 WebAdministration 命名空间中的所有对象都可以创建或删除。 例如,服务器管理 WorkerProcess 和 AppDomain 对象的生命周期,无法 WMI 来创建或删除这两个对象。

要确定对象是否可以创建、删除或修改,可在 CIM Studio 中搜索站点。 右键单击“属性”选项卡上的属性网格,然后单击“对象限定符...”。你将看到以下对话框:

对象限定符的屏幕截图,重点介绍支持创建、支持删除和支持更新布尔限定符。

对象限定符 SupportsCreate、SupportsDelete 和 SupportsUpdate 描述是否可以创建、删除或修改对象。 可以创建、删除和修改站点,因此站点包含这三个限定符,它们的值均为 true。

在 CIM Studio 中搜索 WorkerProcess。 右键单击“属性”选项卡上的属性网格,然后单击“对象限定符...”。下面的对话框显示 WorkerProcess 对象没有这三个限定符:默认情况下,这些限定符的值为 false(有关详细信息,请参阅标准限定符)。 因此无法创建、删除或修改 WorkerProcess 对象。

辅助进程对象限定符的屏幕截图。请注意,缺少支持创建、支持删除或支持更新。

4.枚举所有站点实例

下面的脚本使用“InstancesOf”方法检索站点对象的所有实例。 将以下脚本粘贴到新的记事本窗口中,并另存为“EnumSites.vbs”。

Set oIIS = GetObject("winmgmts:root\WebAdministration")
Set oSites = oIIS.InstancesOf("Site")
For Each oSite In oSites            
     WScript.Echo oSite.Name & " (" & oSite.Id & ")"
Next

运行 EnumSites.vbs 脚本。 你将看到以下输出,即 Default Web Site,以及我们在任务 3 中创建的站点。

Default Web Site (1)

NewSite (2)

详细信息

你可能会想要知道 InstancesOf 方法来自哪里,在哪里可以了解其详情。 脚本的第一行是之前多次使用的同一行,用于连接到 WebAdministration WMI 命名空间:

Set oIIS = GetObject("winmgmts:root\WebAdministration").

GetObject 调用返回一个 SWbemServices 对象,该对象可用于对命名空间执行操作。 此对象具有 InstancesOf 方法,还有其他很多有用的方法。 若要详细了解 InstancesOf 或其他可用方法,请参阅有关 SWbemServices 的平台 SDK文章。

5.启动和停止网站

在修改网站状态之前,我们要了解网站处于什么状态。 下面的脚本连接到 WebAdministration 命名空间,获取 Site 实例,然后对 Site 实例调用 GetState 方法。 GetState 方法返回一个数值状态,所以此脚本包含一个帮助程序函数,用于将数字状态转换为更具描述性的字符串。 将此脚本粘贴到新的记事本窗口中,并将其保存为 GetSiteStatus.vbs

Set oIIS = GetObject("winmgmts:root\WebAdministration")

Set oSite = oIIS.Get("Site.Name='NewSite'")
                                                
WScript.Echo GetStateDescription(oSite.GetState)
' -------helper functions-----------
Function GetStateDescription(statusCode)
Select Case statusCode
                                Case 1
GetStateDescription = "Started"
                                Case 2
GetStateDescription = "Starting"
                                Case 3
GetStateDescription = "Stopped"
                                Case 4
GetStateDescription = "Stopping"
                                Case 5
GetStateDescription = "Unknown"
                                Case Else
GetStateDescription = "Error: Bad Status"
End Select
End Function

从 cmd 提示符运行 GetSiteStatus.vbs,将看到以下输出:

Started

站点已启动,因此要编写一个脚本使其停止。 我们将从 GetSiteStatus.vbs 复制脚本代码,但我们要添加几行内容来停止站点(所有新的行或更新的行都为粗体)。 将此脚本粘贴到新的记事本窗口中,并将其保存为 StopSite.vbs

Set oIIS = GetObject("winmgmts:root\WebAdministration")
                        
Set oSite = oIIS.Get("Site.Name='NewSite'")
                        
WScript.Echo oSite.Name & " is " & GetStateDescription(oSite.GetState)
            
oSite.Stop
        
WScript.Echo oSite.Name & " is " & GetStateDescription(oSite.GetState)
 
' -------helper functions-----------
                        
Function GetStateDescription(statusCode)                        
            
   Select Case statusCode
                                   
      Case 1                       
 GetStateDescription = "Started"
                                  
      Case 2
                                  
 GetStateDescription = "Starting"
                        
      Case 3
                        
 GetStateDescription = "Stopped"
                        
      Case 4
                        
 GetStateDescription = "Stopping"
                        
      Case 5
                        
 GetStateDescription = "Unknown"
                                                                    
      Case Else
                                                
GetStateDescription = "Error: Bad Status"

运行 StopSite.vbs 脚本,会看到以下结果:

NewSite 已启动

NewSite 已停止

现在我们要再次启动站点。 将 StopSite.vbs 复制到名为 StartSite.vbs 的新脚本。 打开 StartSite.vbs,并将 oSite.Stop 行改为读取 oSite.Start。 运行 StartSite.vbs,应会看到以下输出:

NewSite 已停止

NewSite 已启动

6.删除站点

运行在任务 4 中创建的 EnumSites.vbs 脚本。 应会看到以下输出,这意味着服务器上有两个站点:

Default Web Site (1)

NewSite (2)

下面的脚本连接到 WebAdministration 命名空间,获取 Site 的 NewSite 实例并将其删除。 将此脚本粘贴到新的记事本窗口中,并将其保存为 DeleteSite.vbs

Set oIIS = GetObject("winmgmts:root\WebAdministration")
Set oSite = oIIS.Get("Site.Name='NewSite'")
oSite.Delete_

从 cmd 提示符运行 DeleteSite.vbs。

再次运行 EnumSites.vbs 以确认已成功删除 NewSite。 你会看到以下输出,表明 Default Web Site 是服务器上的唯一剩余站点:

Default Web Site (1)

总结

你已了解如何执行下列操作:检索 Site 或 Application 对象的特定实例,创建站点,枚举所有站点实例、停止和启动站点,删除站点。 此信息大部分适用于其他命名空间对象;例如,Application 和 ApplicationPool 对象的创建和删除方式与站点相同。