Configurações de modelo de processo para um pool de aplicativos <processModel>

Visão geral

Usando o elemento <processModel>, você pode configurar muitos dos recursos de segurança, desempenho, integridade e confiabilidade dos pools de aplicativos no IIS 7 e posteriores. Isso inclui os seguintes recursos:

  • Identidade do pool de aplicativos, que é o nome do serviço ou da conta de usuário na qual o processo de trabalho do pool de aplicativos é executado. Isso é definido pelo atributo identityType. Por padrão, a partir do IIS 7.5, um pool de aplicativos é executado na conta interna ApplicationPoolIdentity, que é criada dinamicamente pelo WAS (Serviço de Ativação de Processos do Windows). (No IIS 7.0, a identidade padrão era a conta NetworkService.) Você pode alterar o valor do atributo identityType para a conta interna NetworkService, a conta LocalService, a conta interna LocalSystem ou uma conta personalizada que você criar. Se você escolher uma conta personalizada, defina as credenciais da conta usando os atributos userName e password. No entanto, lembre-se de que as contas NetworkService, LocalService e LocalSystem têm mais direitos de usuário do que a conta ApplicationPoolIdentity. (Aviso: é um sério risco de segurança executar um pool de aplicativos usando direitos de usuário de alto nível.) Além disso, você pode usar o atributo logonType para especificar se a identidade do processo deve fazer logon como um usuário ou serviço em lote. (Para obter informações adicionais sobre tipos de logon, consulte o artigo Função LogonUser.)
  • A jardinagem da Web e uso do hardware NUMA (acesso não uniforme à memória), que você pode configurar definindo o atributo maxProcesses. Para jardinagem da Web, consulte maxProcesses para um valor maior que um. Para usar o hardware NUMA, defina maxProcesses como um valor de "0" para especificar que o IIS executa o mesmo número de processos de trabalho que há nós do NUMA.
  • Configurações de tempo limite ocioso, que permitem definir por quanto tempo um processo de trabalho permanece ocioso antes de ser desligado. Edite o atributo idleTimeout para configurar essa definição.
  • Monitoramento de integridade habilitando pings no processo de trabalho, o tempo máximo permitido para um processo de trabalho responder a um ping e a frequência de pings enviados a um processo de trabalho para monitorar sua integridade. Edite os atributos pingingEnabled, pingInterval e pingResponseTime para definir essas definições.
  • Limites de tempo de inicialização e desligamento do processo de trabalho. O primeiro limite é definido pelo atributo shutdownTimeLimit e determina o intervalo que o IIS 7 e posteriores fornece a um processo de trabalho para concluir todas as solicitações antes que o serviço WWW encerre o processo de trabalho. O segundo limite é definido pelo atributo startupTimeLimit e especifica a quantidade de tempo que o IIS 7 e posteriores permitem que um pool de aplicativos seja iniciado.

Compatibilidade

Versão Observações
IIS 10.0 O elemento <processModel> não foi modificado no IIS 10.0.
IIS 8.5 O atributo idleTimeoutAction foi adicionado habilitando um processo de trabalho que está ocioso pela duração do atributo idleTimeout a ser encerrado ou suspenso, não apenas encerrado.
IIS 8.0 O atributo setProfileEnvironment foi adicionado permitindo que o ambiente fosse definido com base no perfil do usuário para um novo processo. Foram adicionados valores para o atributo maxProcesses, incluindo suporte para NUMA (acesso não uniforme à memória). O atributo logEventOnProcessModel foi adicionado para especificar que a ação executada no processo é registrada em log.
IIS 7.5 O elemento <processModel> do elemento <add> foi atualizado no IIS 7.5 para incluir configurações que permitem executar aplicativos usando a nova ApplicationPoolIdentity e especificar o tipo de logon para a identidade de processo.
IIS 7.0 O elemento <processModel> foi introduzido no IIS 7.0.
IIS 6,0 O elemento <processModel> substitui algumas das configurações no objeto metabase IIsApplicationPools do IIS 6.0.

Instalação

A coleção <applicationPools> está incluída na instalação padrão do IIS 7 e posteriores.

Instruções

Como editar as configurações do modelo de processo

  1. Abra o Gerenciador dos Serviços de Informações da Internet (IIS):

    • Caso você esteja usando o Windows Server 2012 ou o Windows Server 2012 R2:

      • Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows 8 ou Windows 8.1:

      • Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
      • Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Caso você esteja usando o Windows Server 2008 ou o Windows Server 2008 R2:

      • Na barra de tarefas, clique em Iniciar, vá para Ferramentas Administrativas e clique em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows Vista ou Windows 7:

      • Na barra de tarefas, clique em Iniciar e, depois, em Painel de Controle.
      • Clique duas vezes em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
  2. No painel Conexões, expanda o nome do servidor e clique em Pools de Aplicativos e no pool de aplicativos que deseja editar. Screenshot of the I I S Manager window displaying the Application Pools page.

  3. No painel Ações, clique em Configurações Avançadas...

  4. Na caixa de diálogo Configurações Avançadas, clique na propriedade do modelo de processo que deseja editar, edite-a na seção de valor da propriedade da caixa de diálogo e clique em OK. Por exemplo, altere o limite de tempo de desligamento (segundos) e os limites de tempo de inicialização (segundos) para 30.
    Screenshot of the Advanced Settings dialog box. Process Model is highlighted.

Como configurar o IIS para uso com o hardware NUMA (acesso não uniforme à memória)

  1. Abra o Gerenciador dos Serviços de Informações da Internet (IIS):

    • Se você estiver usando o Windows Server 2012 ou posterior:

      • Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows 8 ou versões posteriores:

      • Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
      • Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
  2. No painel Conexões, expanda o nome do servidor e clique em Pools de Aplicativos.

  3. No painel Pools de Aplicativos, selecione o pool que deseja configurar para NUMA.

  4. No painel Ações, selecione Configurações Avançadas.

  5. No painel Modelo de Processo, defina o Máximo de Processos de Trabalho como 0.

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

Como configurar a ação de tempo limite ocioso

  1. Abra o Gerenciador dos Serviços de Informações da Internet (IIS):

    • Se você estiver usando o Windows Server 2012 R2:

      • Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows 8.1:

      • Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
      • Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
  2. No painel Conexões, clique duas vezes no nome do servidor, clique duas vezes em Pools de Aplicativos e, em seguida, selecione o pool de aplicativos a ser configurado.

  3. No painel Ações, clique em Configurações Avançadas.

  4. Na seção Modelo de Processo da caixa de diálogo Configurações Avançadas, para idleTimeoutAction, selecione Encerrar ou Suspender.

  5. Clique em OK.

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

Configuração

Você configura o elemento <processModel> no nível do servidor no arquivo ApplicationHost.config.

Atributos

Atributo Descrição
identityType Atributo de enumeração opcional.

Especifica a identidade da conta na qual o pool de aplicativos é executado.

Observação: a partir do IIS 7.5, o valor padrão é ApplicationPoolIdentity. (No IIS 7.0, o valor padrão era NetworkService.)

O atributo identityType pode ser um dos seguintes valores possíveis; o padrão é NetworkService.

Valor Descrição
ApplicationPoolIdentity Especifica que o pool de aplicativos é executado na conta de identidade do pool de aplicativos criada dinamicamente. A partir do IIS 7.5, ApplicationPoolIdentity é a identidade padrão na qual executar pools de aplicativos. (No IIS 7.0, a identidade padrão era NetworkService.)

Quando um pool de aplicativos é executado na conta ApplicationPoolIdentity, o pool de aplicativos acessa recursos como a identidade "IIS AppPool<AppPool>". Por exemplo, para o "DefaultAppPool", a identidade é "IIS AppPool\DefaultAppPool". Essa identidade permite que os administradores especifiquem permissões que pertencem apenas à identidade sob a qual o pool de aplicativos está em execução, aumentando, assim, a segurança do servidor.

O valor numérico é 4.
LocalService Especifica que o pool de aplicativos é executado na conta interna LocalService, que tem os mesmos direitos de usuário que o NetworkService.

Quando um pool de aplicativos é executado na conta LocalService, ele apresenta credenciais anônimas na rede.

Observação: a execução de um pool de aplicativos em uma conta que tenha direitos de usuário de alto nível é um sério risco à segurança.

O valor numérico é 1.
LocalSystem Especifica que o pool de aplicativos é executado sob a conta interna LocalSystem, que tem privilégios extensos no computador local e atua como o computador na rede.

Observação: a execução de um pool de aplicativos em uma conta que tenha direitos de usuário de alto nível é um sério risco à segurança.

O valor numérico é 0.
NetworkService Especifica que o pool de aplicativos é executado na conta interna NetworkService. No IIS 7.0, essa era a identidade padrão na qual executar pools de aplicativos; no IIS 7.5 o padrão foi alterado para ApplicationPoolIdentity.

Quando um pool de aplicativos é executado na conta NetworkService, ele acessa os recursos de rede como a conta do computador.

O valor numérico é 2.
SpecificUser Especifica que o pool de aplicativos é executado em uma identidade personalizada, que é configurada usando os atributos userName e password.

Observação: para evitar o armazenamento de cadeias de caracteres de senha não criptografadas em arquivos de configuração, use sempre AppCmd.exe ou o gerenciador do IIS para inserir senhas. Se você usar essas ferramentas de gerenciamento, as cadeias de caracteres de senha serão criptografadas automaticamente antes de serem gravadas nos arquivos de configuração XML. Isso fornece melhor segurança de senha do que armazenar senhas não criptografadas.

Observação: contas de serviço gerenciadas podem ser usadas para permitir que serviços e tarefas compartilhem suas próprias contas de domínio e habilitar o gerenciamento automático de senhas, eliminando a necessidade de um administrador administrar senhas manualmente. Para obter mais informações, consulte Novidades das contas de serviço gerenciado.

O valor numérico é 3.
idleTimeout Atributo timeSpan opcional.

Especifica por quanto tempo (em minutos) um processo de trabalho deve ser executado ocioso se nenhuma solicitação nova for recebida e o processo de trabalho não estiver processando solicitações. Depois que o tempo alocado for aprovado, o processo de trabalho deverá solicitar que ele seja desligado pelo serviço WWW.

O valor padrão é 00:20:00.

Para desabilitar o recurso de tempo limite ocioso, defina esse valor como 00:00:00.
idleTimeoutAction Atributo de enumeração opcional.

Especifica a ação a ser executada quando a duração do tempo limite ocioso for atingida. Antes do IIS 8.5, um processo de trabalho que estivesse ocioso durante a duração do atributo idleTimeout era encerrado. Após o IIS 8.5, você tem a opção de encerrar um processo de trabalho que atinge o limite idleTimeout ou suspendê-lo movendo-o da memória para o disco. Suspender um processo provavelmente levará menos tempo e consumirá menos memória do que encerrá-lo.

Você pode configurar uma ação de tempo limite ocioso de suspensão com a solicitação falsa de inicialização do aplicativo (consulte applicationInitialization.

O atributo idleTimeoutAction pode ter os seguintes possíveis valores. O valor padrão é Terminate.
Valor Descrição
Terminate Encerra um processo de trabalho ocioso. Isso requer um período de inicialização mais longo quando o site for posteriormente acessado por um usuário e o processo de trabalho for iniciado.

O valor numérico é 0.
Suspend Suspende um processo de trabalho ocioso. Isso deixa o processo de trabalho ativo, mas movido da memória para o disco, reduzindo os recursos utilizados do sistema. Quando uma solicitação entra posteriormente, o gerenciador de memória carrega os arquivos de permuta necessários à solicitação do disco para a memória, provavelmente disponibilizando o processo de trabalho mais rapidamente do que se ele tivesse sido encerrado anteriormente.

O valor numérico é 1.
loadUserProfile Atributo booliano opcional.

Especifica se o IIS carrega o perfil do usuário para a identidade do pool de aplicativos. Definir esse valor como false faz com que o IIS reverta para o comportamento do IIS 6.0. O IIS 6.0 não carrega o perfil do usuário para uma identidade do pool de aplicativos.

O valor padrão é false.
logEventOnProcessModel Atributo de sinalizadores opcionais.

Especifica qual ação executada no processo é registrada no Visualizador de Eventos. No IIS 8.0, a única ação que se aplica é a ação de tempo limite ocioso, na qual o processo é encerrado porque estava ocioso para o período idleTimeout.

O nome do sinalizador é igual a IdleTimeout. O valor é 1.

O valor padrão é IdleTimeout.
logonType Atributo de enumeração opcional.

Especifica o tipo de logon para a identidade de processo. (Para obter informações adicionais sobre tipos de logon, consulte o artigo Função LogonUser.)

Observação: esse atributo foi introduzido no IIS 7.5.

O atributo logonType pode ser um dos valores possíveis a seguir; o padrão é LogonBatch.
Valor Descrição
LogonBatch Especifica que a identidade do pool de aplicativos deve fazer logon como um usuário em lote.

O valor numérico é 0.
LogonService Especifica que a identidade do pool de aplicativos deve fazer logon como um serviço.

O valor numérico é 1.
manualGroupMembership Atributo booliano opcional.

Especifica se o SID (identificador de segurança) do grupo IIS_IUSRS é adicionado ao token do processo de trabalho. Quando false, o IIS usa automaticamente uma identidade do pool de aplicativos como se fosse um membro do grupo interno IIS_IUSRS, que tem acesso aos recursos necessários de arquivo e sistema. Quando true, uma identidade do pool de aplicativos deve ser explicitamente adicionada a todos os recursos que um processo de trabalho requer em runtime.

O valor padrão é false.
maxProcesses Atributo uint opcional.

Indica o número máximo de processos de trabalho que seriam usados para o pool de aplicativos.
  • Um valor de "1" indica um máximo de um único processo de trabalho para o pool de aplicativos. Essa seria a configuração em um servidor que não tem nós NUMA.
  • Um valor de "2" ou mais indica um jardim da Web que usa vários processos de trabalho para um pool de aplicativos (se necessário).
  • Um valor de "0" especifica que o IIS executa o mesmo número de processos de trabalho que os nós NUMA (acesso não uniforme à memória). O IIS identifica o número de nós NUMA disponíveis no hardware e inicia o mesmo número de processos de trabalho. Por exemplo, se você tiver quatro nós NUMA, ele usará, no máximo, quatro processos de trabalho para esse pool de aplicativos. Neste exemplo, definir maxProcesses como um valor de "0" ou "4" teria o mesmo resultado.
O valor padrão é 1.
password Atributo de cadeia de caracteres opcional.

Especifica a senha associada ao atributo userName. Esse atributo só é necessário quando o valor de identityType é SpecificUser.

Observação: para evitar o armazenamento de cadeias de caracteres de senha não criptografadas em arquivos de configuração, use sempre AppCmd.exe ou o gerenciador do IIS para inserir senhas. Se você usar essas ferramentas de gerenciamento, as cadeias de caracteres de senha serão criptografadas automaticamente antes de serem gravadas nos arquivos de configuração XML. Isso fornece melhor segurança de senha do que armazenar senhas não criptografadas.
pingingEnabled Atributo booliano opcional.

Especifica se o ping está habilitado para o processo de trabalho.

O valor padrão é true.
pingInterval Atributo timeSpan opcional.

Especifica o tempo entre pings de monitoramento de integridade que o serviço WWW envia para um processo de trabalho.

O valor padrão é 00:00:30 (30 segundos).
pingResponseTime Atributo timeSpan opcional.

Especifica o tempo em que um processo de trabalho tem para responder a um ping de monitoramento de integridade. Depois que o limite de tempo for excedido, o serviço WWW encerrará o processo de trabalho.

O valor padrão é 00:01:30 (1 minuto 30 segundos).
requestQueueDelegatorIdentity Atributo String opcional.

Especifica a identidade da conta que tem permissão para delegar solicitações HTTP ao pool de aplicativos.

Observação: esse atributo não está disponível na interface do usuário do Gerenciador dos Serviços de Informações da Internet (IIS).
setProfileEnvironment Atributo booliano opcional.

Quando setProfileEnvironment é definido como True, o WAS cria um bloco de ambiente para passar para CreateProcessAsUser ao criar um processo de trabalho. Isso garante que o ambiente seja definido com base no perfil do usuário para o novo processo.

O valor padrão é True.
shutdownTimeLimit Atributo timeSpan opcional.

Especifica o tempo que o serviço W3SVC aguarda depois de iniciar uma reciclagem. Se o processo de trabalho não for desligado dentro do shutdownTimeLimit, ele será encerrado pelo serviço W3SVC.

O valor padrão é 00:01:30 (1 minuto 30 segundos).
startupTimeLimit Atributo timeSpan opcional.

Especifica a hora em que o IIS aguarda o início de um pool de aplicativos. Se o pool de aplicativos não for inicializado dentro do startupTimeLimit, o processo de trabalho será encerrado e a contagem de proteção rápida contra falhas será incrementada.

O valor padrão é 00:01:30 (1 minuto 30 segundos).
userName Atributo de cadeia de caracteres opcional.

Especifica a identidade na qual o pool de aplicativos é executado quando o identityType é SpecificUser.

Elementos filho

Nenhum.

Exemplo de configuração

O exemplo de configuração a seguir usa o elemento do pool <add> de aplicativos para criar um novo pool de aplicativos chamado Contoso. O elemento <recycling> configura o registro em log para reinicializações do pool de aplicativos, o elemento <periodicRestart> é configurado quando o pool de aplicativos é reiniciado e o elemento <processModel> configura os atributos shutdownTimeLimit e startupTimeLimit para desligar e iniciar os processos de trabalho no pool de aplicativos por 30 segundos cada. Se esses limites de tempo forem excedidos, o IIS encerrará o processo de trabalho.

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

Exemplo de código

Os exemplos a seguir alteram os valores da propriedade processModel.shutdownTimeLimit e processModule.startupTimeLimit para 30 segundos cada para um pool de aplicativos chamado Contoso.

AppCmd.exe

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

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

Você também pode usar a seguinte sintaxe:

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

Observação

Defina o parâmetro commit para apphost quando usar AppCmd.exe para definir essas configurações. Isso confirma as definições de configuração para a seção de local apropriado no arquivo 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