Elaborare le impostazioni del modello per un processo del pool <di applicazioniModel>

Panoramica

Usando l'elemento <processModel> , è possibile configurare molte delle funzionalità di sicurezza, prestazioni, integrità e affidabilità dei pool di applicazioni in IIS 7 e versioni successive. Queste includono le funzionalità seguenti:

  • Identità del pool di applicazioni, ovvero il nome del servizio o dell'account utente in cui viene eseguito il processo di lavoro del pool di applicazioni. Questo valore viene definito dall'attributo identityType . Per impostazione predefinita, a partire da IIS 7.5 un pool di applicazioni viene eseguito con l'account ApplicationPoolIdentity predefinito, creato dinamicamente dal servizio di attivazione dei processi di Windows (WAS). In IIS 7.0 l'identità predefinita è l'account NetworkService . È possibile modificare il valore dell'attributo identityType impostando l'account NetworkService predefinito, l'account LocalService , l'account LocalSystem predefinito o un account personalizzato creato. Se si sceglie un account personalizzato, definire le credenziali dell'account usando gli attributi userName e password . Tenere presente, tuttavia, che gli account NetworkService, LocalService e LocalSystem hanno più diritti utente rispetto all'account ApplicationPoolIdentity . Avviso: si tratta di un grave rischio per la sicurezza per l'esecuzione di un pool di applicazioni usando diritti utente di alto livello. È anche possibile usare l'attributo logonType per specificare se l'identità del processo deve accedere come utente o servizio batch. Per altre informazioni sui tipi di accesso, vedere l'articolo Relativo alla funzione LogonUser .
  • Web gardening e uso dell'hardware NUMA (Non-Uniform Memory Access), che è possibile configurare impostando l'attributo maxProcesses . Per il giardinaggio Web, vedere maxProcesses su un valore maggiore di uno. Per l'uso dell'hardware NUMA, impostare maxProcesses su un valore pari a "0" per specificare che IIS esegue lo stesso numero di processi di lavoro in cui sono presenti nodi NUMA.
  • Impostazioni di timeout di inattività che consentono di impostare per quanto tempo un processo di lavoro rimane inattivo prima dell'arresto. Modificare l'attributo idleTimeout per configurare questa impostazione.
  • Monitoraggio dell'integrità abilitando i ping sul processo di lavoro, il tempo massimo consentito a un processo di lavoro per rispondere a un ping e la frequenza di ping inviati a un processo di lavoro per monitorarne l'integrità. Modificare gli attributi pingingEnabled, pingInterval e pingResponseTime per configurare queste impostazioni.
  • Limiti di tempo di arresto e avvio del processo di lavoro. Il primo limite viene impostato dall'attributo shutdownTimeLimit e determina l'intervallo che IIS 7 e versioni successive assegna a un processo di lavoro di completare tutte le richieste prima che il servizio WWW termini il processo di lavoro. Il secondo limite viene impostato dall'attributo startupTimeLimit e specifica la quantità di tempo in cui IIS 7 e versioni successive consente l'avvio di un pool di applicazioni.

Compatibilità

Versione Note
IIS 10.0 L'elemento <processModel> non è stato modificato in IIS 10.0.
IIS 8,5 L'attributo idleTimeoutAction è stato aggiunto consentendo a un processo di lavoro inattivo per la durata dell'attributo idleTimeout di essere terminato o sospeso, non solo terminato.
IIS 8,0 L'attributo setProfileEnvironment è stato aggiunto consentendo di impostare l'ambiente in base al profilo utente per un nuovo processo. Sono stati aggiunti valori per l'attributo, incluso il maxProcesses supporto per L'accesso alla memoria non uniforme (NUMA). L'attributo logEventOnProcessModel è stato aggiunto per specificare l'azione eseguita nel processo viene registrata.
IIS 7,5 L'elemento <processModel> dell'elemento <add> è stato aggiornato in IIS 7.5 per includere le impostazioni che consentono di eseguire applicazioni usando il nuovo ApplicationPoolIdentity e di specificare il tipo di accesso per l'identità del processo.
IIS 7.0 L'elemento <processModel> è stato introdotto in IIS 7.0.
IIS 6.0 L'elemento <processModel> sostituisce alcune delle impostazioni nell'oggetto metabase IIS 6.0 IIsApplicationPools .

Configurazione

La <applicationPools> raccolta è inclusa nell'installazione predefinita di IIS 7 e versioni successive.

Procedure

Come modificare le impostazioni di configurazione del modello di processo

  1. Aprire Gestione Internet Information Services (IIS):

    • Se si usano Windows Server 2012 o Windows Server 2012 R2:

      • Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usano Windows 8 o Windows 8.1:

      • Tenere premuto il tasto Windows, premere la lettera X e quindi fare clic su Pannello di controllo.
      • Fare clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows Server 2008 o Windows Server 2008 R2:

      • Sulla barra delle applicazioni fare clic su Start, scegliere Strumenti di amministrazione, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows Vista o Windows 7:

      • Sulla barra delle applicazioni fare clic su Start e quindi su Pannello di controllo.
      • Fare doppio clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
  2. Nel riquadro Connessioni espandere il nome del server, fare clic su Pool di applicazioni e fare clic sul pool di applicazioni che si desidera modificare. Screenshot della finestra I S Manager che mostra la pagina Pool di applicazioni.

  3. Nel riquadro Azioni fare clic su Impostazioni avanzate...

  4. Nella finestra di dialogo Impostazioni avanzate fare clic sulla proprietà del modello di processo che si desidera modificare, quindi modificarla nella sezione valore proprietà della finestra di dialogo, quindi fare clic su OK. Ad esempio, modificare il limite di tempo di arresto (secondi) e i limiti di tempo di avvio (secondi) su 30.
    Screenshot della finestra di dialogo Impostazioni avanzate. Il modello di processo è evidenziato.

Come configurare IIS per l'uso con hardware NUMA (Non-Uniform Memory Access)

  1. Aprire Gestione Internet Information Services (IIS):

    • Se si usa Windows Server 2012 o versione successiva:

      • Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usano Windows 8 o versioni successive:

      • Tenere premuto il tasto Windows, premere la lettera X e quindi fare clic su Pannello di controllo.
      • Fare clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
  2. Nel riquadro Connessioni espandere il nome del server e quindi fare clic su Pool di applicazioni.

  3. Nel riquadro Pool di applicazioni selezionare il pool da configurare per NUMA.

  4. Nel riquadro Azioni selezionare Impostazioni avanzate.

  5. Nel riquadro Modello di processo impostare Numero massimo processi di lavoro su 0.

    Screenshot del riquadro Impostazioni avanzate. Il numero massimo di processi di lavoro è evidenziato nell'elenco.

Come configurare l'azione di timeout di inattività

  1. Aprire Gestione Internet Information Services (IIS):

    • Se si usa Windows Server 2012 R2:

      • Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows 8.1:

      • Tenere premuto il tasto Windows, premere la lettera X e quindi fare clic su Pannello di controllo.
      • Fare clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
  2. Nel riquadro Connessioni fare doppio clic sul nome del server, fare doppio clic su Pool di applicazioni e quindi selezionare il pool di applicazioni da configurare.

  3. Nel riquadro Azioni fare clic su Impostazioni avanzate.

  4. Nella sezione Modello di elaborazione della finestra di dialogo Impostazioni avanzate , per idleTimeoutAction, selezionare Termina o Sospendi.

  5. Fare clic su OK.

    Screenshot della finestra di dialogo Impostazioni avanzate. Timeout inattivo- Azione evidenziata e Termina è selezionata nel menu a discesa.

Configurazione

L'elemento viene <processModel> configurato a livello di server nel file ApplicationHost.config.

Attributi

Attributo Descrizione
identityType Attributo di enumerazione facoltativo.

Specifica l'identità dell'account in cui viene eseguito il pool di applicazioni.

Nota: A partire da IIS 7.5 il valore predefinito è ApplicationPoolIdentity. (In IIS 7.0 il valore predefinito è . NetworkService)

L'attributo identityType può essere uno dei valori possibili seguenti; il valore predefinito è NetworkService.

Valore Descrizione
ApplicationPoolIdentity Specifica che il pool di applicazioni viene eseguito nell'account di identità del pool di applicazioni creato in modo dinamico. A partire da IIS 7.5, ApplicationPoolIdentity è l'identità predefinita in cui eseguire i pool di applicazioni. In IIS 7.0 l'identità predefinita è .NetworkService

Quando un pool di applicazioni viene eseguito con l'account ApplicationPoolIdentity , il pool di applicazioni accede alle risorse come "IIS AppPool< Identità di AppPool>. Ad esempio, per "DefaultAppPool", l'identità è "IIS AppPool\DefaultAppPool". Questa identità consente agli amministratori di specificare le autorizzazioni relative solo all'identità in cui è in esecuzione il pool di applicazioni, aumentando così la sicurezza del server.

Il valore numerico è 4.
LocalService Specifica che il pool di applicazioni viene eseguito con l'account LocalService predefinito, che ha gli stessi diritti utente di NetworkService.

Quando un pool di applicazioni viene eseguito con l'account LocalService , il pool di applicazioni presenta credenziali anonime nella rete.

Nota: L'esecuzione di un pool di applicazioni con un account con diritti utente di alto livello è un rischio grave per la sicurezza.

Il valore numerico è 1.
LocalSystem Specifica che il pool di applicazioni viene eseguito con l'account LocalSystem predefinito, che dispone di privilegi estesi nel computer locale e funge da computer in rete.

Nota: L'esecuzione di un pool di applicazioni con un account con diritti utente di alto livello è un rischio grave per la sicurezza.

Il valore numerico è 0.
NetworkService Specifica che il pool di applicazioni viene eseguito con l'account NetworkService predefinito. In IIS 7.0 si tratta dell'identità predefinita in cui eseguire i pool di applicazioni; in IIS 7.5 il valore predefinito è stato modificato in ApplicationPoolIdentity.

Quando un pool di applicazioni viene eseguito con l'account NetworkService , il pool di applicazioni accede alle risorse di rete come account computer.

Il valore numerico è 2.
SpecificUser Specifica che il pool di applicazioni viene eseguito con un'identità personalizzata, configurata usando gli attributi userName e password .

Nota: Per evitare di archiviare stringhe password non crittografate nei file di configurazione, usare sempre AppCmd.exe o Gestione IIS per immettere le password. Se si usano questi strumenti di gestione, le stringhe password verranno crittografate automaticamente prima che vengano scritte nei file di configurazione XML. Ciò garantisce una migliore sicurezza delle password rispetto all'archiviazione di password non crittografate.

Nota: Gli account del servizio gestito possono essere usati per consentire a servizi e attività di condividere i propri account di dominio e di abilitare la gestione automatica delle password, eliminando la necessità di un amministratore di amministrare manualmente le password. Per altre informazioni, vedere Novità per gli account del servizio gestito.

Il valore numerico è 3.
idleTimeout Attributo timeSpan facoltativo.

Specifica per quanto tempo (in minuti) un processo di lavoro deve essere eseguito inattiva se non vengono ricevute nuove richieste e il processo di lavoro non elabora le richieste. Una volta trascorso il tempo allocato, il processo di lavoro deve richiedere che venga arrestato dal servizio WWW.

Il valore predefinito è 00:20:00.

Per disabilitare la funzionalità di timeout di inattività, impostare questo valore su 00:00:00.
idleTimeoutAction Attributo di enumerazione facoltativo.

Specifica l'azione da eseguire quando è stata raggiunta la durata del timeout di inattività. Prima di IIS 8.5, un processo di lavoro inattivo per la durata dell'attributo idleTimeout verrebbe terminato. Dopo IIS 8.5, è possibile scegliere di terminare un processo di lavoro che raggiunge il idleTimeout limite o di sospenderlo spostandolo dalla memoria al disco. La sospensione di un processo richiederà probabilmente meno tempo e utilizzerà meno memoria del termine.

È possibile configurare un'azione di timeout di inattività di sospensione con la richiesta fittizia di inizializzazione dell'applicazione (vedere applicationInitialization.

L'attributo idleTimeoutAction può avere i valori possibili seguenti. Il valore predefinito è Terminate.
Valore Descrizione
Terminate Termina un processo di lavoro inattiva. Questo richiede un periodo di avvio più lungo quando il sito viene successivamente accessibile da un utente e il processo di lavoro viene avviato.

Il valore numerico è 0.
Suspend Sospende un processo di lavoro inattiva. Ciò lascia attivo il processo di lavoro, ma spostato dalla memoria al disco, riducendo le risorse di sistema utilizzate. Quando viene successivamente inviata una richiesta, gestione memoria carica i file di pagina necessari per la richiesta da disco a memoria, rendendo il processo di lavoro disponibile più rapidamente rispetto a se fosse stato terminato in precedenza.

Il valore numerico è 1.
loadUserProfile Attributo booleano facoltativo.

Specifica se IIS carica il profilo utente per l'identità del pool di applicazioni. Se si imposta questo valore su false , IIS viene ripristinato il comportamento di IIS 6.0. IIS 6.0 non carica il profilo utente per un'identità del pool di applicazioni.

Il valore predefinito è false.
logEventOnProcessModel Attributo flag facoltativo.

Specifica quale azione eseguita nel processo viene registrata nel Visualizzatore eventi. In IIS 8.0 l'unica azione che si applica è l'azione di timeout di inattività, in cui il processo viene terminato perché era inattivo per il periodo di inattivitàTimeout.

Il nome del flag è uguale a IdleTimeout. Il valore è 1.

Il valore predefinito è IdleTimeout.
logonType Attributo di enumerazione facoltativo.

Specifica il tipo di accesso per l'identità del processo. Per altre informazioni sui tipi di accesso, vedere l'articolo Relativo alla funzione LogonUser .

Nota: Questo attributo è stato introdotto in IIS 7.5.

L'attributo logonType può essere uno dei valori possibili seguenti. Il valore predefinito è LogonBatch.
Valore Descrizione
LogonBatch Specifica che l'identità del pool di applicazioni deve accedere come utente batch.

Il valore numerico è 0.
LogonService Specifica che l'identità del pool di applicazioni deve accedere come servizio.

Il valore numerico è 1.
manualGroupMembership Attributo booleano facoltativo.

Specifica se il SID (Group Security Identifier) di IIS_IUSRS viene aggiunto al token del processo di lavoro. Se false, IIS usa automaticamente un'identità del pool di applicazioni come se fosse un membro del gruppo di IIS_IUSRS predefinito, che ha accesso alle risorse di file e di sistema necessarie. Se true, un'identità del pool di applicazioni deve essere aggiunta in modo esplicito a tutte le risorse richieste da un processo di lavoro in fase di esecuzione.

Il valore predefinito è false.
maxProcesses Attributo uint facoltativo.

Indica il numero massimo di processi di lavoro che verranno usati per il pool di applicazioni.
  • Il valore "1" indica un massimo di un singolo processo di lavoro per il pool di applicazioni. Si tratta dell'impostazione in un server che non dispone di nodi NUMA.
  • Il valore "2" o più indica un giardino Web che usa più processi di lavoro per un pool di applicazioni (se necessario).
  • Il valore "0" specifica che IIS esegue lo stesso numero di processi di lavoro in cui sono presenti nodi NUMA (Non-Uniform Memory Access). IIS identifica il numero di nodi NUMA disponibili nell'hardware e avvia lo stesso numero di processi di lavoro. Ad esempio, se si dispone di quattro nodi NUMA, verrà usato un massimo di quattro processi di lavoro per il pool di applicazioni. In questo esempio l'impostazione di maxProcesses su un valore pari a "0" o "4" avrà lo stesso risultato.
Il valore predefinito è 1.
password Attributo stringa facoltativo.

Specifica la password associata all'attributo userName . Questo attributo è necessario solo quando il valore di identityType è SpecificUser.

Nota: Per evitare di archiviare stringhe password non crittografate nei file di configurazione, usare sempre AppCmd.exe o Gestione IIS per immettere le password. Se si usano questi strumenti di gestione, le stringhe password verranno crittografate automaticamente prima che vengano scritte nei file di configurazione XML. Ciò garantisce una migliore sicurezza delle password rispetto all'archiviazione di password non crittografate.
pingingEnabled Attributo booleano facoltativo.

Specifica se il ping è abilitato per il processo di lavoro.

Il valore predefinito è true.
pingInterval Attributo timeSpan facoltativo.

Specifica il tempo tra i ping di monitoraggio dell'integrità inviati dal servizio WWW a un processo di lavoro.

Il valore predefinito è 00:00:30 (30 secondi).
pingResponseTime Attributo timeSpan facoltativo.

Specifica il momento in cui viene assegnato un processo di lavoro per rispondere a un ping di monitoraggio dell'integrità. Dopo il superamento del limite di tempo, il servizio WWW termina il processo di lavoro.

Il valore predefinito è 00:01:30 (1 minuto 30 secondi).
requestQueueDelegatorIdentity Attributo String facoltativo.

Specifica l'identità dell'account che dispone dell'autorizzazione per delegare le richieste HTTP al pool di applicazioni.

Nota: questo attributo non è disponibile nell'interfaccia utente di Gestione Internet Information Services (IIS).
setProfileEnvironment Attributo booleano facoltativo.

Quando setProfileEnvironment è impostato su True, WAS crea un blocco di ambiente da passare a CreateProcessAsUser durante la creazione di un processo di lavoro. Ciò garantisce che l'ambiente sia impostato in base al profilo utente per il nuovo processo.

Il valore predefinito è True.
shutdownTimeLimit Attributo timeSpan facoltativo.

Specifica il tempo di attesa del servizio W3SVC dopo l'avvio di un riciclo. Se il processo di lavoro non viene arrestato all'interno dell'oggetto shutdownTimeLimit, verrà terminato dal servizio W3SVC.

Il valore predefinito è 00:01:30 (1 minuto 30 secondi).
startupTimeLimit Attributo timeSpan facoltativo.

Specifica l'ora in cui IIS attende l'avvio di un pool di applicazioni. Se il pool di applicazioni non viene avviato all'interno dell'avvioTimeLimit, il processo di lavoro viene terminato e il numero di protezione a errori rapidi viene incrementato.

Il valore predefinito è 00:01:30 (1 minuto 30 secondi).
userName Attributo stringa facoltativo.

Specifica l'identità in cui viene eseguito il pool di applicazioni quando identityType è SpecificUser.

Elementi figlio

Nessuno.

Esempio di configurazione

L'esempio di configurazione seguente usa l'elemento del pool <add> di applicazioni per creare un nuovo pool di applicazioni denominato Contoso. L'elemento <recycling> configura la registrazione per i riavvii del pool di applicazioni, l'elemento <periodicRestart> configura quando il pool di applicazioni viene riavviato e l'elemento <processModel> configura gli attributi shutdownTimeLimit e startupTimeLimit per arrestare e avviare i processi di lavoro nel pool di applicazioni per 30 secondi. Se questi limiti di tempo vengono superati, IIS termina il processo di lavoro.

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

Codice di esempio

Gli esempi seguenti modificano i valori delle proprietà processModel.shutdownTimeLimit e processModule.startupTimeLimit su 30 secondi per un pool di applicazioni denominato Contoso.

AppCmd.exe

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

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

È anche possibile usare la sintassi seguente:

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

È necessario assicurarsi di impostare il parametro commit su apphost quando si usa AppCmd.exe per configurare queste impostazioni. Questa operazione esegue il commit delle impostazioni di configurazione nella sezione percorso appropriata nel file di 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