アプリケーション プールのプロセス モデルの設定 <processModel>

概要

<processModel> 要素を使用すると、IIS 7 以降でのアプリケーション プールのセキュリティ、パフォーマンス、正常性、信頼性の機能の多くを構成できます。 これらには、次のものが含まれます。

  • アプリケーション プール ID。これは、アプリケーション プールのワーカー プロセスが実行されるサービスまたはユーザー アカウントの名前です。 これは identityType 属性で定義されます。 既定では、IIS 7.5 以降より、アプリケーション プールは、Windows プロセス アクティブ化サービス (WAS) によって動的に作成される組み込みの ApplicationPoolIdentity アカウントで実行されます。 (IIS 7.0 では、既定の ID は NetworkService アカウントでした)。identityType 属性値は、組み込みの NetworkService アカウント、LocalService アカウント、組み込みの LocalSystem アカウント、または作成したカスタム アカウントに変更できます。 カスタム アカウントを選択する場合は、userName および password 属性を使用してアカウント資格情報を定義します。 ただし、NetworkServiceLocalServiceLocalSystem アカウントには、 ApplicationPoolIdentity アカウントよりも高いユーザー権限があることに注意してください。 (警告: 高レベルのユーザー権限を使用してアプリケーション プールを実行することは重大なセキュリティ リスクとなります。)さらに、logonType 属性を使用して、プロセス ID がバッチ ユーザーまたはサービスとしてログオンする必要があるかどうかを指定できます。 (ログオンの種類の詳細については、LogonUser 関数に関する記事を参照してください)。
  • Web ガーデニングと Non-Uniform Memory Access (NUMA) ハードウェアの使用。これは maxProcesses 属性を設定して構成できます。 Web ガーデニングについては、maxProcesses を 1 より大きい値に設定します。 NUMA ハードウェアの使用については、maxProcesses を値 "0" に設定して、IIS では NUMA ノードにあるのと同じ数のワーカー プロセスを実行するように指定します。
  • アイドル タイムアウト設定。ワーカー プロセスがシャットダウンするまでアイドル状態を維持する期間を設定できます。 この設定を構成するには、idleTimeout 属性を編集します。
  • ワーカー プロセスに対する ping の有効化による正常性を監視、ワーカー プロセスが ping に応答できる最大時間、正常性を監視するためにワーカー プロセスに送信される ping の頻度。 これらの設定を構成するには、pingingEnabledpingIntervalpingResponseTime 属性を編集します。
  • ワーカー プロセスのシャットダウンと起動時間の制限。 最初の制限は shutdownTimeLimit 属性によって設定され、WWW サービスがワーカー プロセスを終了する前に、ワーカー プロセスがすべての要求を完了するために IIS 7 以降によって与えられる間隔が決定されます。 2 番目の制限は startupTimeLimit 属性によって設定され、IIS 7 以降でアプリケーション プールを起動できる時間を指定します。

互換性

バージョン メモ
IIS 10.0 <processModel> 要素は、IIS 10.0 では変更されませんでした。
IIS 8.5 idleTimeoutAction 属性が追加され、idleTimeout 属性の期間中アイドル状態のワーカー プロセスが、ただ終了したというわけではなく、終了または中断のいずれかの状態になります。
IIS 8.0 setProfileEnvironment 属性が追加され、新しいプロセスに対するユーザー プロファイルに基づいて環境を設定できるようになりました。 Non-Uniform Memory Access (NUMA) のサポートを含む、 maxProcesses 属性の値が追加されました。 プロセスで実行されたアクションがログに記録されるように指定するために、logEventOnProcessModel 属性が追加されました。
IIS 7.5 <add> 要素の <processModel> 要素が IIS 7.5 で更新され、新しい ApplicationPoolIdentity を使用してアプリケーションを実行し、プロセス ID のログインの種類を指定できる設定が含まれました。
IIS 7.0 <processModel> 要素が IIS 7.0 で導入されました。
IIS 6.0 <processModel> 要素は、IIS 6.0 IIsApplicationPools メタベース オブジェクトの一部の設定を置き換えます。

段取り

<applicationPools> コレクションは、IIS 7 以降の既定のインストールに含まれています。

操作方法

プロセス モデルの構成設定を編集する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 または Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8 または Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
    • Windows Server 2008 または Windows Server 2008 R2 を使用している場合:

      • タスク バーで、[スタート] ボタンをクリックし、[管理ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows Vista または Windows 7 を使用している場合:

      • タスク バーで、[スタート][コントロール パネル] の順にクリックします。
      • [管理ツール] をダブルクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウで、サーバー名を展開し、[アプリケーション プール] をクリックし、編集するアプリケーション プールをクリックします。 Screenshot of the I I S Manager window displaying the Application Pools page.

  3. [操作] ウィンドウの [詳細設定...] をクリックします。

  4. [詳細設定] ダイアログ ボックスで、編集するプロセス モデル プロパティをクリックし、ダイアログ ボックスのプロパティ値セクションでこれを編集して [OK] をクリックします。 たとえば、[Shutdown Time Limit (seconds)] (シャットダウン時間制限 (秒))[Startup Time Limits (seconds)] (スタートアップ時間制限 (秒))30 に変更します。
    Screenshot of the Advanced Settings dialog box. Process Model is highlighted.

Non-Uniform Memory Access (NUMA) ハードウェアで使用するように IIS を構成する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 以降を使っている場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8 以降を使っている場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウでサーバー名を展開し、[アプリケーション プール] をクリックします。

  3. [アプリケーション プール] ウィンドウで、NUMA 用に構成するプールを選択します。

  4. [アクション] ウィンドウで、[詳細設定] を選びます。

  5. [プロセス モデル] ウィンドウで、[最大ワーカー プロセス数]0 に設定します。

    Screenshot of the Advanced Settings pane. Maximum Worker Processes is highlighted in the list.

アイドル タイムアウト アクションを構成する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウで、サーバー名をダブルクリックし、[アプリケーション プール] をダブルクリックし、構成するアプリケーション プールを選びます。

  3. [操作] ウィンドウの [詳細設定] をクリックします。

  4. [詳細設定] ダイアログボックスの [プロセス モデル] セクションで、[idleTimeoutAction] として [Terminate] (終了) または [Suspend] (中断) を選択します。

  5. OK をクリックします。

    Screenshot of the Advanced Settings dialog box. Idle Time out-Action is highlighted and Terminate is selected in the drop down menu.

構成

<processModel> 要素は、ApplicationHost.config ファイルにサーバー レベルで構成します。

属性

属性 説明
identityType 省略可能な列挙型属性。

アプリケーション プールを実行するアカウント ID を指定します。

注: IIS 7.5 以降では、既定値は ApplicationPoolIdentity です。 (IIS 7.0 では、既定値は NetworkService でした。)

identityType 属性には、次の使用可能な値の 1 つを指定できます。既定値は NetworkService です。

Value 説明
ApplicationPoolIdentity 動的に作成されたアプリケーション プール ID アカウントでアプリケーション プールを実行することを指定します。 IIS 7.5 以降では、アプリケーション プールを実行するための既定の ID は ApplicationPoolIdentity です。 (IIS 7.0 では、既定の ID は NetworkService でした。)

アプリケーション プールが ApplicationPoolIdentity アカウントで実行されている場合、アプリケーション プールはリソースに "IIS AppPool<AppPool>" ID としてアクセスします。 たとえば、"DefaultAppPool" の場合、ID は "IIS AppPool\DefaultAppPool" です。 この ID を使用すると、管理者はアプリケーション プールを実行している ID にのみ関連するアクセス許可を指定できるため、サーバーのセキュリティが強化されます。

数値は 4 です。
LocalService NetworkService と同じユーザー権限を持つ、組み込みの LocalService アカウントでアプリケーション プールを実行することを指定します。

アプリケーション プールが LocalService アカウントで実行されている場合、アプリケーション プールからネットワーク上に匿名資格情報が提示されます。

注: 高レベルのユーザー権限を持つアカウントでアプリケーション プールを実行することは重大なセキュリティ リスクとなります。

数値は 1 です。
LocalSystem ローカル コンピューターに対する広範な特権を持ち、ネットワーク上のコンピューターとして機能する、組み込みの LocalSystem アカウントでアプリケーション プールを実行することを指定します。

注: 高レベルのユーザー権限を持つアカウントでアプリケーション プールを実行することは重大なセキュリティ リスクとなります。

数値は 0 です。
NetworkService 組み込みの NetworkService アカウントでアプリケーション プールを実行することを指定します。 IIS 7.0 では、これがアプリケーション プールを実行するための既定の ID でした。IIS 7.5 では、既定値は ApplicationPoolIdentity に変更されました。

アプリケーション プールが NetworkService アカウントで実行されている場合、アプリケーション プールはネットワーク リソースにコンピューター アカウントとしてアクセスします。

数値は 2 です。
SpecificUser userNamepassword 属性を使用して構成されるカスタム ID でアプリケーション プールを実行することを指定します。

注: 暗号化されていないパスワード文字列の構成ファイルへの格納を防止するため、パスワードの入力には常に AppCmd.exe または IIS マネージャーを使用してください。 これらの管理ツールを使用する場合、パスワード文字列は XML 構成ファイルに書き込まれる前に自動的に暗号化されます。 これにより、暗号化されていないパスワードを格納するよりも、パスワードのセキュリティが向上します。

注: マネージド サービス アカウントを使用すると、サービスとタスクで独自のドメイン アカウントを共有したり、パスワードの自動管理を有効にしたりできるため、管理者がパスワードを手動で管理する必要がなくなります。 詳細については、「管理されたサービス アカウントの新機能」を参照してください。

数値は 3 です。
idleTimeout 省略可能な timeSpan 属性。

新しい要求が受信されず、ワーカー プロセスが要求を処理していない場合に、ワーカー プロセスをアイドル状態で実行する時間 (分単位) を指定します。 割り当てられた時間が経過すると、ワーカー プロセスでは WWW サービスによるシャットダウンを要求する必要があります。

既定値は 00:20:00 です。

アイドル タイムアウト機能を無効にするには、この値を 00:00:00 に設定します。
idleTimeoutAction 省略可能な列挙型属性。

アイドル タイムアウト期間に達したときに実行するアクションを指定します。 IIS 8.5 より前では、idleTimeout 属性の期間中アイドル状態だったワーカー プロセスは終了します。 IIS 8.5 以降では、idleTimeout の制限に達したワーカー プロセスを終了するか、メモリからディスクに移動して中断するかの選択が可能です。 プロセスを中断する方が、終了するよりも時間がかからず、メモリ消費が少なくなる可能性があります。

アプリケーション初期化の偽の要求を使用して、中断のアイドル タイムアウト アクションを構成できます (applicationInitializationを参照してください。

idleTimeoutAction 属性には次の値を指定できます。 既定値は Terminate です。
Value 説明
Terminate アイドル状態のワーカー プロセスを終了します。 その後、ユーザーがサイトにアクセスしてワーカー プロセスを開始するときに、長い起動期間が必要です。

数値は 0 です。
Suspend アイドル状態のワーカー プロセスを中断します。 これにより、ワーカー プロセスは有効なままになりますが、メモリからディスクに移動され、消費されるシステム リソースが削減されます。 その後、要求が入ると、メモリ マネージャーでは要求に必要なページ ファイルをディスクからメモリに読み込むため、ワーカー プロセスはおそらく、以前終了していた場合よりも迅速に使用できるようになります。

数値は 1 です。
loadUserProfile 省略可能な Boolean 属性です。

IIS でアプリケーション プール ID のユーザー プロファイルを読み込むかどうかを指定します。 この値を false に設定すると、IIS は IIS 6.0 の動作に戻ります。 IIS 6.0 では、アプリケーション プール ID のユーザー プロファイルは読み込まれません。

既定値は false です。
logEventOnProcessModel 省略可能なフラグ属性。

イベント ビューアーに記録される、プロセス中に実行されたアクションを指定します。 IIS 8.0 では、該当するアクションはアイドル タイムアウト アクションのみです。このアクションでは、プロセスが idleTimeout 期間アイドル状態であったためにプロセスが終了します。

フラグ名は IdleTimeout と等しくなります。 値は 1 です。

既定値は IdleTimeout です。
logonType 省略可能な列挙型属性。

プロセス ID のログオンの種類を指定します。 (ログオンの種類の詳細については、LogonUser 関数に関する記事を参照してください)。

注: この属性は IIS 7.5 で導入されました。

logonType 属性には、次のいずれかの値を指定できます。既定値は LogonBatch です。
Value 説明
LogonBatch アプリケーション プール ID がバッチ ユーザーとしてログオンする必要があることを指定します。

数値は 0 です。
LogonService アプリケーション プール ID がサービスとしてログオンする必要があることを指定します。

数値は 1 です。
manualGroupMembership 省略可能な Boolean 属性です。

IIS_IUSRS グループのセキュリティ識別子 (SID) をワーカー プロセス トークンに追加するかどうかを指定します。 false の場合、IIS ではアプリケーション プール ID が、必要なファイルとシステム リソースにアクセスできる組み込みの IIS_IUSRS グループのメンバーである場合と同様に、アプリケーション プール ID を自動的に使用します。 true の場合、ワーカー プロセスの実行時に必要となるすべてのリソースにアプリケーション プール ID を明示的に追加する必要があります。

既定値は false です。
maxProcesses 省略可能な uint 属性。

アプリケーション プールに使用されるワーカー プロセスの最大数を示します。
  • 値 "1" は、アプリケーション プールに対して最大 1 つのワーカー プロセスであることを示します。 これは、NUMA ノードを持たないサーバー上の設定です。
  • 値が "2" 以上の場合は、あるアプリケーション プールに複数のワーカー プロセスを使用する Web ガーデンを示します (必要な場合)。
  • 値 "0" は、IIS では Non-Uniform Memory Access (NUMA) ノードと同じ数のワーカー プロセスが実行されることを指定します。 IIS によって、ハードウェアで使用可能な NUMA ノードの数が識別され、同じ数のワーカー プロセスが開始されます。 たとえば、4 つの NUMA ノードがある場合、そのアプリケーション プールには最大 4 つのワーカー プロセスが使用されます。 この例では、maxProcesses を "0" または "4" の値に設定すると、同じ結果になります。
既定値は 1 です。
password 省略可能な文字列属性。

userName 属性に関連付けられているパスワードを指定します。 この属性は、identityType の値が SpecificUser の場合にのみ必要です。

注: 暗号化されていないパスワード文字列の構成ファイルへの格納を防止するため、パスワードの入力には常に AppCmd.exe または IIS マネージャーを使用してください。 これらの管理ツールを使用する場合、パスワード文字列は XML 構成ファイルに書き込まれる前に自動的に暗号化されます。 これにより、暗号化されていないパスワードを格納するよりも、パスワードのセキュリティが向上します。
pingingEnabled 省略可能な Boolean 属性です。

ワーカー プロセスに対して ping を有効にするかどうかを指定します。

既定値は true です。
pingInterval 省略可能な timeSpan 属性。

WWW サービスからワーカー プロセスに送信される正常性の監視用の ping の間隔を指定します。

既定値は 00:00:30 (30 秒) です。
pingResponseTime 省略可能な timeSpan 属性。

正常性の監視用の ping に応答するためにワーカー プロセスに与えられる時間を指定します。 制限時間を超えると、WWW サービスはワーカー プロセスを終了します。

既定値は 00:01:30 (1 分 30 秒) です。
requestQueueDelegatorIdentity 省略可能で、 String 型の属性。

HTTP 要求をアプリケーション プールに委任するアクセス許可を持つアカウント ID を指定します。

注: この属性は、インターネット インフォメーション サービス (IIS) マネージャー UI では使用できません。
setProfileEnvironment 省略可能な Boolean 属性です。

setProfileEnvironment が True に設定されている場合、WAS ではワーカー プロセスの作成時に CreateProcessAsUser に渡す環境ブロックが作成されます。 これにより、新しいプロセスのユーザー プロファイルに基づいて環境が設定されます。

既定値は True です。
shutdownTimeLimit 省略可能な timeSpan 属性。

W3SVC サービスで、リサイクルが開始された後のサービスの待機時間を指定します。 ワーカー プロセスが shutdownTimeLimit 以内にシャットダウンしない場合、W3SVC サービスによって終了されます。

既定値は 00:01:30 (1 分 30 秒) です。
startupTimeLimit 省略可能な timeSpan 属性。

IIS でアプリケーション プールの起動を待機する時間を指定します。 アプリケーション プールが startupTimeLimit 以内に起動しない場合は、ワーカー プロセスは終了し、ラピッド フェール保護カウントがインクリメントされます。

既定値は 00:01:30 (1 分 30 秒) です。
userName 省略可能な文字列属性。

identityTypeSpecificUser の場合にアプリケーション プールを実行する ID を指定します。

子要素

なし。

構成サンプル

次の構成サンプルでは、アプリケーション プールの <add> 要素を使用して、Contoso という名前の新しいアプリケーション プールを作成します。 <recycling> 要素は、アプリケーション プールの再起動のログ記録を構成し、<periodicRestart> 要素はアプリケーション プールがいつ再起動するかを構成し、<processModel> 要素はアプリケーション プール内のワーカー プロセスのシャットダウンと開始の shutdownTimeLimit 属性と startupTimeLimit 属性をそれぞれ 30 秒間に構成します。 これらの制限時間を超えると、IIS はワーカー プロセスを終了します。

<add name="Contoso">
   <recycling logEventOnRecycle="Schedule">
      <periodicRestart>
         <schedule>
            <clear />
            <add value="03:00:00" />
         </schedule>
      </periodicRestart>
   </recycling>
   <processModel identityType="NetworkService" shutdownTimeLimit="00:00:30" startupTimeLimit="00:00:30" />
</add>

サンプル コード

次の例では、 Contoso という名前のアプリケーション プールに対して processModel.shutdownTimeLimitprocessModule.startupTimeLimit のプロパティ値をそれぞれ 30 秒に変更します。

AppCmd.exe

appcmd.exe set apppool "Contoso" /processModel.shutdownTimeLimit:00:00:30

appcmd.exe set apppool "Contoso" /processModel.startupTimeLimit:00:00:30

次の構文も使用できます。

appcmd.exe set config -section:system.applicationHost/applicationPools /[name='Contoso'].processModel.shutdownTimeLimit:"00:00:30" /commit:apphost

appcmd.exe set config -section:system.applicationHost/applicationPools /[name='Contoso'].processModel.startupTimeLimit:"00:00:30" /commit:apphost

Note

AppCmd.exe を使用してこれらの設定を構成する場合は、commit パラメーターを必ず apphost に設定する必要があります。 これにより、ApplicationHost.config ファイルの適切な場所セクションに構成設定がコミットされます。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection applicationPoolsSection = config.GetSection("system.applicationHost/applicationPools");
         ConfigurationElementCollection applicationPoolsCollection = applicationPoolsSection.GetCollection();

         ConfigurationElement addElement = FindElement(applicationPoolsCollection, "add", "name", @"Contoso");
         if (addElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElement processModelElement = addElement.GetChildElement("processModel");
         processModelElement["shutdownTimeLimit"] = TimeSpan.Parse("00:00:30");
         processModelElement["startupTimeLimit"] = TimeSpan.Parse("00:00:30");

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim applicationPoolsSection As ConfigurationSection = config.GetSection("system.applicationHost/applicationPools")
      Dim applicationPoolsCollection As ConfigurationElementCollection = applicationPoolsSection.GetCollection
      Dim addElement As ConfigurationElement = FindElement(applicationPoolsCollection, "add", "name", "Contoso")

      If (addElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim processModelElement As ConfigurationElement = addElement.GetChildElement("processModel")
      processModelElement("shutdownTimeLimit") = TimeSpan.Parse("00:00:30")
      processModelElement("startupTimeLimit") = TimeSpan.Parse("00:00:30")
      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST");
var applicationPoolsCollection = applicationPoolsSection.Collection;

var addElementPos = FindElement(applicationPoolsCollection, "add", ["name", "Contoso"]);
if (addElementPos == -1) throw "Element not found!";

var addElement = applicationPoolsCollection.Item(addElementPos);
var processModelElement = addElement.ChildElements.Item("processModel");
processModelElement.Properties.Item("shutdownTimeLimit").Value = "00:00:30";
processModelElement.Properties.Item("startupTimeLimit").Value = "00:00:30";

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST")
Set applicationPoolsCollection = applicationPoolsSection.Collection

addElementPos = FindElement(applicationPoolsCollection, "add", Array("name", "Contoso"))
If siteElementPos = -1 Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set addElement = applicationPoolsCollection.Item(addElementPos)
Set processModelElement = addElement.ChildElements.Item("processModel")
processModelElement.Properties.Item("shutdownTimeLimit").Value = "00:00:30"
processModelElement.Properties.Item("startupTimeLimit").Value = "00:00:30"

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function