Partager via


Paramètres de modèle de processus pour un <processModel> de pool d’applications

Vue d’ensemble

À l’aide de l’élément <processModel>, vous pouvez configurer une grande partie des fonctionnalités de sécurité, de performances, d’intégrité et de fiabilité des pools d’applications sur IIS 7 et versions ultérieures. Vous disposez des fonctionnalités suivantes :

  • « Application pool identity » (identité du pool d’applications) est le nom du service ou du compte d’utilisateur sous lequel le processus de travail du pool d’applications s’exécute. Cela est défini par l’attribut identityType . Par défaut, à partir d’IIS 7.5, un pool d’applications s’exécute sous le compte ApplicationPoolIdentity intégré , qui est créé dynamiquement par le service d’activation des processus Windows (WAS). (Dans IIS 7.0, l’identité par défaut était le compte NetworkService.) Vous pouvez remplacer la valeur de l’attribut identityType par le compte NetworkService intégré, le compte LocalService, le compte LocalSystem intégré ou un compte personnalisé que vous créez. Si vous choisissez un compte personnalisé, définissez les informations d’identification du compte à l’aide des attributs userName et password. Sachez toutefois que les comptes NetworkService, LocalService et LocalSystem ont plus de droits d’utilisateur que le compte ApplicationPoolIdentity . (Avertissement : exécuter un pool d’applications à l’aide de droits utilisateur de haut niveau représente un risque de sécurité sérieux.) En outre, vous pouvez utiliser l’attribut logonType pour spécifier si l’identité du processus doit se connecter en tant qu’utilisateur ou service par lots. (Pour plus d’informations sur les types d’ouverture de session, consultez l’article Fonction LogonUser.)
  • Jardinage web et utilisation du matériel NUMA (Non Uniform Memory Access), que vous pouvez configurer en définissant l’attribut maxProcesses. Pour le jardinage web, consultez maxProcesses avec une valeur supérieure à un. Pour utiliser du matériel NUMA, définissez maxProcesses sur la valeur « 0 » pour spécifier que IIS exécute le même nombre de processus de travail que le nombre de nœuds NUMA.
  • Paramètres de délai d’inactivité, ce qui vous permet de définir la durée pendant laquelle un processus de travail peut rester inactif avant qu’il ne s’arrête. Modifiez l’attribut idleTimeout pour configurer ce paramètre.
  • Surveillance de l’intégrité en activant les tests ping sur le processus de travail, la durée maximale autorisée pour qu’un processus de travail réponde à un test ping et la fréquence des pings envoyés à un processus de travail pour surveiller son intégrité. Modifiez les attributs pingingEnabled, pingIntervalet pingResponseTime pour configurer ces paramètres.
  • Limites de temps d’arrêt et de démarrage du processus de travail. La première limite est définie par l’attribut shutdownTimeLimit et détermine l’intervalle que IIS 7 (et les versions ultérieures) donne à un processus de travail pour terminer toutes ses demandes avant d’être arrêté par le service WWW. La deuxième limite est définie par l’attribut startupTimeLimit et spécifie la durée pendant laquelle IIS 7 (et les versions ultérieures) permet à un pool d’applications de démarrer.

Compatibilité

Version Notes
IIS 10.0 L’élément <processModel> n’a fait l’objet d’aucune modification dans IIS 10.0.
IIS 8.5 L’attribut idleTimeoutAction a été ajouté pour permettre à un processus de travail inactif pendant la durée de l’attribut idleTimeout d’être arrêté ou suspendu, pas seulement arrêté.
IIS 8.0 L’attribut setProfileEnvironment a été ajouté pour permettre à l’environnement d’être défini en fonction du profil utilisateur d’un nouveau processus. Des valeurs ont été ajoutées pour l’attribut maxProcesses, y compris la prise en charge de l’accès à la mémoire non uniforme (NUMA). L’attribut logEventOnProcessModel a été ajouté pour spécifier que l’action effectuée dans le processus est journalisée.
IIS 7.5 L’élément <processModel> de l’élément <add> a été mis à jour dans IIS 7.5 pour inclure des paramètres qui vous permettent d’exécuter des applications à l’aide du nouvel attribut ApplicationPoolIdentity et de spécifier le type de connexion pour l’identité du processus.
IIS 7.0 L’élément <processModel> a été introduit dans IIS 7.0.
IIS 6.0 L’élément <processModel> remplace certains des paramètres de l’objet métabase IIS 6.0 IIsApplicationPools.

Programme d’installation

La collection <applicationPools> est incluse dans l’installation par défaut d’IIS 7 et les versions ultérieures.

Procédure

Comment modifier les paramètres de configuration du modèle de processus

  1. Ouvrez le Gestionnaire Internet Information Services (IIS) :

    • Si vous utilisez Windows Server 2012 ou Windows Server 2012 R2 :

      • Dans la barre des tâches, cliquez sur Gestionnaire de serveur, cliquez sur Outils, puis sur Gestionnaire Internet Information Services (IIS).
    • Si vous utilisez Windows 8 ou Windows 8.1 :

      • Maintenez la touche Windows enfoncée, appuyez sur la lettre X, puis cliquez sur Panneau de configuration.
      • Cliquez sur Outils d'administration, puis double-cliquez sur Gestionnaire des services Internet (IIS).
    • Si vous utilisez Windows Server 2008 ou Windows Server 2008 R2 :

      • Cliquez sur Démarrer, placez le curseur sur Outils d'administration, puis cliquez sur Gestionnaire Internet Information Services (IIS).
    • Si vous utilisez Windows Vista ou Windows 7 :

      • Dans la barre des tâches, cliquez sur Démarrer, puis sur Panneau de configuration.
      • Double-cliquez sur Outils d'administration, puis double-cliquez sur Gestionnaire des services Internet (IIS).
  2. Dans le volet Connexions, développez le nom du serveur, cliquez sur Pools d’applications, puis cliquez sur le pool d’applications que vous souhaitez modifier. Screenshot of the I I S Manager window displaying the Application Pools page.

  3. Dans le volet Actions, cliquez sur Paramètres avancés...

  4. Dans la boîte de dialogue Paramètres avancés, cliquez sur la propriété de modèle de processus que vous souhaitez modifier, puis modifiez-la dans la section valeur de propriété de la boîte de dialogue, puis cliquez sur OK. Par exemple, remplacez les valeurs limite de temps d’arrêt (secondes) et limites de temps de démarrage (secondes) par 30.
    Screenshot of the Advanced Settings dialog box. Process Model is highlighted.

Guide pratique pour configurer IIS en combinaison avec du matériel NUMA (Non Uniform Memory Access)

  1. Ouvrez le Gestionnaire Internet Information Services (IIS) :

    • Si vous utilisez Windows Server 2012 ou une version ultérieure :

      • Dans la barre des tâches, cliquez sur Gestionnaire de serveur, cliquez sur Outils, puis sur Gestionnaire Internet Information Services (IIS).
    • Si vous utilisez Windows 8 ou une version ultérieure :

      • Maintenez la touche Windows enfoncée, appuyez sur la lettre X, puis cliquez sur Panneau de configuration.
      • Cliquez sur Outils d'administration, puis double-cliquez sur Gestionnaire des services Internet (IIS).
  2. Dans le volet Connexions, développez le nom de serveur, puis cliquez sur Pools d'applications.

  3. Dans le volet Pools d’applications, sélectionnez le pool que vous souhaitez configurer pour NUMA.

  4. Dans le volet Actions, sélectionnez Paramètres avancés.

  5. Sous le volet Modèle de processus, définissez le nombre maximal de processus de travail sur 0.

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

Comment configurer l’action de délai d’inactivité

  1. Ouvrez le Gestionnaire Internet Information Services (IIS) :

    • Si vous utilisez Windows Server 2012 R2 :

      • Dans la barre des tâches, cliquez sur Gestionnaire de serveur, cliquez sur Outils, puis sur Gestionnaire Internet Information Services (IIS).
    • Si vous utilisez Windows 8.1 :

      • Maintenez la touche Windows enfoncée, appuyez sur la lettre X, puis cliquez sur Panneau de configuration.
      • Cliquez sur Outils d'administration, puis double-cliquez sur Gestionnaire des services Internet (IIS).
  2. Dans le volet Connexions, double-cliquez sur le nom du serveur, double-cliquez sur Pools d’applications, puis sélectionnez le pool d’applications à configurer.

  3. Dans le volet Actions, cliquez sur Paramètres avancés.

  4. Dans la section Modèle de processus de la boîte de dialogue Paramètres avancés, pour idleTimeoutAction, sélectionnez Arrêter ou Suspendre.

  5. Cliquez sur OK.

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

Configuration

Vous pouvez configurer l’élément <processModel> au niveau du serveur dans le fichier ApplicationHost.config.

Attributs

Attribut Description
identityType Attribut d’énumération facultatif.

Spécifie l’identité de compte sous laquelle le pool d’applications s’exécute.

Remarque : à partir d’IIS 7.5, la valeur par défaut est ApplicationPoolIdentity. (Dans IIS 7.0, la valeur par défaut était NetworkService.)

L’attribut identityType peut être l’une des valeurs possibles suivantes ; sa valeur par défaut est NetworkService.

Valeur Description
ApplicationPoolIdentity Spécifie que le pool d’applications s’exécute sous le compte d’identité du pool d’applications créé dynamiquement. À partir d’IIS 7.5, ApplicationPoolIdentity est l’identité par défaut sous laquelle exécuter des pools d’applications. (Dans IIS 7.0, l’identité par défaut était NetworkService.)

Lorsqu’un pool d’applications s’exécute sous le compte ApplicationPoolIdentity, le pool d’applications accède aux ressources en tant que l’identité «IIS AppPool<AppPool> ». Par exemple, pour « DefaultAppPool », l’identité est « IIS AppPool\DefaultAppPool ». Cette identité permet aux administrateurs de spécifier des autorisations qui se rapportent uniquement à l’identité sous laquelle le pool d’applications est en cours d’exécution, ce qui augmente la sécurité du serveur.

La valeur numérique est 4.
LocalService Spécifie que le pool d’applications s’exécute sous le compte LocalService intégré , qui a les mêmes droits d’utilisateur que NetworkService.

Lorsqu’un pool d’applications s’exécute sous le compte LocalService, le pool d’applications présente des informations d’identification anonymes sur le réseau.

Remarque : L’exécution d’un pool d’applications sous un compte disposant de droits d’utilisateur de haut niveau est un risque de sécurité grave.

La valeur numérique est 1.
LocalSystem Spécifie que le pool d’applications s’exécute sous le compte LocalSystem intégré, qui dispose de privilèges étendus sur l’ordinateur local et agit comme l’ordinateur sur le réseau.

Remarque : L’exécution d’un pool d’applications sous un compte disposant de droits d’utilisateur de haut niveau est un risque de sécurité grave.

La valeur numérique est 0.
NetworkService Spécifie que le pool d’applications s’exécute sous le compte NetworkService intégré. Dans IIS 7.0, il s’agissait de l’identité par défaut sous laquelle exécuter des pools d’applications ; Dans IIS 7.5, la valeur par défaut a été modifiée en ApplicationPoolIdentity.

Lorsqu’un pool d’applications s’exécute sous le compte NetworkService, le pool d’applications accède aux ressources réseau en tant que compte d’ordinateur.

La valeur numérique est 2.
SpecificUser Spécifie que le pool d’applications s’exécute sous une identité personnalisée, qui est configurée à l’aide des attributs userName et password.

Remarque : Pour éviter de stocker des chaînes de mot de passe non chiffrées dans des fichiers de configuration, utilisez toujours AppCmd.exe ou le Gestionnaire IIS pour entrer des mots de passe. Si vous utilisez ces outils de gestion, les chaînes de mot de passe sont chiffrées automatiquement avant d’être écrites dans les fichiers de configuration XML. Cela offre une meilleure sécurité de mot de passe que le stockage de mots de passe non chiffrés.

Remarque : Les comptes de service administrés peuvent être utilisés pour permettre aux services et aux tâches de partager leurs propres comptes de domaine et d’activer la gestion automatique des mots de passe, ce qui élimine la nécessité pour un administrateur de gérer manuellement les mots de passe. Pour plus d’informations, consultez Nouveautés sur les comptes de service administrés.

La valeur numérique est 3.
idleTimeout Attribut timeSpan facultatif.

Spécifie la durée (en minutes) pendant laquelle un processus de travail doit rester inactif si aucune nouvelle demande n’est reçue et que le processus de travail ne traite pas de demandes. Une fois le temps alloué écoulé, le processus de travail doit demander à être arrêté par le service WWW.

La valeur par défaut est 00:20:00.

Pour désactiver la fonctionnalité de délai d’inactivité, définissez cette valeur sur 00:00:00.
idleTimeoutAction Attribut d’énumération facultatif.

Spécifie l’action à effectuer lorsque la durée du délai d’inactivité a été atteinte. Avant IIS 8.5, un processus de travail inactif pendant la durée de l’attribut idleTimeout serait arrêté. Après IIS 8.5, vous avez le choix d’arrêter un processus de travail qui atteint la limite idleTimeout ou de le suspendre en le déplaçant de la mémoire vers le disque. L’interruption d’un processus prend probablement moins de temps et consomme moins de mémoire que l’arrêt de celui-ci.

Vous pouvez configurer une action de délai d’inactivité de suspension avec la fausse demande d’initialisation de l’application (voir applicationInitialization.

L’attribut idleTimeoutAction peut avoir les valeurs possibles suivantes. La valeur par défaut est Terminate.
Valeur Description
Terminate Met fin à un processus de travail inactif. Cela nécessite une période de démarrage plus longue lorsque le site est ensuite accessible par un utilisateur et que le processus de travail est démarré.

La valeur numérique est 0.
Suspend Suspend un processus de travail inactif. Cela laisse le processus de travail actif, mais déplacé de la mémoire vers le disque, réduisant ainsi les ressources système consommées. Lorsqu’une demande intervient par la suite, le gestionnaire de mémoire charge les fichiers de page requis pour la demande du disque vers la mémoire, ce qui rend probablement le processus de travail disponible plus rapidement que s’il avait été arrêté.

La valeur numérique est 1.
loadUserProfile Attribut booléen facultatif.

Spécifie si IIS charge le profil utilisateur pour l’identité du pool d’applications. Si vous définissez cette valeur sur false, IIS revient au comportement d’IIS 6.0. IIS 6.0 ne charge pas le profil utilisateur pour une identité de pool d’applications.

La valeur par défaut est false.
logEventOnProcessModel Attribut d’indicateurs facultatifs.

Spécifie l’action effectuée dans le processus qui est journalisée dans l’Observateur d’événements. Dans IIS 8.0, la seule action qui s’applique est l’action de délai d’inactivité, dans laquelle le processus est arrêté, car il était inactif pour la période idleTimeout.

Le nom de l’indicateur est égal à IdleTimeout. La valeur est 1.

La valeur par défaut est IdleTimeout.
logonType Attribut d’énumération facultatif.

Spécifie le type d’ouverture de session pour l’identité du processus. (Pour plus d’informations sur les types d’ouverture de session, consultez l’article Fonction LogonUser.)

Remarque : Cet attribut a été introduit dans IIS 7.5.

L’attribut logonType peut être l’une des valeurs possibles suivantes ; sa valeur par défaut est LogonBatch.
Valeur Description
LogonBatch Spécifie que l’identité du pool d’applications doit se connecter en tant qu’utilisateur par lots.

La valeur numérique est 0.
LogonService Spécifie que l’identité du pool d’applications doit se connecter en tant que service.

La valeur numérique est 1.
manualGroupMembership Attribut booléen facultatif.

Spécifie si l’identificateur de sécurité du groupe IIS_IUSRS (SID) est ajouté au jeton de processus de travail. Lorsque la valeur est false, IIS utilise automatiquement une identité de pool d’applications comme s’il s’agissait d’un membre du groupe intégré IIS_IUSRS, qui a accès aux ressources système et aux fichiers nécessaires. Lorsque la valeur est true, une identité de pool d’applications doit être explicitement ajoutée à toutes les ressources requises par un processus de travail au moment de son exécution.

La valeur par défaut est false.
maxProcesses Attribut uint facultatif.

Indique le nombre maximal de processus de travail qui seraient utilisés pour le pool d’applications.
  • La valeur « 1 » indique un maximum d’un seul processus de travail pour le pool d’applications. Il s’agit du paramètre sur un serveur qui n’a pas de nœuds NUMA.
  • La valeur « 2 » ou plus indique un jardin Web qui utilise plusieurs processus de travail pour un pool d’applications (si nécessaire).
  • La valeur « 0 » spécifie que IIS exécute le même nombre de processus de travail que le nombre de nœuds NUMA (Non Uniform Memory Access) existants. IIS identifie le nombre de nœuds NUMA disponibles sur le matériel et démarre le même nombre de processus de travail. Par exemple, si vous avez quatre nœuds NUMA, il utilise un maximum de quatre processus de travail pour ce pool d’applications. Dans cet exemple, la définition de maxProcesses sur une valeur de « 0 » ou « 4 » aurait le même résultat.
La valeur par défaut est 1.
password Attribut de chaîne facultatif.

Spécifie le mot de passe associé à l’attribut userName . Cet attribut n’est nécessaire que lorsque la valeur de identityType est SpecificUser.

Remarque : Pour éviter de stocker des chaînes de mot de passe non chiffrées dans des fichiers de configuration, utilisez toujours AppCmd.exe ou le Gestionnaire IIS pour entrer des mots de passe. Si vous utilisez ces outils de gestion, les chaînes de mot de passe sont chiffrées automatiquement avant d’être écrites dans les fichiers de configuration XML. Cela offre une meilleure sécurité de mot de passe que le stockage de mots de passe non chiffrés.
pingingEnabled Attribut booléen facultatif.

Spécifie si le test ping est activé pour le processus de travail.

La valeur par défaut est true.
pingInterval Attribut timeSpan facultatif.

Spécifie le temps entre les tests ping de surveillance de l’intégrité que le service WWW envoie à un processus de travail.

La valeur par défaut est 00:00:30 (30 secondes).
pingResponseTime Attribut timeSpan facultatif.

Spécifie le temps dont un processus de travail dispose pour répondre à un test ping de surveillance de l’intégrité. Une fois la limite de temps dépassée, le service WWW met fin au processus de travail.

La valeur par défaut est 00:01:30 (1 minute 30 secondes).
requestQueueDelegatorIdentity Attribut String facultatif.

Spécifie l’identité du compte qui a l’autorisation de déléguer des requêtes HTTP au pool d’applications.

Remarque : cet attribut n’est pas disponible dans l’IU du Gestionnaire Internet Information Services (IIS).
setProfileEnvironment Attribut booléen facultatif.

Lorsque setProfileEnvironment est défini sur True, WAS crée un bloc d’environnement à transmettre à CreateProcessAsUser lors de la création d’un processus de travail. Cela garantit que l’environnement est défini en fonction du profil utilisateur pour le nouveau processus.

La valeur par défaut est True.
shutdownTimeLimit Attribut timeSpan facultatif.

Spécifie le temps d’attente du service W3SVC après avoir lancé un recyclage. Si le processus de travail ne s’arrête pas en shutdownTimeLimit, il est arrêté par le service W3SVC.

La valeur par défaut est 00:01:30 (1 minute 30 secondes).
startupTimeLimit Attribut timeSpan facultatif.

Spécifie le temps pendant lequel IIS attend qu’un pool d’applications démarre. Si le pool d’applications ne démarre pas en startupTimeLimit, le processus de travail est arrêté et le nombre de protection rapide en cas d’échec est incrémenté.

La valeur par défaut est 00:01:30 (1 minute 30 secondes).
userName Attribut de chaîne facultatif.

Spécifie l’identité sous laquelle le pool d’applications s’exécute quand identityType est SpecificUser.

Éléments enfants

Aucune.

Exemple Configuration

L’exemple de configuration suivant utilise l’élément de pool d’applications <add> pour créer un pool d’applications nommé Contoso. L’élément <recycling> configure la journalisation des redémarrages du pool d’applications, l’élément <periodicRestart> configure le redémarrage du pool d’applications et l’élément <processModel> configure les attributs shutdownTimeLimit et startupTimeLimit d’arrêt et de démarrage des processus de travail dans le pool d’applications à 30 secondes chacun. Si ces limites de temps sont dépassées, IIS met fin au processus de travail.

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

Exemple de code

Les exemples suivants modifient les valeurs de propriété processModel.shutdownTimeLimit et processModule.startupTimeLimit à 30 secondes chacune pour un pool d’applications nommé Contoso.

AppCmd.exe

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

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

Vous pouvez également utiliser la syntaxe suivante :

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

Remarque

Vous devez veiller à définir le paramètre commit sur apphost quand vous utilisez AppCmd.exe pour configurer ces paramètres. Cela valide les paramètres de configuration dans la section d’emplacement appropriée dans le fichier 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