次の方法で共有


WMI を使用した IIS 7.0 でのアプリケーションとアプリケーション プールの管理

作成者: Tim Ammann

はじめに

IIS 7.0 以降でのアプリケーションとアプリケーション プールの管理は、WMI スクリプトを使用して比較的簡単に実行できます。 この記事では、わずか数行の VBScript で次のエントリレベルのタスクを実行する方法について説明します。

  • アプリケーションを作成し、列挙する
  • アプリケーション プールを作成、構成、および削除する
  • アプリケーション プールを開始、停止、リサイクルする
  • アプリケーション プールの状態を表示する
  • サーバー上のすべてのアプリケーション プールを一覧表示する

最初の手順

  1. IIS とスクリプトが有効になっていることを確認します。

    • Windows Vista を使用している場合は、[コントロール パネル]、[プログラムと機能]、[Windows の機能] の順に開きます。 [Web 管理ツール] で、[IIS 管理スクリプトとツール] を選択してスクリプトを有効にします。
    • Windows Server® 2008 を使用している場合は、サーバー マネージャーを開きます。 役割の追加ウィザードを使用して、IIS 7.0 Web サーバーをインストールします。 [役割サービスの選択] ページの [管理ツール] セクションで、[IIS 管理スクリプトとツール] を選びます。
  2. 管理者としてコマンドを実行します。 コマンド プロンプト ウィンドウを管理者特権で開くには、[スタート] ボタンをクリックし、[すべてのプログラム] をポイントします。次に、[アクセサリ] をクリックし、[コマンド プロンプト] を右クリックして、[管理者として実行] をクリックします。 管理者としてコマンド シェルを開いた場合、そのコマンド シェルから実行するすべてのアプリケーションは管理者として実行されます。

  3. スクリプト ファイルを、拡張子 .vbs を付けてテキスト形式で保存します。 これらは、コマンド プロンプトで構文 "cscript.exe <scriptname>.vbs" を使用して実行できます。

  4. 開始する前に、AppCmd ツールを使用して System32\inetsrv\config\applicationhost.config ファイルのバックアップを作成します。 バックアップ コピーを使用すると、後で元のバージョンをコピーするだけで、IIS を元の状態に復元できます。 バックアップを作成するには、次の手順に従います。

a. 管理者特権のコマンド プロンプト ウィンドウを開きます。

b. 「cd %Windir%\system32\inetsrv\」と入力します

c. 「appcmd add backup backupName」と入力して、ApplicationHost.config ファイルのバックアップを作成します。ここで、backupName はバックアップに指定する名前です。 指定したバックアップ名を持つディレクトリが %Windir%\system32\inetsrv\backup ディレクトリの下に作成されます。 名前を指定しない場合、現在の日付と時刻を使用して、appcmd によってディレクトリ名が自動的に生成されます。

アプリケーションの作成と列挙

アプリケーションは、IIS の WMI スクリプトを使用して簡単に作成および列挙できます。

アプリケーションの作成

アプリケーションを作成するために、IIS は新しいアプリケーションの Create メソッドを使用します。 これは、ApplicationPath と SiteName の 2 つの必須文字列パラメーターを受け取る静的メソッドです。 ApplicationPath は新しいアプリケーションの仮想パスを定義し、SiteName にはアプリケーションが作成される Web サイトの名前が含まれます。 3 番目のパラメーター PhysicalPath は省略可能であり、ディスク上のアプリケーションのディレクトリのパスを指定します。

ApplicationPath と SiteName は重要なプロパティであり、アプリケーションを作成した後は変更できません (UI では ApplicationPath が "仮想パス" と呼ばれることに注意してください)。

次のスクリプトでは、既定の Web サイトに "NewApp" という名前の新しいアプリケーションを作成します。 アプリケーション クラス定義で 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

作成を正常に完了するには、ApplicationPath と SiteName を指定する必要があります。 PhysicalPath プロパティも指定します。 PhysicalPath パラメーターに存在しないディレクトリを指定した場合、そのディレクトリは動的には作成されません。 スクリプトは通知なしに終了し、アプリケーションの新しいノードが IIS マネージャーに実際に表示されます。 ただし、新しいアプリケーションのノードを開こうとすると、"パス <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 スクリプトを使用してアプリケーション プールで実行できる基本的で重要なタスクについて説明します。 アプリケーション プールは、1 つ以上のアプリケーションを 1 つ以上のワーカー プロセスに接続します。 アプリケーション プールはアプリケーションを互いに分離するのに役立ち、この分離によってセキュリティと信頼性が向上します。

アプリケーション プールの作成

アプリケーション プールを作成するため、IIS は ApplicationPool クラスの Create メソッドを使用します。 この静的メソッドには、2 つのパラメーターがあります。1 つ目の AppPoolName は、新しいアプリケーション プールの名前を指定する必須の文字列です。2 つ目の AutoStart は、省略可能なブール値です。

AutoStart (既定では true) は、作成したアプリケーション プールが作成後に開始され、その後 IIS 自体が起動されたときに自動的に開始されることを指定します。 AutoStart を false に設定した場合は、アプリケーション プールを手動で開始する必要があります。 ただし、自動開始を無効にすると、アプリケーション プールの開始前にアプリケーション プール内のアプリケーションに構成またはコンテンツの変更を加えたい場合に便利な場合があります。

次の例では、3 行のコードで "NewAppPool" と "OneMoreAppPool" という 2 つのアプリケーション プールを作成します。 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 スクリプトを使用してアプリケーションのアプリケーション プールを変更するのは簡単ですが、覚えておく必要がある重要な点が 2 つあります。 1 つ目は、指定したアプリケーション プールが実際に存在するかどうかは IIS によってチェックされないため、最初にアプリケーション ツール作成するということです。 2 つ目は、アプリケーション プールの割り当ての変更を保存するには、必ず Put_ メソッドを使用するということです。 Application クラスは、WMI から Put_ メソッドを継承します。

次のスクリプトは、既定の Web サイト上の "/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

Web サイトの既定のアプリケーション プールの設定

アプリケーション プールを Web サイト上のすべてのアプリケーションの既定のアプリケーション プールにする場合は、Site オブジェクトの ApplicationDefaults.ApplicationPool プロパティを使用します。 もう一度、Site オブジェクトで Put_ メソッドを使用して変更を保存します。

次のスクリプトは、既定の Web サイトの既定のアプリケーション プールを、前に作成した "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 メソッドに対応します。

アプリケーション プールの停止は、3 行のスクリプトで実行できます。 以下のスクリプトをコピーしてメモ帳に貼り付け、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 には、IIS 6.0 の IIsApplicationPool.Start メソッドに対応する ApplicationPool.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 メソッドに対応します。

アプリケーション プールのリサイクルは、前の例と同じパターンに従います。唯一の注意点は、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 クラスには、この記事では取り上げていない追加機能があります。