消費者入門與 AppCmd.exe

作者: Mike Volodarsky

概觀

AppCmd.exe 是管理 IIS 7 和更新版本的單一命令列工具。 它會透過可從命令列或腳本操作的一組直覺式管理物件,公開所有金鑰伺服器管理功能。

AppCmd 可讓您在不使用圖形管理工具的情況下輕鬆控制伺服器,並快速自動化伺服器管理工作,而不需要撰寫程式碼。

您可以使用 AppCmd 執行的一些工作:

  • 建立和設定網站、應用程式、應用程式集區和虛擬目錄
  • 啟動和停止網站,以及回收應用程式集區
  • 列出正在執行的背景工作進程,並檢查目前正在執行的要求
  • 搜尋、操作、匯出和匯入 IIS 和 ASP.NET 設定

AppCmd 也讓伺服器系統管理員只要結合多個更簡單的 AppCmd.exe 命令,或重複使用另一個程式內的工具輸出,即可建置進階管理工作。

您也可以找到更多 AppCmd 主題,並瞭解從部落格上的命令列管理伺服器的強大方式,網址為 https://mvolo.com/category/appcmd/

如何使用 AppCmd.exe

AppCmd.exe 命令列建置在一組最上層伺服器管理物件之上,例如月臺和應用程式。 這些物件會公開可用來對這些物件執行各種動作的方法,而物件實例會公開可檢查及操作的屬性。

例如,Site 物件提供列出、建立和刪除網站實例的方法, (這些是幾乎所有) 物件上都有的標準方法,以及停止和啟動網站。 每個網站實例都會包含可檢查、搜尋或設定的屬性,例如網站名稱和網站識別碼。 每個命令的輸出一律是物件實例的清單。

注意

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> 其中一個命令。 大部分的物件都支援這個基本命令集:

  • 清單 在電腦上顯示物件。 選擇性 < 識別碼 > 可以指定要列出的唯一物件,也可以指定一或多個參數來比對物件屬性。
  • 添加 使用建立期間要設定的指定物件屬性,建立新的 物件。
  • 刪除 刪除識別碼所 <> 指定的物件。
  • 設置 在識別碼所 <> 指定的物件上設定參數。

物件通常會支援其他命令,例如 Site 物件的 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)

根據預設,每個物件都會顯示在單行上,並指定其物件特定識別碼 (,例如「預設網站」) ,以及一或多個重要的屬性 (,例如識別碼、系結和狀態) 。

列出特定物件

LIST 命令可用來使用此格式的命令列來尋找特定具名物件的實例:

APPCMD list <OBJECT> <ID>

例如,使用此命令列尋找唯一識別碼為 「Default Web Site」 的網站:

%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 相反,網站可以包含混合的虛擬目錄和應用程式,而應用程式只是特別標示的虛擬目錄。

應用程式集區 應用程式集區會為背景工作進程指定一組設定,這些進程會針對該應用程式集區中的應用程式執行要求處理。 應用程式集區不是 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」 的新網站,其中網站識別碼為 2,會接聽所有 IP 位址和主機標頭的埠 81:

%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

必須指定 名稱 參數,才能建立網站。 id 參數是選擇性的,如果省略,則 AppCmd 會產生新網站的下一個可用網站識別碼。 我們也指定 系結physicalPath 參數,如下所述。 您也可以指定其他屬性來設定其值。

bindings屬性會使用通訊協定/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 。 必要的 路徑 參數會指定新應用程式的虛擬路徑,而必要的 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 。 必要的 路徑 參數會指定新虛擬目錄的虛擬路徑,而必要的 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 命令。

檢查月臺和應用程式集區狀態

月臺和應用程式集區的狀態會從每個物件的 狀態 屬性報告。 列出網站或應用程式集區時,狀態會顯示在預設輸出中。 例如:

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

狀態屬性也可以用來搜尋處於特定狀態的網站或應用程式集區。 例如,若要尋找所有已啟動的應用程式集區:

%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 架構的階層式設定系統,類似于將伺服器組態儲存在架構化 XML 區段中的 ASP.NET 組態系統。 組態可以位於伺服器層級 ApplicationHost.config 檔案,或放在應用程式階層內的分散式 Web.config 組態檔中。

AppCmd 允許透過其 Config 物件,從命令列完整檢查和編輯組態階層。 此外,AppCmd 提供其他有用的功能,例如清除設定、鎖定和解除鎖定,以及搜尋它。

檢視組態

AppCmd 適用于組態區段層級的組態。 每個組態區段通常會描述伺服器功能,而且可能包含一或多個子項目和集合。

您可以針對任意 URL 命名空間設定組態,例如月臺、應用程式或 URL。 在較高層級設定的組態設定會由所有較低層級繼承,除非這些設定是在較低層級特別覆寫。

若要顯示特定 URL 層級的有效組態,請使用 Config 物件的 LIST 命令,如下所示:

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

其中 <URL> 是應該讀取有效設定的組態路徑,例如「預設網站/」或「預設網站/app1/hello.html」。 如果未指定,則預設為伺服器層級。

若要深入瞭解 IIS 組態階層,以及如何建置 IIS 組態路徑以搭配 AppCmd 和其他工具使用,請參閱 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 都會套用伺服器層級的變更。

需要 區段 參數;指出正在編輯的區段。

例如,若要為 URL 設定ASP區段 http://localhost/app1appAllowClientDebug屬性:

%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 繼承。 例如,在月臺的所有 URL 繼承的月臺根目錄 Web.config 組態檔中設定組態。

根據預設,AppCmd 會在設定的層級寫入組態。 例如,如果您要設定「預設網站/」的組態,則會將該檔案寫入該月臺根目錄的 Web.config 檔案中。

不過,您可以在較高層級寫入組態,並使用 位置 建構將它套用至下方的特定 URL 子集。 例如,應用程式 Web.config 可以包含只套用至該應用程式內單一目錄的組態。 AppCmd 透過其 認可 參數提供這項功能。

認可參數可以設定為下列其中一項:

  • (省略) — 預設值;在設定它的層級寫入組態
  • 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 Sites 為例。 根據預設,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) ,以及物件的識別碼 (「預設網站」) 。 月臺物件) 的數個常見或重要屬性通常也會輸出 (識別碼、系結和狀態。

詳細輸出

大部分的物件都支援比預設輸出中顯示更多的屬性。 若要顯示所有物件屬性,請指定 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 的輸出,例如 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 和更新版本 Command-Line 公用程式提供的所有不同強大命令,AppCmd.exe。

您也可以找到更多 AppCmd 主題,並瞭解從部落格上的命令列管理伺服器的強大方式,網址為 http://mvolo.com/category/appcmd/