다음을 통해 공유


애플리케이션 풀 <프로세스에 대한 프로세스 모델 설정모델>

개요

요소를 사용하여 <processModel> IIS 7 이상에서 애플리케이션 풀의 많은 보안, 성능, 상태 및 안정성 기능을 구성할 수 있습니다. 여기에는 다음 기능이 포함됩니다.

  • 애플리케이션 풀 ID- 애플리케이션 풀의 작업자 프로세스가 실행되는 서비스 또는 사용자 계정의 이름입니다. 이는 identityType 특성에 의해 정의됩니다. 기본적으로 IIS 7.5부터 애플리케이션 풀은 WAS(Windows Process Activation Service)에 의해 동적으로 만들어지는 기본 제공 ApplicationPoolIdentity 계정에서 실행됩니다. (IIS 7.0에서 기본 ID는 NetworkService 계정이었습니다.) identityType 특성 값을 기본 제공 NetworkService 계정, LocalService 계정, 기본 제공 LocalSystem 계정 또는 만든 사용자 지정 계정으로 변경할 수 있습니다. 사용자 지정 계정을 선택하는 경우 userName암호 특성을 사용하여 계정 자격 증명을 정의합니다. 그러나 NetworkService, LocalServiceLocalSystem 계정에는 ApplicationPoolIdentity 계정보다 더 많은 사용자 권한이 있습니다. (경고: 높은 수준의 사용자 권한을 사용하여 애플리케이션 풀을 실행하는 것은 심각한 보안 위험입니다.) 또한 logonType 특성을 사용하여 프로세스 ID가 일괄 처리 사용자 또는 서비스로 로그온해야 하는지 여부를 지정할 수 있습니다. (로그온 형식에 대한 자세한 내용은 LogonUser 함수 문서를 참조하세요.)
  • maxProcesses 특성을 설정하여 구성할 수 있는 NUMA(Non-Uniform Memory Access) 하드웨어의 웹 원예 및 사용. 웹 원예의 경우 maxProcesses 를 1보다 큰 값으로 참조하세요. NUMA 하드웨어를 사용하려면 maxProcesses 를 "0" 값으로 설정하여 IIS가 NUMA 노드와 동일한 수의 작업자 프로세스를 실행하도록 지정합니다.
  • 유휴 시간 제한 설정- 작업자 프로세스가 종료되기 전에 유휴 상태로 유지되는 기간을 설정할 수 있습니다. idleTimeout 특성을 편집하여 이 설정을 구성합니다.
  • 작업자 프로세스에 대해 ping을 사용하도록 설정하여 상태 모니터링, 작업자 프로세스가 ping에 응답하는 데 허용되는 최대 시간 및 상태를 모니터링하기 위해 작업자 프로세스로 전송되는 ping의 빈도입니다. pingEnabled, pingIntervalpingResponseTime 특성을 편집하여 이러한 설정을 구성합니다.
  • 작업자 프로세스 종료 및 시작 시간 제한 첫 번째 제한은 shutdownTimeLimit 특성에 의해 설정되며 IIS 7 이상에서 작업자 프로세스를 제공하여 WWW 서비스가 작업자 프로세스를 종료하기 전에 모든 요청을 완료하는 간격을 결정합니다. 두 번째 제한은 startupTimeLimit 특성에 의해 설정되며 IIS 7 이상에서 애플리케이션 풀을 시작할 수 있는 시간을 지정합니다.

호환성

버전 참고
IIS 10.0 <processModel> 요소가 IIS 10.0에서 수정되지 않았습니다.
IIS 8.5 특성이 idleTimeoutAction 추가되어 특성 기간 동안 idleTimeout 유휴 상태인 작업자 프로세스를 종료하거나 일시 중단할 수 있습니다.
IIS 8.0 특성이 setProfileEnvironment 추가되어 새 프로세스에 대한 사용자 프로필에 따라 환경을 설정할 수 있습니다. NUMA(Uniform Memory Access)에 대한 지원을 포함하여 특성에 대한 값이 추가 maxProcesses 되었습니다. logEventOnProcessModel 프로세스에서 수행된 작업이 기록되도록 지정하기 위해 특성이 추가되었습니다.
IIS 7.5 <processModel> 요소의 <add> 요소는 IIS 7.5에서 새 ApplicationPoolIdentity를 사용하여 애플리케이션을 실행하고 프로세스 ID에 대한 로그인 유형을 지정할 수 있는 설정을 포함하도록 업데이트되었습니다.
IIS 7.0 요소는 <processModel> IIS 7.0에서 도입되었습니다.
IIS 6.0 요소는 <processModel> IIS 6.0 IIsApplicationPools 메타베이스 개체의 일부 설정을 대체합니다.

설치 프로그램

컬렉션은 <applicationPools> IIS 7 이상의 기본 설치에 포함되어 있습니다.

방법

프로세스 모델 구성 설정을 편집하는 방법

  1. IIS(인터넷 정보 서비스) 관리자를 엽니다.

    • Windows Server 2012 사용하거나 R2를 Windows Server 2012 경우:

      • 작업 표시줄에서 서버 관리자 클릭하고 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 클릭합니다.
    • Windows 8 사용하거나 Windows 8.1 경우:

      • Windows 키를 누른 채로 문자 X를 누른 다음 제어판 클릭합니다.
      • 관리 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
    • Windows Server 2008 또는 Windows Server 2008 R2를 사용하는 경우:

      • 작업 표시줄에서 시작을 클릭하고 관리 도구를 가리킨 다음 IIS(인터넷 정보 서비스) 관리자를 클릭합니다.
    • Windows Vista 또는 Windows 7을 사용하는 경우:

      • 작업 표시줄에서 시작을 클릭한 다음 제어판 클릭합니다.
      • 관리 도구를 두 번 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
  2. 연결 창에서 서버 이름을 확장하고 애플리케이션 풀을 클릭한 다음 편집할 애플리케이션 풀을 클릭합니다. 애플리케이션 풀 페이지를 표시하는 I S Manager 창의 스크린샷

  3. 작업 창에서 고급 설정...을 클릭합니다.

  4. 고급 설정 대화 상자에서 편집할 프로세스 모델 속성을 클릭한 다음 대화 상자의 속성 값 섹션에서 편집한 다음 확인을 클릭합니다. 예를 들어 종료 시간 제한(초)시작 시간 제한(초)을30으로 변경합니다.
    고급 설정 대화 상자의 스크린샷 프로세스 모델이 강조 표시됩니다.

NUMA(Uniform Memory Access) 하드웨어에서 사용할 IIS를 구성하는 방법

  1. IIS(인터넷 정보 서비스) 관리자를 엽니다.

    • Windows Server 2012 이상을 사용하는 경우:

      • 작업 표시줄에서 서버 관리자 클릭하고 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 클릭합니다.
    • Windows 8 이상을 사용하는 경우:

      • Windows 키를 누른 채로 문자 X를 누른 다음 제어판 클릭합니다.
      • 관리 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
  2. 연결 창에서 서버 이름을 확장한 다음 애플리케이션 풀을 클릭합니다.

  3. 애플리케이션 풀 창에서 NUMA에 대해 구성할 풀을 선택합니다.

  4. 작업 창에서 고급 설정을 선택합니다.

  5. 프로세스 모델 창에서 최대 작업자 프로세스를0설정합니다.

    고급 설정 창의 스크린샷 목록에서 최대 작업자 프로세스가 강조 표시됩니다.

유휴 시간 제한 작업을 구성하는 방법

  1. IIS(인터넷 정보 서비스) 관리자를 엽니다.

    • Windows Server 2012 R2를 사용하는 경우:

      • 작업 표시줄에서 서버 관리자 클릭하고 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 클릭합니다.
    • Windows 8.1 사용하는 경우:

      • Windows 키를 누른 채로 문자 X를 누른 다음 제어판 클릭합니다.
      • 관리 도구를 클릭한 다음 IIS(인터넷 정보 서비스) 관리자를 두 번 클릭합니다.
  2. 연결 창에서 서버 이름을 두 번 클릭하고 애플리케이션 풀을 두 번 클릭한 다음 구성할 애플리케이션 풀을 선택합니다.

  3. 작업 창에서 고급 설정을 클릭합니다.

  4. 고급 설정 대화 상자의 프로세스 모델 섹션에서 idleTimeoutAction에 대해 종료 또는 일시 중단 선택합니다.

  5. 확인을 클릭합니다.

    고급 설정 대화 상자의 스크린샷 유휴 시간 제한 작업이 강조 표시되고 드롭다운 메뉴에서 종료가 선택됩니다.

구성

ApplicationHost.config 파일의 서버 수준에서 요소를 구성 <processModel> 합니다.

특성

attribute Description
identityType 선택적 열거형 특성입니다.

애플리케이션 풀이 실행되는 계정 ID를 지정합니다.

참고: IIS 7.5부터 기본값은 ApplicationPoolIdentity입니다. (IIS 7.0에서 기본값은 이었습니다 NetworkService.)

identityType 특성은 다음과 같은 가능한 값 중 하나일 수 있습니다. 기본값은 입니다NetworkService.

Description
ApplicationPoolIdentity 애플리케이션 풀이 동적으로 생성된 애플리케이션 풀 ID 계정에서 실행되도록 지정합니다. IIS 7.5 ApplicationPoolIdentity 부터 는 애플리케이션 풀을 실행할 기본 ID입니다. (IIS 7.0에서는 기본 ID가 였습니다 NetworkService.)

애플리케이션 풀이 ApplicationPoolIdentity 계정으로 실행되면 애플리케이션 풀은 리소스에 "IIS AppPool< AppPool>" ID입니다. 예를 들어 "DefaultAppPool"의 경우 ID는 "IIS AppPool\DefaultAppPool"입니다. 이 ID를 사용하면 관리자가 애플리케이션 풀이 실행 중인 ID와 관련된 사용 권한을 지정할 수 있으므로 서버 보안이 강화됩니다.

숫자 값은 입니다 4.
LocalService 애플리케이션 풀이 NetworkService와 동일한 사용자 권한이 있는 기본 제공 LocalService 계정으로 실행되도록 지정합니다.

애플리케이션 풀이 LocalService 계정으로 실행되면 애플리케이션 풀은 네트워크에서 익명 자격 증명을 제공합니다.

참고: 높은 수준의 사용자 권한이 있는 계정으로 애플리케이션 풀을 실행하는 것은 심각한 보안 위험입니다.

숫자 값은 입니다 1.
LocalSystem 애플리케이션 풀이 로컬 컴퓨터에 대한 광범위한 권한을 가지며 네트워크의 컴퓨터 역할을 하는 기본 제공 LocalSystem 계정으로 실행되도록 지정합니다.

참고: 높은 수준의 사용자 권한이 있는 계정으로 애플리케이션 풀을 실행하는 것은 심각한 보안 위험입니다.

숫자 값은 입니다 0.
NetworkService 애플리케이션 풀이 기본 제공 NetworkService 계정으로 실행되도록 지정합니다. IIS 7.0에서는 애플리케이션 풀을 실행할 기본 ID입니다. 의 IIS 7.5 기본값은 로 ApplicationPoolIdentity변경되었습니다.

애플리케이션 풀이 NetworkService 계정으로 실행되면 애플리케이션 풀은 컴퓨터 계정으로 네트워크 리소스에 액세스합니다.

숫자 값은 입니다 2.
SpecificUser 사용자 이름 및암호 특성을 사용하여 구성된 사용자 지정 ID에서 애플리케이션 풀이 실행되도록 지정합니다.

참고: 암호화되지 않은 암호 문자열을 구성 파일에 저장하지 않도록 하려면 항상 AppCmd.exe 또는 IIS Manager를 사용하여 암호를 입력합니다. 이러한 관리 도구를 사용하는 경우 암호 문자열은 XML 구성 파일에 기록되기 전에 자동으로 암호화됩니다. 이렇게 하면 암호화되지 않은 암호를 저장하는 것보다 더 나은 암호 보안이 제공됩니다.

참고: 관리 서비스 계정을 사용하여 서비스 및 태스크가 자체 도메인 계정을 공유하고 자동 암호 관리를 사용하도록 설정하여 관리자가 수동으로 암호를 관리할 필요가 없습니다. 자세한 내용은 관리 서비스 계정의 새로운 기능 을 참조하세요.

숫자 값은 입니다 3.
idleTimeout 선택적 timeSpan 특성입니다.

새 요청이 수신되지 않고 작업자 프로세스가 요청을 처리하지 않는 경우 작업자 프로세스가 유휴 상태로 실행되는 시간(분)을 지정합니다. 할당된 시간이 지나면 작업자 프로세스는 WWW 서비스에 의해 종료되도록 요청해야 합니다.

기본값은 00:20:00입니다.

유휴 시간 제한 기능을 사용하지 않도록 설정하려면 이 값을 로 00:00:00설정합니다.
idleTimeoutAction 선택적 열거형 특성입니다.

유휴 시간 제한 기간에 도달할 때 수행할 작업을 지정합니다. IIS 8.5 이전에는 특성 기간 동안 idleTimeout 유휴 상태였던 작업자 프로세스가 종료됩니다. IIS 8.5 후에는 제한에 도달하는 idleTimeout 작업자 프로세스를 종료하거나 메모리에서 디스크로 이동하여 일시 중단할 수 있습니다. 프로세스를 일시 중단하면 종료하는 것보다 시간이 적게 걸리고 메모리가 적게 소비될 수 있습니다.

애플리케이션 초기화의 가짜 요청으로 일시 중단의 유휴 시간 제한 작업을 구성할 수 있습니다(참조 applicationInitialization).

특성에는 idleTimeoutAction 다음과 같은 가능한 값이 있을 수 있습니다. 기본값은 Terminate입니다.
Description
Terminate 유휴 작업자 프로세스를 종료합니다. 이렇게 하려면 이후에 사용자가 사이트에 액세스하고 작업자 프로세스가 시작될 때 더 긴 시작 기간이 필요합니다.

숫자 값은 입니다 0.
Suspend 유휴 작업자 프로세스를 일시 중단합니다. 이렇게 하면 작업자 프로세스가 활성 상태로 유지되지만 메모리에서 디스크로 이동되어 사용된 시스템 리소스가 줄어듭니다. 이후에 요청이 들어오면 메모리 관리자는 디스크에서 메모리로 요청에 필요한 페이지 파일을 로드하므로 작업자 프로세스를 이전에 종료한 것보다 더 빠르게 사용할 수 있습니다.

숫자 값은 입니다 1.
loadUserProfile 선택적 부울 특성입니다.

IIS가 애플리케이션 풀 ID에 대한 사용자 프로필을 로드하는지 여부를 지정합니다. 이 값을 false로 설정하면 IIS가 IIS 6.0 동작으로 되돌리기. IIS 6.0은 애플리케이션 풀 ID에 대한 사용자 프로필을 로드하지 않습니다.

기본값은 false입니다.
logEventOnProcessModel 선택적 flags 특성입니다.

프로세스에서 수행된 작업이 이벤트 뷰어 기록되도록 지정합니다. IIS 8.0에서 적용되는 유일한 작업은 유휴 시간 제한 작업이며, 유휴 시간 제한 기간 동안 유휴 상태이므로 프로세스가 종료됩니다.

플래그 이름은 과 같습니다 IdleTimeout. 값은 1입니다.

기본값은 IdleTimeout입니다.
logonType 선택적 열거형 특성입니다.

프로세스 ID에 대한 로그온 유형을 지정합니다. (로그온 형식에 대한 자세한 내용은 LogonUser 함수 문서를 참조하세요.)

참고: 이 특성은 IIS 7.5에서 도입되었습니다.

특성은 logonType 다음과 같은 가능한 값 중 하나일 수 있습니다. 기본값은 입니다 LogonBatch.
Description
LogonBatch 애플리케이션 풀 ID가 일괄 처리 사용자로 로그온되도록 지정합니다.

숫자 값은 입니다 0.
LogonService 애플리케이션 풀 ID가 서비스로 로그온되도록 지정합니다.

숫자 값은 입니다 1.
manualGroupMembership 선택적 부울 특성입니다.

IIS_IUSRS 그룹 SID(보안 식별자)가 작업자 프로세스 토큰에 추가되는지 여부를 지정합니다. false이면 IIS는 필요한 파일 및 시스템 리소스에 액세스할 수 있는 기본 제공 IIS_IUSRS 그룹의 구성원인 것처럼 애플리케이션 풀 ID를 자동으로 사용합니다. true이면 애플리케이션 풀 ID를 런타임 시 작업자 프로세스에 필요한 모든 리소스에 명시적으로 추가해야 합니다.

기본값은 false입니다.
maxProcesses 선택적 uint 특성입니다.

애플리케이션 풀에 사용할 최대 작업자 프로세스 수를 나타냅니다.
  • 값 "1"은 애플리케이션 풀에 대한 최대 단일 작업자 프로세스를 나타냅니다. NUMA 노드가 없는 서버의 설정입니다.
  • 값 "2" 이상은 애플리케이션 풀에 여러 작업자 프로세스를 사용하는 웹 정원을 나타냅니다(필요한 경우).
  • 값 "0"은 IIS가 NUMA(비일복 메모리 액세스) 노드와 동일한 수의 작업자 프로세스를 실행한다고 지정합니다. IIS는 하드웨어에서 사용할 수 있는 NUMA 노드 수를 식별하고 동일한 수의 작업자 프로세스를 시작합니다. 예를 들어 4개의 NUMA 노드가 있는 경우 해당 애플리케이션 풀에 대해 최대 4개의 작업자 프로세스를 사용합니다. 이 예제에서 maxProcesses를 "0" 또는 "4" 값으로 설정하면 결과가 동일합니다.
기본값은 1입니다.
password 선택적 문자열 특성입니다.

userName 특성과 연결된 암호를 지정합니다. 이 특성은 identityType 값이 SpecificUser인 경우에만 필요합니다.

참고: 암호화되지 않은 암호 문자열을 구성 파일에 저장하지 않도록 하려면 항상 AppCmd.exe 또는 IIS Manager를 사용하여 암호를 입력합니다. 이러한 관리 도구를 사용하는 경우 암호 문자열은 XML 구성 파일에 기록되기 전에 자동으로 암호화됩니다. 이렇게 하면 암호화되지 않은 암호를 저장하는 것보다 더 나은 암호 보안이 제공됩니다.
pingingEnabled 선택적 부울 특성입니다.

작업자 프로세스에 대해 ping을 사용할 수 있는지 여부를 지정합니다.

기본값은 true입니다.
pingInterval 선택적 timeSpan 특성입니다.

WWW 서비스가 작업자 프로세스에 보내는 상태 모니터링 ping 사이의 시간을 지정합니다.

기본값은 (30초)입니다 00:00:30 .
pingResponseTime 선택적 timeSpan 특성입니다.

상태 모니터링 ping에 응답하기 위해 작업자 프로세스가 제공되는 시간을 지정합니다. 시간 제한을 초과하면 WWW 서비스가 작업자 프로세스를 종료합니다.

기본값은 (1분 30초)입니다 00:01:30 .
requestQueueDelegatorIdentity 선택적 String 특성입니다.

HTTP 요청을 애플리케이션 풀에 위임할 수 있는 권한이 있는 계정 ID를 지정합니다.

참고: 이 특성은 IIS(인터넷 정보 서비스) 관리자 UI에서 사용할 수 없습니다.
setProfileEnvironment 선택적 부울 특성입니다.

setProfileEnvironment가 로 설정된 True경우 WAS는 작업자 프로세스를 만들 때 CreateProcessAsUser에 전달할 환경 블록을 만듭니다. 이렇게 하면 환경이 새 프로세스에 대한 사용자 프로필을 기반으로 설정됩니다.

기본값은 True입니다.
shutdownTimeLimit 선택적 timeSpan 특성입니다.

W3SVC 서비스가 재활용을 시작한 후 대기하는 시간을 지정합니다. worker 프로세스가 shutdownTimeLimit 내에서 종료되지 않으면 W3SVC 서비스에 의해 종료됩니다.

기본값은 (1분 30초)입니다 00:01:30 .
startupTimeLimit 선택적 timeSpan 특성입니다.

IIS가 애플리케이션 풀이 시작될 때까지 대기하는 시간을 지정합니다. startupTimeLimit 내에서 애플리케이션 풀이 시작되지 않으면 작업자 프로세스가 종료되고 빠른 실패 보호 수가 증가합니다.

기본값은 (1분 30초)입니다 00:01:30 .
userName 선택적 문자열 특성입니다.

identityTypeSpecificUser일 때 애플리케이션 풀이 실행되는 ID를 지정합니다.

자식 요소

없음

구성 샘플

다음 구성 샘플에서는 애플리케이션 풀 <add> 요소를 사용하여 Contoso라는 새 애플리케이션 풀을 만듭니다. 요소는 <recycling> 애플리케이션 풀 다시 시작에 대한 로깅을 구성하고, <periodicRestart> 요소는 애플리케이션 풀이 다시 시작될 때 구성하고 <processModel> , 요소는 각각 30초 동안 애플리케이션 풀에서 작업자 프로세스를 종료하고 시작하기 위한 shutdownTimeLimitstartupTimeLimit 특성을 구성합니다. 이러한 시간 제한을 초과하면 IIS는 작업자 프로세스를 종료합니다.

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

샘플 코드

다음 예제에서는 Contoso라는 애플리케이션 풀에 대해 processModel.shutdownTimeLimitprocessModule.startupTimeLimit 속성 값을 각각 30초로 변경합니다.

AppCmd.exe

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

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

다음 구문을 사용할 수도 있습니다.

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

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

참고

AppCmd.exe 사용하여 이러한 설정을 구성할 때 commit 매개 변수 apphost 를 로 설정해야 합니다. 그러면 구성 설정이 ApplicationHost.config 파일의 적절한 위치 섹션에 커밋됩니다.

C#

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

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

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

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

         serverManager.CommitChanges();
      }
   }

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

VB.NET

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

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

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

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

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


End Module

JavaScript

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

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

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

adminManager.CommitChanges();

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

VBScript

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

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

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

adminManager.CommitChanges()

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