AppCmd.exe 入门

作者:Mike Volodarsky

概述

AppCmd.exe 是用于管理 IIS 7 及更高版本的单一命令行工具。 它通过一组直观的管理对象公开所有关键服务器管理功能,这些对象可以通过命令行或脚本进行操作。

AppCmd 让你无需使用图形管理工具即可轻松控制服务器,并且无需编写代码即可快速自动化服务器管理任务。

可以使用 AppCmd 执行以下操作:

  • 创建和配置站点、应用、应用程序池和虚拟目录
  • 启动和停止站点以及回收应用程序池
  • 列出正在运行的工作进程,并检查当前正在执行的请求
  • 搜索、操作、导出和导入 IIS 和 ASP.NET 配置

AppCmd 还使服务器管理员能够给通过组合多个更简单的 AppCmd.exe 命令或在另一个程序中重用该工具的输出来构建高级管理任务。

你还可以在我的博客(网址为 https://mvolo.com/category/appcmd/)上找到更多 AppCmd 主题并了解通过命令行管理服务器的强大方法。

如何使用 AppCmd.exe

AppCmd.exe 命令行基于一组顶级服务器管理对象(如站点和应用程序)构建。 这些对象会公开可用于对这些对象执行各种操作的方法,并且对象实例会公开可检查和操作的属性。

例如,Site 对象提供列出、创建和删除站点实例的方法(这些是几乎所有对象上都存在的标准方法)以及停止和启动站点。 每个站点实例依次包含可以检查、搜索或设置的属性,例如站点名称和站点 ID。 每个命令的输出始终是对象实例的列表。

注意

AppCmd.exe 位于 %systemroot%\system32\inetsrv\ 目录中。 由于它不会自动成为 PATH 的一部分,因此在执行 %systemroot%\system32\inetsrv\AppCmd.exe list sites 列表站点中的命令时,需要使用可执行文件的完整路径。 或者,可以手动将 inetsrv 目录添加到计算机上的路径,这样就可以从任何位置直接访问 AppCmd.exe。

该工具的工作原理是在支持的管理对象之一上执行命令,并使用可选参数来进一步自定义命令的行为:

APPCMD (command) (object-type) <identifier> < /parameter1:value1 ... >*

其中 <COMMAND><OBJECT> 支持的命令之一。 大多数对象都支持这组基本命令:

  • LIST 显示机器上的对象。 可选的 <ID> 可以指定要列出的唯一对象,或者可以指定一个或多个参数来匹配对象属性。
  • ADD 将创建一个新对象,并在创建期间设置指定的对象属性。
  • DELETE 可删除 <ID> 指定的对象。
  • SET 在 <ID> 指定的对象上设置参数。

对象通常会支持其他命令,例如站点对象的 START 和 STOP。

例如,当前通过 AppCmd 可用的对象集是(其中 <OBJECT> 是该工具支持的管理对象之一):

Object 说明
场所 虚拟站点的站点管理
应用 应用程序管理
VDir 虚拟目录的管理
Apppool 应用程序池的管理
Config 常规配置小节的管理
备份 服务器配置备份的管理
WP 工作进程管理
请求 显示活动的 HTTP 请求
模块 服务器模块的管理
跟踪 服务器跟踪日志的管理

其中 <ID> 是要为命令指定的对象实例的特定于对象的标识符。 标识符的格式特定于每个对象类型。 例如,Site 对象使用站点名称,App 对象使用应用程序路径,AppPool 对象使用应用程序池名称。

其中 [ /parameter:value ]* 是命令的零个或多个参数。 每个命令支持一组不同的参数,具体取决于对象。 通常,搜索对象或操作对象属性的命令将允许将对象的任何属性指定为参数。

该工具本身还支持许多影响一般命令执行的参数,并且不特定于任何对象。 这些列在“AppCmd.exe /?”提供的顶级帮助页面中,并包括用于控制工具输出的 /text/config/xml 等参数,以及用于控制配置更改位置的 /commit 参数。

获取帮助

AppCmd 提供自描述帮助,可用作所有支持的对象和命令的参考。 在深入研究想要执行的任务时,可以使用三种类型的帮助。

常规帮助

常规帮助屏幕显示该工具支持的对象以及普遍适用的工具参数。 若要显示常规帮助,请使用以下命令行:

APPCMD /?

前几行输出是:

General purpose IIS command line administration tool.
APPCMD (command) (object-type) <identifier> < /parameter1:value1 ... >

Supported object types:
       
  SITE      Administration of virtual sites
  APP       Administration of applications              

...

对象帮助

对象帮助屏幕显示特定对象支持的命令。 若要显示对象帮助,请使用以下命令行:

APPCMD <OBJECT> /?

其中 <OBJECT> 是受支持的对象类型之一。 例如,此命令行将显示站点对象的帮助:

APPCMD site /?

命令帮助

命令帮助屏幕描述特定命令和对象的语法,包括它支持的参数和常见任务的示例。 若要显示命令帮助,请使用以下命令行:

APPCMD <COMMAND> <OBJECT> /?

例如,此命令行将显示 App 对象的 LIST 命令的帮助:

APPCMD list app /?

使用 LIST 命令查找对象

LIST 命令是最通用的命令,并且受所有对象支持。 此命令的目的是根据指定的条件查找对象的实例。 此命令的输出是对象实例的列表,可以通过查看其属性来检查它们,导出以便将来在另一台计算机上重新创建,或与另一个命令一起使用来对其执行操作。

列出所有对象

使用 LIST 命令的最简单方法是不使用任何参数,这将仅列出该对象的所有已知实例:

APPCMD list <OBJECT>

例如,若要列出计算机上的所有站点,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD list sites

输出结果会类似于:

SITE "Default Web Site" (id:1,bindings:HTTP/*:80:,state:Started)
SITE "Site1" (id:2,bindings:http/*:81:,state:Started)
SITE "Site2" (id:3,bindings:http/*:82:,state:Stopped)

默认情况下,每个对象都显示在一行上,指定其特定于对象的标识符(例如“默认网站”)和一个或多个重要属性(例如 id、绑定和状态)。

列出特定对象

LIST 命令可用于通过使用以下形式的命令行来查找特定命名对象的实例:

APPCMD list <OBJECT> <ID>

例如,使用此命令行查找唯一 ID 为“默认网站”的站点:

%systemroot%\system32\inetsrv\APPCMD list site "Default Web Site"

列出满足查询条件的对象

若要查找匹配特定条件的所有对象实例,请指定一个或多个参数,这些参数指示要匹配的对象的属性值。 例如,使用此命令行查找已停止的所有站点:

%systemroot%\system32\inetsrv\APPCMD list sites /state:Stopped

可以指定任意数量的属性-值对,该工具将确保返回的对象满足所有指定的条件。 例如,使用此命令行查找已停止且配置为不自动启动的站点:

%systemroot%\system32\inetsrv\APPCMD list sites /serverAutoStart:false /state:Stopped

使用 ADD、SET 和 DELETE 操作对象

除了 LIST 之外,大多数对象还支持 ADD、SET 和 DELETE 命令。

添加新对象

ADD 命令创建对象的新实例。 例如,此命令行将创建一个新站点:

%systemroot%\system32\inetsrv\APPCMD add site /name:MyNewSite /bindings:"http/*:81:" /physicalPath:"C:\MyNewSite"

根据对象的不同,需要一些参数才能在新实例上设置所需的属性,而其他属性可能是可选的。 如果未指定所需参数,将返回错误。

命令帮助屏幕指示需要哪些参数。 例如,使用此命令行查看添加站点需要哪些参数:

%systemroot%\system32\inetsrv\APPCMD add site /?

请继续阅读,了解有关使用 AppCmd 创建站点、应用程序、虚拟目录和应用程序池的更多信息。

更改现有对象

SET 命令设置指定对象实例的一个或多个属性。 该命令需要指定对象特定的标识符。 例如,若要更改“默认网站”的 id 属性,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD set site "Default Web Site" /id:200

使用命令帮助语法的形式来查看可以在特定对象上设置哪些属性。 例如,若要查看默认网站支持的属性,请使用:

%systemroot%\system32\inetsrv\APPCMD set site "Default Web Site" /?

删除对象

DELETE 命令可删除对象的实例。 与 SET 一样,此命令也需要指定对象特定的标识符。 例如,使用此命令行删除名为“MyNewSite”的站点:

%systemroot%\system32\inetsrv\APPCMD delete site "MyNewSite"

管理备份

AppCmd 可用于创建和还原全局服务器配置的备份。 可以使用它来恢复服务器配置的不需要的更改,并返回到已知良好的服务器状态。 最好在更改服务器配置或安装更改服务器配置的组件之前创建备份。 每个备份都包含当前 ApplicationHost.config 根配置文件的副本,以及其他相关的服务器范围状态,包括 FTP 配置和 IIS 管理工具配置。

若要创建备份,请使用 Backup 对象的 ADD 命令:

%systemroot%\system32\inetsrv\APPCMD add backup
BACKUP object "20060519T172530" added

这会创建一个备份,其中包含一个自动生成的名称,该名称表示备份的日期和时间。

可以指定备份的特定名称,如下所示:

%systemroot%\system32\inetsrv\APPCMD add backup MyBackup
BACKUP object "MyBackup" added

可以使用 Backup 对象的 LIST 命令显示可用备份的列表:

%systemroot%\system32\inetsrv\APPCMD list backups
BACKUP "20060519T172530"
BACKUP "MyBackup"

最后,若要还原备份,请使用带有备份名称的 RESTORE 命令:

%systemroot%\system32\inetsrv\APPCMD restore backup "MyBackup"
Restored configuration from backup "MyBackup"

还原备份会停止服务器,并将全局配置还原到创建备份时的状态。

在 Windows Server® 2008 和 Windows Vista SP1 中,AppCmd 还能够处理由配置历史服务创建的定期配置备份。 这些备份将显示在 AppCmd 备份列表中,并且可按照与通过该工具手动创建的备份相同的方式进行还原。

若要了解有关使用 AppCmd 管理配置备份的更多信息,请参阅 http://mvolo.com/most-important-appcmd-commands-backing-up-and-restoring-iis7-configuration/

使用站点、应用程序、虚拟目录和应用程序池

创建和管理站点、应用程序和虚拟目录是管理员面临的最常见任务。 IIS 7 及更高版本使用比以前版本更严格的包含层次结构,其工作方式如下:

  1. 网站网站接收由 IP 地址和主机标头定义的特定绑定端点上的请求。 例如,此 url 表示绑定到端口 81 的网站:http://www.mysite.com:81

    一个网站包含一个或多个应用程序。

  2. 应用程序应用程序由其在网站 url 命名空间内的虚拟路径表示。 例如,虚拟路径为“/app1”的应用程序可以用以下url表示:http://www.mysite.com:81/app1

    一个应用程序属于一个应用程序池。

    一个应用程序包含一个或多个虚拟目录。

  3. 虚拟目录虚拟目录由应用程序的 url 命名空间内的虚拟路径表示。 例如,具有虚拟路径“/vdir1”的虚拟目录可以由以下 URL 表示:http://www.mysite.com:81/app1/vdir1

    虚拟目录映射到磁盘上的物理位置。

此层次结构与 IIS 6.0 形成对比,在 IIS 6.0 中,网站可以包含虚拟目录和应用程序的混合,而应用程序只是专门标记的虚拟目录。

应用程序池应用程序池为工作进程指定一组设置,这些工作进程对该应用程序池中的应用程序执行请求处理。 应用程序池不是 site-app-vdir 层次结构的一部分。 每个应用程序指定它将在哪个应用程序池中运行,或者在默认应用程序池中运行。 应用程序池定义了许多工作进程设置,例如它加载的 CLR 版本、.NET 集成模式、工作进程运行的帐户以及进程回收设置。

默认情况下,IIS 7 及更高版本安装有一个名为“默认网站”的网站,该网站侦听端口 80,没有 IP 地址或主机头限制。 该网站有一个根应用程序,并且该应用程序有一个根虚拟目录。 还有一个名为“DefaultAppPool”的应用程序池,默认情况下所有新应用程序都会使用该应用程序池。

此命令行将列出所有站点,包括默认网站:

%systemroot%\system32\inetsrv\APPCMD list sites
SITE "Default Web Site" (id:1,bindings:HTTP/*:80:,state:Started)

让我们通过在列出应用时指定 site.name 属性来检查属于默认网站的应用程序:

%systemroot%\system32\inetsrv\APPCMD list apps /site.name:"Default Web Site"
APP "Default Web Site/" (applicationPool:DefaultAppPool)

类似的命令将列出“默认网站/”应用程序中的虚拟目录,方法是在列出 Vdirs 时指定 app.name 属性:

%systemroot%\system32\inetsrv\APPCMD list vdirs /app.name:"Default Web Site/"
VDIR "Default Web Site/" (physicalPath:C:\inetpub\wwwroot)

最后,让我们检查一下应用程序池:

%systemroot%\system32\inetsrv\APPCMD list apppools
APPPOOL "DefaultAppPool" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)
APPPOOL "Classic .NET AppPool" (MgdVersion:v2.0,MgdMode:ISAPI,state:Started)

使用站点、应用程序、虚拟目录和应用程序池

现在,我们将创建一个名为“MySite”的新网站,网站 ID 为 2,用于侦听端口 81 的所有 IP 地址和主机标头:

%systemroot%\system32\inetsrv\APPCMD add site /name:MySite /id:2 /bindings:http/*:81: /physicalPath:C:\inetpub\mysite
SITE object "MySite" added
APP object "MySite/" added
VDIR object "MySite/" added

必须指定 name 参数才能创建网站。 id 参数是可选的,如果省略,将导致 AppCmd 为新站点生成下一个可用站点 ID。 我们还指定了 bindingsphysicalPath 参数,如下所述。 还可以指定其他属性来设置它们的值。

bindings 属性使用 protocol/bindingInformation 格式,其中 bindingInformation 特定于协议。 对于 HTTP,其格式为 IP:PORT:HOSTHEADER。 可以使用逗号分隔每个定义来指定多个绑定。

我们还为站点指定了 physicalPath 属性。 虽然网站本身没有物理路径,但这种简短形式用于方便地创建具有根应用程序和映射到指定物理路径的根虚拟目录的网站。

如果不指定物理路径,则创建的网站将不包含任何应用程序;需要为其显式创建应用程序和虚拟目录。

让我们继续向网站添加另一个应用程序:

%systemroot%\system32\inetsrv\APPCMD add app /site.name:MySite /path:/app1 /physicalPath:C:\inetpub\mysite\app1
APP object "MySite/app1" added
VDIR object "MySite/app1/" added

这会创建一个新的应用程序,其虚拟路径“/app1”属于我们上面创建的站点,根虚拟目录指向 C:\inetpub\mysite\app1。 必需的 path 参数指定新应用程序的虚拟路径,必需的 site.name 参数指定应用程序所属的站点。 可选的 physicalPath 参数是一个快捷方式,与站点情况非常相似,它与应用程序一起创建根虚拟目录。

如果没有指定 physicalPath 参数,或者想要向应用程序添加另一个虚拟目录,请使用如下所示的命令行:

%systemroot%\system32\inetsrv\APPCMD add vdir /app.name:"MySite/app1" /path:/vdir1 /physicalPath:C:\inetpub\mysite\app1\vdir1
VDIR object "MySite/app1/vdir1" added

这会创建一个新的虚拟目录,其虚拟路径“/vdir1”属于我们上面创建的应用程序,并指向 C:\inetpub\mysite\app1\vdir1。 必需的 path 参数指定新虚拟目录的虚拟路径,必需的 app.name 参数指定虚拟目录所属的应用程序。 physicalPath 参数指定虚拟目录的物理位置。

最后,让我们创建一个新的应用程序池:

%systemroot%\system32\inetsrv\APPCMD add apppool /name:MyAppPool
APPPOOL object "MyAppPool" added

这创建了一个名为“MyAppPool”的新应用程序池。

若要了解有关 IIS 7 及更高版本中的站点、应用程序和虚拟目录以及使用 AppCmd 创建它们的选项的更多信息,请参阅创建 IIS7 及更高版本站点、应用程序和虚拟目录

配置站点、应用程序、虚拟目录和应用程序池

之前,我们添加了一个新网站,其中包含一些应用程序和虚拟目录。 现在,我们将使用 AppCmd 来修改它们的某些属性。 所有 AppCmd 对象都支持使用相同的标准语法来设置属性:

APPCMD SET <OBJECT> <ID> [ /property:value ]*

首先,让我们显示计算机上可用的应用程序:

%systemroot%\system32\inetsrv\APPCMD list apps
APP "Default Web Site/" (applicationPool:DefaultAppPool)
APP "MySite/" (applicationPool:DefaultAppPool)
APP "MySite/app1" (applicationPool:DefaultAppPool)

请注意之前在网站“MySite”下创建的两个应用程序。 这两个应用程序都设置为使用 DefaultAppPool 应用程序池。 让我们更改“MySite/”根应用程序的 applicationPool 属性,以使用我们之前创建的名为“MyAppPool”的新应用程序池:

%systemroot%\system32\inetsrv\APPCMD set app "MySite/" /applicationPool:MyAppPool
APP object "MySite/" changed

这会将“MySite/”应用程序的 applicationPool 属性的值更改为新值,从而有效地将应用程序移动到新的应用程序池。

将应用程序移到新的应用程序池的原因是,我们可以更改运行此应用程序的工作进程的一些运行时参数。 为此,我们需要更改“MyAppPool”应用程序池上的一些属性。 在更改属性值之前,最好先显示可用属性及其当前值。 可以通过在详细视图中列出应用程序来执行此操作:

%systemroot%\system32\inetsrv\APPCMD list apppool "MyAppPool" /text:*
APPPOOL
  APPPOOL.NAME: MyAppPool
  managedPipelineMode: Integrated
  managedRuntimeVersion: v2.0
  state: Started
  [add]
    name:"MyAppPool"
    queueLength:"1000"
    autoStart:"true"
    enable32BitAppOnWin64:"false"
    managedRuntimeVersion:"v2.0"
    managedPipelineMode:"Integrated"
    passAnonymousToken:"true"
    [processModel]
      identityType:"NetworkService"
      userName:""
      password:""
...
      pingingEnabled:"true"
...

请注意应用程序池对象上的属性数;此处未显示完整输出。

我们有意将 managedRuntimeVersion 属性更改为“v1.1”,以便使用 ASP.NET v1.1 在此应用程序池中运行我们的应用程序。 下面是执行此操作的命令行:

%systemroot%\system32\inetsrv\APPCMD set apppool "MyAppPool" /managedRuntimeVersion:v1.1
APPPOOL object "MyAppPool" changed

从上面的列表输出中可以看到,应用程序池对象上有许多可用属性,并且某些属性嵌套在配置子元素中。 例如,进程选项嵌套在“processModel”子元素下方。

如果要设置嵌套属性,请使用如下所示的元素路径表示法对其进行寻址:

%systemroot%\system32\inetsrv\APPCMD set apppool "MyAppPool" /processModel.pingingEnabled:false

其他配置元素

除了使用顶级 AppCmd 对象操作配置属性之外,还可以在任何配置小节上设置配置属性,包括与顶级 AppCmd 对象关联的配置小节。 下文中的“使用配置”部分将对此进行介绍。

检查服务器状态

AppCmd 提供了检查服务器运行时状态各个方面的功能,包括:

  • 站点状态
  • 应用程序池状态
  • 活动服务器工作进程
  • 当前正在执行的请求

此外,某些对象提供了可用于控制其运行时状态的命令,例如 Site 对象的 STOP 命令和 AppPool 对象的 RECYCLE 命令。

检查站点和应用程序池状态

站点和应用程序池的状态从每个对象的 state 属性报告。 列出站点或应用程序池时,状态将显示在默认输出中。 例如:

%systemroot%\system32\inetsrv\APPCMD list apppools DefaultAppPool
APPPOOL "DefaultAppPool" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)

state 属性还可用于搜索处于特定状态的站点或应用程序池。 例如,若要查找所有已启动的应用程序池,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD list apppools /state:started
APPPOOL "DefaultAppPool" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)
APPPOOL "Classic .NET AppPool" (MgdVersion:v2.0,MgdMode:ISAPI,state:Started)

检查正在运行的工作进程

可以使用 WP(工作进程)对象列出正在运行的工作进程:

%systemroot%\system32\inetsrv\APPCMD list wps
WP "3577" (apppool:DefaultAppPool)

每个 WP 对象都有一个 apppool.name 属性,可用于列出特定应用程序池所有正在运行的工作进程:

%systemroot%\system32\inetsrv\APPCMD list wps /apppool.name:DefaultAppPool
WP "3577" (apppool:DefaultAppPool)

检查当前正在执行的请求

Request 对象可检查服务器上当前正在执行的请求:

%systemroot%\system32\inetsrv\APPCMD list requests
REQUEST "fb0000008000000e" (url:GET /wait.aspx?time=10000,time:4276 msec,client:localhost)

通过使用适当的属性来过滤结果,可以将该列表限制为特定站点、应用程序池、工作进程或 URL 的请求。 以下是一些示例:

%systemroot%\system32\inetsrv\APPCMD list request /apppool.name:DefaultAppPool

%systemroot%\system32\inetsrv\
APPCMD list requests /wp.name:3567

%systemroot%\system32\inetsrv\APPCMD list requests /site.id:1

使用配置

IIS 7 及更高版本具有基于 XML 的分层配置系统,类似于 ASP.NET 配置系统,该系统将服务器配置存储在模式化的 XML 部分中。 配置可以位于服务器级别的 ApplicationHost.config 文件中,也可以放置在应用程序层次结构中的分布式 Web.config 配置文件中。

AppCmd 允许通过其 Config 对象从命令行全面检查和编辑配置层次结构。 此外,AppCmd还提供清除配置、锁定和解锁、搜索等其他有用的功能。

查看配置

AppCmd 在配置小节级别进行配置。 每个配置小节通常描述一种服务器功能,并且可能包含一个或多个子元素和集合。

可以为任意 URL 命名空间(例如站点、应用程序或 URL)设置配置。 在较高级别设置的配置设置由所有较低级别继承,除非这些设置在较低级别被专门重写。

若要显示特定 URL 级别的有效配置,请使用 Config 对象的 LIST 命令,如下所示:

%systemroot%\system32\inetsrv\APPCMD list config <URL> /section:SectionName

其中 <URL> 是应读取有效配置的配置路径,例如“Default Web Site/”或“Default Web Site/app1/hello.html”。 如果未指定,则默认为服务器级别。

要了解有关 IIS 配置层次结构以及如何构建与 AppCmd 和其他工具一起使用的 IIS 配置路径的更多信息,请参阅 IIS7 及以上配置路径的剖析

section 参数指定你想要读取的配置小节。 如果未指定,则会显示在 URL 级别有效的所有配置小节。 例如,此命令行显示默认网站的根应用程序的所有有效配置:

%systemroot%\system32\inetsrv\APPCMD list config "Default Web Site/"

若要列出特定小节,请使用如下所示的命令行:

%systemroot%\system32\inetsrv\APPCMD list config "Default Web Site/" /section:asp
<system.webServer>
  <asp>
    <session />
    <comPlus />
    <cache />
    <limits />
</asp>
</system.webServer>

默认情况下,AppCmd 仅显示显式设置的配置。 如果要显示有效配置(包括继承或默认值),请指定 /config:* 参数:

%systemroot%\system32\inetsrv\APPCMD list config "Default Web Site/" /section:asp /config:*

若要显示可用配置小节的列表,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD list config /section:?

编辑配置属性

在 AppCmd 中,每个配置小节都作为配置对象的实例公开,该对象公开表示基础配置小节的属性。 使用 Config 对象的 SET 命令来更改这些属性。 语法为:

APPCMD set config <URL> /section:SectionName [ /property:value ]+

<URL> 为可选项;它指定更改应应用的配置路径。 若省略该选项,则会在服务器级别应用更改,并由所有 URL 继承。

section 参数为必填项;它指示正在编辑的小节。

例如,若要设置 http://localhost/app1 URL 的 ASP 小节的 appAllowClientDebug 属性:

%systemroot%\system32\inetsrv\APPCMD set config "http://localhost/app1" /section:asp /appAllowClientDebug:false
CONFIG object "asp" changed

若要设置嵌套在配置小节的子元素中的配置属性,请使用以下元素路径表示法:

%systemroot%\system32\inetsrv\APPCMD set config "http://localhost/app1" /section:asp /limits.requestQueueMax:4000
CONFIG object "asp" changed

在单个命令行中指定多个属性,以在同一配置小节中进行多次编辑。

若要显示可以在特定配置小节设置的所有属性,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD set config /section:asp /?

注意

请注意,asp 小节默认处于锁定状态,因此执行这些命令将返回锁定冲突错误。 可以先解锁此小节,通过省略 <URL> 在服务器级别设置配置,或者使用 /commit:apphost 将它们提交到服务器级别位置标记。 请参阅下文中的控制配置位置

编辑配置集合

AppCmd 还支持编辑配置集合。 配置集合可以包含多个元素 - 例如,system.webServer/modules 配置小节包含指定服务器执行的模块的模块配置元素列表。

若要设置集合元素的属性,请通过在元素路径表示法中使用集合索引器表达式来指定要编辑的特定集合元素。 集合索引器表达式使用键值来标识特定的集合元素。 索引器采用以下格式:

[key1='value1',key2='value2',...]

唯一标识元素所需的键的数量取决于集合。 大多数集合只需要一个密钥。

例如,为了在键名称属性等于“FormsAuthentication”的集合元素上设置类型属性,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD set config /section:system.webServer/modules /[name='FormsAuthentication'].type:System.Web.Security.FormsAuthenticationModule

若要添加新的集合元素,请使用加号 + 为元素路径表示法添加前缀。 在集合索引器表达式中,为每个键属性提供值。 此外,还可以将非键属性包含在集合索引器表达式中。 例如,这将添加一个新的模块集合元素:

%systemroot%\system32\inetsrv\APPCMD set config /section:system.webServer/modules /+[name='MyModule',type='MyType']

若要删除集合元素,请使用减号 - 为元素路径表示法添加前缀:

%systemroot%\system32\inetsrv\APPCMD set config /section:system.webServer/modules /-[name='MyModule']

控制配置的位置

配置系统是分层的,允许在从服务器级别的 ApplicationHost.config 文件到可以出现在站点、应用程序或虚拟目录级别的分布式 Web.config 文件的多个级别写入配置设置。

当在特定级别编写配置时,该级别及更低级别的所有 URL 都会继承该配置。 例如,站点根目录下的 Web.config 配置文件中设置的配置将由该站点的所有 URL 继承。

默认情况下,AppCmd 将在设置的级别写入配置。 例如,如果为“默认网站/”设置配置,该配置将写入该站点根目录下的 Web.config 文件中。

但是,可以在更高级别编写配置,并通过使用位置构造仅将其应用于下面的特定 URL 子集。 例如,应用程序 Web.config 可以包含仅应用于该应用程序内的单个目录的配置。 AppCmd 通过其 commit 参数提供此功能。

commit 参数可以设置为以下之一:

  • (省略) - 默认值;在设置的目标级别写入配置
  • url - 与默认值相同;在设置的目标级别写入配置
  • site - 在设置的目标 url 站点根目录下的 Web.config 中写入配置
  • app - 在设置的目标 url 应用根目录下的 Web.config 中写入配置
  • apphost - 在服务器级别的 applicationHost.config 文件中写入配置
  • <PATH> - 在指定配置路径中写入配置

例如,此命令行会关闭应用程序的目录浏览,并在站点根目录的 Web.config 文件中写入该配置:

%systemroot%\system32\inetsrv\APPCMD set config http://localhost/app1/ /section:directoryBrowse /enabled:false /commit:site

若要了解有关 IIS 配置路径和控制配置位置的更多信息,请参阅 IIS7 及更高版本配置路径剖析

锁定和解锁配置

配置系统允许将配置小节锁定在特定级别,从而防止其属性在较低级别被覆盖。 这可用于防止应用程序更改服务器管理员希望强制执行的设置。

默认情况下,大多数 IIS 配置小节都在服务器级别锁定。 为了在较低级别配置这些小节,需要将它们解锁。 AppCmd 为此提供了 UNLOCK 命令:

%systemroot%\system32\inetsrv\APPCMD unlock config /section:asp

使用 LOCK 命令锁定小节:

%systemroot%\system32\inetsrv\APPCMD lock config /section:asp

请注意,如果锁定某个配置小节,则可能已在较低级别配置该小节的所有应用程序在尝试访问该配置小节时都将遇到锁定冲突错误。

搜索配置

AppCmd 可以在分布式配置层次结构中搜索设置特定配置属性或属性值的所有位置。 配置搜索功能可用于查明启用特定功能的位置,或确保符合特定配置要求。

若要在服务器中搜索定义配置的所有位置,可以使用不带参数的 SEARCH 命令:

%systemroot%\system32\inetsrv\APPCMD search config

若要搜索特定配置路径下的所有位置,例如特定站点的所有配置位置,请在命令行中包含路径:

%systemroot%\system32\inetsrv\APPCMD search config "Default Web Site/"

若要搜索配置特定配置小节的位置,请使用以下命令行:

%systemroot%\system32\inetsrv\APPCMD search config "Default Web Site/" /section:directoryBrowse

若要搜索设置特定属性的位置,请包括属性名称:

%systemroot%\system32\inetsrv\APPCMD search config "Default Web Site/" /section:directoryBrowse /enabled

最后,若要搜索将属性设置为特定值的位置:

%systemroot%\system32\inetsrv\APPCMD search config "Default Web Site/" /section:directoryBrowse /enabled:true

使用工具输出

之前,我们提到 LIST 命令的输出是对象实例的列表。 AppCmd 提供不同的输出模式,能够控制每个对象显示的详细程度。

默认输出

让我们以 LIST 站点为例。 默认情况下,AppCmd 使用压缩的输出格式:

%systemroot%\system32\inetsrv\APPCMD list sites
SITE "Default Web Site" (id:1,bindings:HTTP/*:80:,state:Started)
SITE "Site1" (id:2,bindings:http/*:81:,state:Started)
SITE "Site2" (id:3,bindings:http/*:82:,state:Stopped)

在此输出格式中,每个对象实例位于一行中,指定对象类型 (SITE) 和对象的标识符(“默认网站”)。 通常还会输出几个常见或重要的属性(Site 对象的 ID、绑定和状态)。

详细输出

大多数对象支持的属性比默认输出中显示的属性多得多。 若要显示所有对象属性,请指定 text:* 参数。 每个实例的属性将以层次结构树格式显示:

APPCMD list site "Default Web Site" /text:*
SITE
  SITE.NAME: Default Web Site
  SITE.ID: 2
  bindings: http/*:80:
  state: Started
...

在上面的示例中,输出已缩写,实际输出包含更多属性。

用于使用其他命令行工具的输出

AppCmd 提供了一种输出模式,仅显示每个对象实例的特定属性。 使用 text:<PROPERTY> 参数指定要显示的属性名称。 例如,此命令将返回所有可用的虚拟目录实例,仅显示每个实例的 physicalPath 属性:

%systemroot%\system32\inetsrv\APPCMD list vdirs /text:physicalPath
C:\inetpub\wwwroot
C:\inetpub\vdir1
D:\vdir2

当然,可以显示所列出的对象类型的任何有效属性。

有时需要将 AppCmd 的输出与现有命令行工具和 shell 命令(例如 FOR 命令和 FINDSTR.EXE)一起使用。 通常,这些工具在每个感兴趣的数据项位于单独的行时效果最佳。

例如,假设有一个命令行生成每个 IIS 虚拟目录的目录列表。 命令行需要从每个感兴趣的虚拟目录获取物理路径列表,然后使用 FOR 命令在每个路径上执行 DIR 命令以循环遍历它们:

FOR /F %f IN ('%systemroot%\system32\inetsrv\APPCMD list vdir /text:physicalPath') DO CALL DIR %f

配置输出

许多对象包含直接来自关联配置小节的配置数据。 Config 对象是其中的主要示例,它充当 IIS 配置系统的直接包装器 — Config 对象返回的每个对象实例都是一个配置小节。 其他对象(例如 Site)还包含配置信息作为对象属性的一部分。

如果要以配置系统的原始 XML 格式显示返回对象的配置信息,则可以使用 config 参数。 例如,若要显示站点对象的 XML 配置信息,请使用如下所示的命令行:

%systemroot%\system32\inetsrv\APPCMD list site "Default Web Site" /config
<site name="Default Web Site" id="1">
  <bindings>
        <binding protocol="HTTP" bindingInformation="*:80:" />
...

XML 输出

该工具还支持自己的 XML 输出格式,该格式可为命令执行返回的对象生成格式正确的 XML 结果集。 这可以实现一些令人兴奋的功能,使 AppCmd 与 IIS 团队提供的任何先前的命令行工具区分开来。

  • 生成复杂的管理任务。 此功能的主要目的是使 AppCmd 生成的结果集能够输入到另一个 AppCmd 命令。 这样就能够快速执行复杂的管理任务,而无需编写应用程序代码。
  • 高效地执行批处理操作。 在执行大量操作(例如创建 10,000 个站点)时,多次执行该工具可能会很慢,因为每个操作的进程创建和初始化的开销可能很大。 相反,单个工具命令可以对 XML 数据集中包含的输入数据执行,从而大大缩短处理输入数据的执行时间。
  • 将数据导出到其他工具。 XML 格式使 AppCmd 生成的数据集能与其他工具兼容,从而处理、存储或提供报告。 例如,AppCmd 数据可以与 XSLT 转换一起使用,转换为一般 HTML 管理报告,导入到 SQL Server 2005 中以进行进一步分析,或由 ADO.NET 加载以进行编程处理。

例如,若要在 XML 模式下输出站点列表:

%systemroot%\system32\inetsrv\APPCMD list sites /xml

若要详细了解管道功能以及如何利用它进行强大的命令行管理,请参阅 http://mvolo.com/do-complex-iis-management-tasks-easily-with-appcmd-command-piping/

总结

在本概述中,我们介绍了使用 IIS 7 及更高版本的命令行实用程序 AppCmd.exe 提供的所有不同的强大命令。

你还可以在我的博客(网址为 http://mvolo.com/category/appcmd/)上找到更多 AppCmd 主题并了解通过命令行管理服务器的强大方法。