Configuración del modelo de proceso para un grupo de aplicaciones <processModel>

Información general

Mediante el uso del elemento <processModel>, puede configurar muchas de las características de seguridad, rendimiento, mantenimiento y fiabilidad de los grupos de aplicaciones en IIS 7 y versiones posteriores. Entre ellas, se incluyen las siguientes funciones:

  • Identidad del grupo de aplicaciones, que es el nombre del servicio o la cuenta de usuario en la que se ejecuta el proceso de trabajo del grupo de aplicaciones. Esto se define mediante el atributo identityType. De manera predeterminada, a partir de IIS 7.5, un grupo de aplicaciones se ejecuta en la cuenta integrada ApplicationPoolIdentity, que el Servicio de activación de procesos de Windows (WAS) crea dinámicamente. (En IIS 7.0, la identidad predeterminada era la cuenta de NetworkService). Puede cambiar el valor del atributo identityType a la cuenta integrada de NetworkService, la cuenta LocalService, la cuenta integrada de LocalSystem o una cuenta personalizada que cree. Si elige una cuenta personalizada, defina las credenciales de la cuenta mediante los atributos userName y password. Pero tenga en cuenta que las cuentas NetworkService, LocalService y LocalSystem tienen más derechos de usuario que la cuenta ApplicationPoolIdentity. (Advertencia: Ejecutar un grupo de aplicaciones mediante derechos de usuario de alto nivel conlleva un riesgo de seguridad grave). Además, puede usar el atributo logonType para especificar si la identidad del proceso debe iniciar sesión como un usuario o servicio por lotes. (Para obtener información adicional sobre los tipos de inicio de sesión, vea el artículo Función LogonUser).
  • Jardinería web y uso del hardware de acceso a memoria no uniforme (NUMA), que puede configurar estableciendo el atributo maxProcesses. Para el uso de la jardinería web, vea maxProcesses en un valor mayor que uno. Para el uso del hardware NUMA, establezca maxProcesses en un valor de "0" a fin de especificar que IIS ejecuta el mismo número de procesos de trabajo que nodos NUMA.
  • Configuración de tiempo de espera de inactividad, que le permite establecer cuánto tiempo permanece inactivo un proceso de trabajo antes de que se cierre. Edite el atributo idleTimeout para configurar este valor.
  • Seguimiento de estado habilitando pings en el proceso de trabajo, el tiempo máximo permitido para que un proceso de trabajo responda a un ping y la frecuencia de pings enviados a un proceso de trabajo a fin de supervisar su estado. Edite los atributos pingingEnabled, pingInterval y pingResponseTime para configurar estas opciones.
  • Límites de tiempo de inicio y cierre del proceso de trabajo. El atributo shutdownTimeLimit establece el primer límite y determina el intervalo que IIS 7 y versiones posteriores proporciona a un proceso de trabajo para finalizar todas las solicitudes antes de que el servicio WWW finalice el proceso de trabajo. El atributo startupTimeLimit establece el segundo límite y especifica la cantidad de tiempo que IIS 7 y versiones posteriores permiten a un grupo de aplicaciones para que se inicie.

Compatibilidad

Versión Notas
IIS 10.0 El elemento <processModel> no se modificó en IIS 10.0.
IIS 8.5 El atributo idleTimeoutAction se agregó habilitando un proceso de trabajo que está inactivo durante la duración del atributo idleTimeout que se va a terminar o suspender, no solo terminar.
IIS 8.0 El atributo setProfileEnvironment se agregó para permitir que el entorno se establezca en función del perfil de usuario para un nuevo proceso. Se agregaron valores para el atributo maxProcesses, incluida la compatibilidad con el acceso a memoria no uniforme (NUMA). El atributo logEventOnProcessModel se agregó para especificar que se ha registrado la acción realizada en el proceso.
IIS 7.5 El elemento <processModel> del elemento <add> se actualizó en IIS 7.5 a fin de incluir la configuración que permite ejecutar aplicaciones con el nuevo objeto ApplicationPoolIdentity y especificar el tipo de inicio de sesión para la identidad del proceso.
IIS 7.0 El elemento <processModel> se introdujo en IIS 7.0.
IIS 6,0 El elemento <processModel> reemplaza parte de la configuración del objeto de metabase IIsApplicationPools de IIS 6.0.

Configuración

La colección <applicationPools> se incluye en la instalación predeterminada de IIS 7 y versiones posteriores.

Procedimientos

Procedimientos para editar las opciones de configuración del modelo de proceso

  1. Abra el Administrador de Internet Information Services (IIS):

    • Si usa Windows Server 2012 o Windows Server 2012 R2:

      • En la barra de tareas, haga clic en Administrador del servidor, en Herramientas y, después, en Administrador de Internet Information Services (IIS).
    • Si usa Windows 8 o Windows 8.1:

      • Mantenga presionada la tecla Windows, presione la letra X y haga clic en Panel de control.
      • En Panel de control, haga clic en Herramientas administrativas y, después, haga doble clic en Administrador de Internet Information Services (IIS).
    • Si usa Windows Server 2008 o Windows Server 2008 R2:

      • En la barra de tareas, haga clic en Inicio, seleccione Herramientas administrativas y, después, haga clic en Administrador de Internet Information Services (IIS).
    • Si usa Windows Vista o Windows 7:

      • En la barra de tareas, haga clic en Inicio y, luego, haga clic en Panel de control.
      • Haga doble clic en Herramientas administrativas y, después, haga doble clic en Administrador de Internet Information Services (IIS).
  2. En el panel Conexiones, expanda el nombre del servidor, haga clic en Grupos de aplicaciones y después en el grupo de aplicaciones que quiera editar. Screenshot of the I I S Manager window displaying the Application Pools page.

  3. En el panel Acciones, haga clic en Configuración avanzada...

  4. En el cuadro de diálogo Configuración avanzada, haga clic en la propiedad del modelo de proceso que quiere editar y, después, edítela en la sección de valor de propiedad del cuadro de diálogo; luego, haga clic en Aceptar. Por ejemplo, cambie el Límite de tiempo de apagado (segundos) y los Límites de tiempo de inicio (segundos) a 30.
    Screenshot of the Advanced Settings dialog box. Process Model is highlighted.

Procedimientos a fin de configurar IIS para su uso con hardware de acceso a memoria no uniforme (NUMA)

  1. Abra el Administrador de Internet Information Services (IIS):

    • Si usa Windows Server 2012 o versiones posteriores:

      • En la barra de tareas, haga clic en Administrador del servidor, en Herramientas y, después, en Administrador de Internet Information Services (IIS).
    • Si usa Windows 8 o versiones posteriores:

      • Mantenga presionada la tecla Windows, presione la letra X y haga clic en Panel de control.
      • En Panel de control, haga clic en Herramientas administrativas y, después, haga doble clic en Administrador de Internet Information Services (IIS).
  2. En el panel Conexiones, expanda el nombre del servidor y, después, haga clic en Grupos de aplicaciones.

  3. En el panel Grupos de aplicaciones, seleccione el grupo que quiere configurar para NUMA.

  4. En el panel Acciones, seleccione Configuración avanzada.

  5. En el panel Modelo de proceso, establezca Número máximo de procesos de trabajo en 0.

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

Procedimientos para configurar la acción de tiempo de espera de inactividad

  1. Abra el Administrador de Internet Information Services (IIS):

    • Si usa Windows Server 2012 R2:

      • En la barra de tareas, haga clic en Administrador del servidor, en Herramientas y, después, en Administrador de Internet Information Services (IIS).
    • Si usa Windows 8.1:

      • Mantenga presionada la tecla Windows, presione la letra X y haga clic en Panel de control.
      • En Panel de control, haga clic en Herramientas administrativas y, después, haga doble clic en Administrador de Internet Information Services (IIS).
  2. En el panel Conexiones, haga doble clic en el nombre del servidor, haga doble clic en Grupos de aplicaciones y, después, seleccione el grupo de aplicaciones que quiere configurar.

  3. En el panel Acciones, haga clic en Configuración avanzada.

  4. En la sección Modelo de proceso del cuadro de diálogo Configuración avanzada, en idleTimeoutAction, seleccione Finalizar o Suspender.

  5. Haga clic en OK.

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

Configuración

Puede configurar el elemento <processModel> en el nivel de servidor en el archivo ApplicationHost.config.

Atributos

Atributo Descripción
identityType Atributo enum opcional.

Especifica la identidad de la cuenta en la que se ejecuta el grupo de aplicaciones.

Nota: A partir de IIS 7.5, el valor predeterminado es ApplicationPoolIdentity. (En IIS 7.0, el valor predeterminado era NetworkService).

El atributo identityType puede ser uno de los siguientes valores posibles; el valor predeterminado es NetworkService.

Valor Descripción
ApplicationPoolIdentity Especifica que el grupo de aplicaciones se ejecuta en la cuenta de identidad del grupo de aplicaciones creada dinámicamente. A partir de IIS 7.5, ApplicationPoolIdentity es la identidad predeterminada en la que se ejecutan los grupos de aplicaciones. (En IIS 7.0, la identidad predeterminada era NetworkService).

Cuando un grupo de aplicaciones se ejecuta en la cuenta de ApplicationPoolIdentity, el grupo de aplicaciones accede a los recursos como la identidad "IIS AppPool<AppPool>". Por ejemplo, para "DefaultAppPool", la identidad es "IIS AppPool\DefaultAppPool". Esta identidad permite a los administradores especificar permisos que pertenecen solo a la identidad en la que se ejecuta el grupo de aplicaciones, lo que aumenta la seguridad del servidor.

El valor numérico es 4.
LocalService Especifica que el grupo de aplicaciones se ejecuta en la cuenta LocalService integrada, que tiene los mismos derechos de usuario que NetworkService.

Cuando un grupo de aplicaciones se ejecuta en la cuenta LocalService, el grupo de aplicaciones presenta credenciales anónimas en la red.

Nota: La ejecución de un grupo de aplicaciones en una cuenta que tenga derechos de usuario de alto nivel conlleva un riesgo de seguridad grave.

El valor numérico es 1.
LocalSystem Especifica que el grupo de aplicaciones se ejecuta en la cuenta LocalSystem integrada, que tiene amplios privilegios en el equipo local y actúa como el equipo de la red.

Nota: La ejecución de un grupo de aplicaciones en una cuenta que tenga derechos de usuario de alto nivel conlleva un riesgo de seguridad grave.

El valor numérico es 0.
NetworkService Especifica que el grupo de aplicaciones se ejecuta en la cuenta de NetworkService integrada. En IIS 7.0, esta era la identidad predeterminada en la que se ejecutaban los grupos de aplicaciones; en IIS 7.5, el valor predeterminado se cambió a ApplicationPoolIdentity.

Cuando un grupo de aplicaciones se ejecuta en la cuenta de NetworkService, el grupo de aplicaciones accede a los recursos de red como la cuenta de equipo.

El valor numérico es 2.
SpecificUser Especifica que el grupo de aplicaciones se ejecuta en una identidad personalizada, que se configura mediante los atributos userName y password.

Nota: Para evitar almacenar cadenas de contraseña sin cifrar en archivos de configuración, use siempre AppCmd.exe o el Administrador de IIS para escribir contraseñas. Si usa estas herramientas de administración, las cadenas de contraseña se cifrarán automáticamente antes de que se escriban en los archivos de configuración XML. Esto proporciona una mejor seguridad de contraseña que almacenar contraseñas sin cifrar.

Nota: Las cuentas de servicio administradas se pueden usar para permitir que los servicios y las tareas compartan sus propias cuentas de dominio y para habilitar la administración automática de contraseñas, lo que elimina la necesidad de que un administrador gestione manualmente las contraseñas. Para obtener más información, vea Novedades de las cuentas de servicio administradas.

El valor numérico es 3.
idleTimeout Atributo timeSpan opcional.

Especifica cuánto tiempo (en minutos) debe ejecutarse inactivo un proceso de trabajo si no se reciben nuevas solicitudes y el proceso de trabajo no procesa las solicitudes. Una vez transcurrido el tiempo asignado, el proceso de trabajo debe solicitar que el servicio WWW lo cierre.

El valor predeterminado es 00:20:00.

Para deshabilitar la característica de tiempo de espera de inactividad, establezca este valor en 00:00:00.
idleTimeoutAction Atributo enum opcional.

Especifica la acción que se va a realizar cuando se ha alcanzado la duración del tiempo de espera de inactividad. Antes de IIS 8.5, se habría finalizado un proceso de trabajo que estuviera inactivo durante el atributo idleTimeout. Después de IIS 8.5, tiene la opción de terminar un proceso de trabajo que alcance el límite idleTimeout o bien suspenderlo moviéndolo de la memoria al disco. Suspender un proceso probablemente tardará menos tiempo y consumirá menos memoria que terminarlo.

Puede configurar una acción de tiempo de espera de inactividad de suspensión con la solicitud falsa de inicialización de la aplicación (vea applicationInitialization).

El atributo idleTimeoutAction puede tener los siguientes valores posibles. El valor predeterminado es Terminate.
Valor Descripción
Terminate Finaliza un proceso de trabajo inactivo. Esto requiere un periodo de inicio más largo cuando un usuario accede posteriormente al sitio y se inicia el proceso de trabajo.

El valor numérico es 0.
Suspend Suspende un proceso de trabajo inactivo. Esto deja activo el proceso de trabajo, pero se mueve de la memoria al disco, lo que reduce los recursos del sistema consumidos. Cuando se produce posteriormente una solicitud, el administrador de memoria carga los archivos de página necesarios para la solicitud de disco a memoria, lo que probablemente hace que el proceso de trabajo esté disponible más rápidamente que si se hubiera terminado anteriormente.

El valor numérico es 1.
loadUserProfile Atributo Boolean opcional.

Especifica si IIS carga el perfil de usuario para la identidad del grupo de aplicaciones. Establecer este valor en false hace que IIS se revierta al comportamiento de IIS 6.0. IIS 6.0 no carga el perfil de usuario para una identidad del grupo de aplicaciones.

El valor predeterminado es false.
logEventOnProcessModel Atributo flags opcional.

Especifica qué acción realizada en el proceso se registra en el Visor de eventos. En IIS 8.0, la única acción que se aplica es la de tiempo de espera de inactividad, en la que se termina el proceso porque estaba inactivo durante el periodo idleTimeout.

El nombre de la marca es igual a IdleTimeout. El valor es 1.

El valor predeterminado es IdleTimeout.
logonType Atributo enum opcional.

Especifica el tipo de inicio de sesión para la identidad del proceso. (Para obtener información adicional sobre los tipos de inicio de sesión, vea el artículo Función LogonUser).

Nota: Este atributo se introdujo en IIS 7.5.

El atributo logonType puede ser uno de los siguientes valores posibles; el valor predeterminado es LogonBatch.
Valor Descripción
LogonBatch Especifica que la identidad del grupo de aplicaciones debe iniciar sesión como usuario por lotes.

El valor numérico es 0.
LogonService Especifica que la identidad del grupo de aplicaciones debe iniciar sesión como servicio.

El valor numérico es 1.
manualGroupMembership Atributo Boolean opcional.

Especifica si el identificador de seguridad (SID) del grupo IIS_IUSRS se ha agregado al token de proceso de trabajo. Cuando es false, IIS usa automáticamente una identidad del grupo de aplicaciones como si fuera miembro del grupo de IIS_IUSRS integrado, que tiene acceso a los recursos necesarios del sistema y los archivos. Cuando es true, se debe agregar explícitamente una identidad del grupo de aplicaciones a todos los recursos que requiere un proceso de trabajo en runtime.

El valor predeterminado es false.
maxProcesses Atributo uint opcional.

Indica el número máximo de procesos de trabajo que se usarían para el grupo de aplicaciones.
  • Un valor de "1" indica un máximo de un único proceso de trabajo para el grupo de aplicaciones. Esta sería la configuración en un servidor que no tiene nodos NUMA.
  • Un valor de "2" o más indica un jardín web que usa varios procesos de trabajo para un grupo de aplicaciones (en caso necesario).
  • Un valor de "0" especifica que IIS ejecuta el mismo número de procesos de trabajo que nodos de acceso a memoria no uniforme (NUMA). IIS identifica el número de nodos NUMA que están disponibles en el hardware e inicia el mismo número de procesos de trabajo. Por ejemplo, si tiene cuatro nodos NUMA, usará un máximo de cuatro procesos de trabajo para ese grupo de aplicaciones. En este ejemplo, establecer maxProcesses en un valor de "0" o "4" tendría el mismo resultado.
El valor predeterminado es 1.
password Atributo de cadena opcional.

Especifica la contraseña asociada al atributo userName. Este atributo solo es necesario cuando el valor de identityType es SpecificUser.

Nota: Para evitar almacenar cadenas de contraseña sin cifrar en archivos de configuración, use siempre AppCmd.exe o administrador de IIS a fin de escribir contraseñas. Si usa estas herramientas de administración, las cadenas de contraseña se cifrarán automáticamente antes de que se escriban en los archivos de configuración XML. Esto proporciona una mejor seguridad de contraseña que almacenar contraseñas sin cifrar.
pingingEnabled Atributo Boolean opcional.

Especifica si el ping está habilitado para el proceso de trabajo.

El valor predeterminado es true.
pingInterval Atributo timeSpan opcional.

Especifica el tiempo entre pings de supervisión de estado que el servicio WWW envía a un proceso de trabajo.

El valor predeterminado es 00:00:30 (30 segundos).
pingResponseTime Atributo timeSpan opcional.

Especifica el tiempo que se le da a un proceso de trabajo para responder a un ping de supervisión de estado. Una vez superado el límite de tiempo, el servicio WWW finaliza el proceso de trabajo.

El valor predeterminado es 00:01:30 (1 minuto y 30 segundos).
requestQueueDelegatorIdentity Atributo String opcional.

Especifica la identidad de la cuenta que tiene permiso para delegar solicitudes HTTP al grupo de aplicaciones.

Nota: Este atributo no está disponible en la interfaz de usuario del Administrador de Internet Information Services (IIS).
setProfileEnvironment Atributo Boolean opcional.

Cuando setProfileEnvironment se establece en True, WAS crea un bloque de entorno para pasarlo a CreateProcessAsUser al crear un proceso de trabajo. Esto garantiza que el entorno se establezca en función del perfil de usuario para el nuevo proceso.

El valor predeterminado es True.
shutdownTimeLimit Atributo timeSpan opcional.

Especifica el tiempo que el servicio W3SVC espera después de iniciar un reciclaje. Si el proceso de trabajo no se cierra en el límite shutdownTimeLimit, el servicio W3SVC lo finalizará.

El valor predeterminado es 00:01:30 (1 minuto y 30 segundos).
startupTimeLimit Atributo timeSpan opcional.

Especifica el tiempo que IIS espera a que se inicie un grupo de aplicaciones. Si el grupo de aplicaciones no se inicia en el límite startupTimeLimit, se finaliza el proceso de trabajo y se incrementa el recuento de protección rápida contra errores.

El valor predeterminado es 00:01:30 (1 minuto y 30 segundos).
userName Atributo de cadena opcional.

Especifica la identidad en la que se ejecuta el grupo de aplicaciones cuando identityType es SpecificUser.

Elementos secundarios

Ninguno.

Ejemplo de configuración

En el ejemplo de configuración siguiente se usa el elemento <add> del grupo de aplicaciones para crear un grupo de aplicaciones denominado Contoso. El elemento <recycling> configura el registro para los reinicios del grupo de aplicaciones, el elemento <periodicRestart> configura cuándo se reinicia el grupo de aplicaciones y el elemento <processModel> configura los atributos shutdownTimeLimit y startupTimeLimit para apagar e iniciar los procesos de trabajo en el grupo de aplicaciones durante 30 segundos cada uno. Si se superan estos límites de tiempo, IIS finaliza el proceso de trabajo.

<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>

Código de ejemplo

En los ejemplos siguientes se cambian los valores de la propiedad processModel.shutdownTimeLimit y processModule.startupTimeLimit a 30 segundos cada uno para un grupo de aplicaciones denominado Contoso.

AppCmd.exe

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

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

También puede usar la sintaxis siguiente:

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

Nota:

Debe asegurarse de establecer el parámetrocommit en apphost cuando use AppCmd.exe para configurar estos valores. Esto confirma los valores de configuración en la sección de ubicación adecuada del archivo 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