WMI로 IIS 7의 응용 프로그램 및 응용 프로그램 풀 관리하기

등록일시: 2007-12-26 11:29,  수정일시: 2013-11-28 15:10
조회수: 11,976
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

서론

간단한 WMI 스크립트를 사용하면 비교적 쉽게 IIS 7.0의 응용 프로그램과 응용 프로그램 풀을 관리할 수 있습니다. 본문에서는 간단한 몇 줄의 VBScript 코드만 사용해서 다음과 같은 작업들을 수행하는 방법을 살펴보려고 합니다:

  • 응용 프로그램을 생성하고 열거하는 방법
  • 응용 프로그램 풀을 생성하고, 구성하고, 삭제하는 방법
  • 응용 프로그램 풀을 시작하고, 중지하고, 재생하는 방법
  • 응용 프로그램 풀의 상태를 조회하는 방법
  • 서버상에 존재하는 모든 응용 프로그램 풀의 목록을 얻는 방법

첫 번째 단계

  • IIS 설치 및 스크립팅 활성화 *
    • 만약, 윈도우 비스타를 사용중이라면 제어판에서 "프로그램 및 기능"을 열고 "Windows 기능 사용/사용 안 함"을 실행합니다. 그리고, "웹 관리 도구" 하위의 "IIS 관리 스크립트 및 도구" 항목을 선택해서 스크립팅을 활성화시킵니다.
    • 만약, 롱혼 서버를 사용중이라면 서버 관리자를 실행합니다. 그리고, Add Roles Wizard를 사용해서 IIS 웹 서버를 설치합니다. 설치 과정 중, Select Role Services 페이지에서 Management Tools 하위의 "IIS Management Scripts and Tools" 항목을 선택합니다.
  • 관리자 권한으로 명령 프롬프트를 실행합니다. 명령 프롬프트가 관리자 권한으로 실행되면 이 명령 프롬프트에서 실행되는 모든 응용 프로그램들이 관리자 권한으로 실행됩니다. 또한, 스크립트 파일을 .VBS 확장자를 가진 텍스트 파일 형식으로 저장하십시오. 이런 스크립트 파일들은 명령 프롬프트에서 "cscript.exe <scriptname>.vbs" 형식의 명령을 입력해서 실행할 수 있습니다.
  • 본문의 내용을 시작하기 전에 먼저 System32\inetsrv\config\applicationhost.config 파일의 백업본을 만들어 두십시오. 이 백업본 파일을 다시 덮어 쓰는 것만으로도 IIS를 기존 상태로 복구할 수 있습니다. **

* 기본적으로 본문의 원문은 2007년 4월 경에 비스타와 2008 베타 3을 기준으로 작성된 문서입니다. 그러나, 번역문은 가장 최신 버전인 RC1에서 거의 대부분의 테스트를 마친 결과를 반영한 것입니다. 결과만 얘기하면 사소한 몇 가지를 제외하고는 큰 변화는 존재하지 않습니다.

** 민망하지만 사실입니다. WMI에 관한 이전 두 번역 문서에서 설명했던 APPCMD 명령어를 사용한 백업 및 복구는 큰 의미가 없습니다. 파일을 복사해뒀다가 다시 덮어쓰기만 하면 다시 복구되기 때문입니다. 그러나, 제 입장에서는 직접 작성한 문서도 아니고 번역한 문서의 내용을 마음대로 변경할 수는 없었고, 배치 파일 등을 작성할 때는 제법 쓸모있는 명령어 구문이라고 판단되어 그대로 번역했습니다.

응용 프로그램을 생성하고 열거하는 방법

WMI 스크립팅을 이용하면 크게 어렵지 않게 IIS 7.0 응용 프로그램을 생성하거나 열거할 수 있습니다.

응용 프로그램 생성

응용 프로그램을 생성하려면 IIS 7.0에서 제공하는 새로운 응용 프로그램 생성 메서드를 사용해야 합니다. 이 메서드는 정적 메서드로 문자열 형식인 ApplicationPath와 SiteName이라는 두 개의 인자를 필수로 요구합니다. ApplicationPath 인자에는 생성하려는 응용 프로그램의 가상 경로를 지정하고, SiteName 인자에는 응용 프로그램이 생성될 웹 사이트의 이름을 지정합니다. 세 번째 인자인 PhysicalPath는 옵션으로 디스크 상의 응용 프로그램 경로를 지정합니다.

이 두 개의 인자, ApplicationPath 인자와 SiteName 인자는 키 속성이며 일단 응용 프로그램이 생성된 뒤에는 변경이 불가능합니다. (사용자 인터페이스에서 ApplicationPath는 "가상 경로"라는 이름으로 나타납니다.)

다음 스크립트는 기본 웹 사이트에 "NewApp"라는 이름의 새로운 응용 프로그램을 생성합니다. Application 클래스 정의를 통해서 Create 메서드를 호출하는 방식을 자세히 살펴보시기 바랍니다.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' 새로운 응용 프로그램을 위한 Path 인자, SiteName 인자, PhysicalPath 인자를 정의합니다.
strApplicationPath = "/NewApp"
strSiteName = "Default Web Site"
strPhysicalPath = "D:\inetpub\NewApp"

' 새로운 응용 프로그램을 생성합니다.
oWebAdmin.Get("Application").Create strApplicationPath, strSiteName, strPhysicalPath

반드시 ApplicationPath 인자와 SiteName 인자를 지정해야만 응용 프로그램이 정상적으로 생성되므로 주의하시기 바랍니다. 그리고, 상황에 따라서 PhysicalPath 인자를 지정해야 할 경우도 있는데, 만약 PhysicalPath 인자에 실제로 존재하지 않는 디렉터리를 지정하면 자동으로 해당 디렉터리가 생성되지는 않습니다. 스크립트는 아무런 오류 메시지도 발생하지 않고 실행되며 실제로 IIS 관리자에는 새로운 응용 프로그램 노드가 나타나게 됩니다. 그러나, 막상 새로운 응용 프로그램 노드를 열기 위해서 마우스로 더블 클릭해보면, "'<path>' 경로의 일부를 찾을 수 없습니다."라는 오류가 발생할 것입니다. *

응용 프로그램 열거

일단, 새로운 응용 프로그램을 생성했다면 WMI를 사용해서 손쉽게 이 응용 프로그램의 속성들을 출력할 수 있습니다.

다음의 VBScript는 서버에 존재하는 각각의 응용 프로그램에 대한 사이트명, 응용 프로그램 경로, 응용 프로그램 풀, 그리고 활성화된 프로토콜들을 보여줍니다. 이 스크립트에서는 WMI의 InstancesOf 메서드를 사용해서 전체 응용 프로그램 목록을 조회하고 반복해서 속성값을 출력합니다.

' WMI WebAdministration 네임스페이스에 연결합니다.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' InstancesOf 메서드를 사용해서 응용 프로그램 목록을 조회합니다.
Set oApps = oWebAdmin.InstancesOf("Application")

  ' 응용 프로그램에 대한 반복처리를 수행합니다.
For Each oApp In oApps
    WScript.Echo "  Web site/Application: " & oApp.SiteName & oApp.Path
    WScript.Echo "      Application Pool: " & oApp.ApplicationPool
    WScript.Echo "   Enabled protocol(s): " & oApp.EnabledProtocols
    WScript.Echo
Next

그러면, 이번에는 웹 응용 프로그램을 호스트해주는 응용 프로그램 풀을 생성하고, 구성하고, 관리하는 방법을 살펴보겠습니다.

* 비스타 SP 1 RTM에서 직접 테스트를 해보니 다음과 같은 오류가 발생했습니다.

그리고, 2008 RC1에서 테스트를 해보니 이번에는 다음과 같은 오류가 발생했습니다.

응용 프로그램 풀을 생성하고, 구성하는 방법

이 단락에서는 WMI 스크립트를 사용해서 응용 프로그램 풀 관련 작업을 처리하기 위한 기본적이고 중요한 내용들을 살펴봅니다. 응용 프로그램 풀은 하나 이상의 응용 프로그램을 하나 이상의 작업자 프로세스와 연결해주는 역할을 합니다. 응용 프로그램 풀은 각각의 응용 프로그램들을 서로 격리해주며, 결과적으로 이와 같은 격리는 보안성과 신뢰성을 높여줍니다.

응용 프로그램 풀 생성

응용 프로그램 풀을 생성하려면 IIS 7.0 ApplicationPool 클래스의 Create 메서드를 사용합니다. 이 정적 메서드에는 두 개의 인자가 존재하는데, 첫 번째는 AppPoolName 인자로 문자열 형식의 필수적인 인자며 새로운 응용 프로그램 풀의 이름을 지정하고, 두 번째는 AutoStart 인자로 불린 형식의 옵션 인자입니다.

그 중, AutoStart 인자의 기본값은 true며, 생성한 응용 프로그램 풀이 생성된 직후나 IIS가 시작된 직후에 자동적으로 실행될지 여부를 지정합니다. 만약, AutoStart 인자를 false로 지정한다면 해당 응용 프로그램 풀은 수작업으로 실행시켜야 합니다. 그러나, 응용 프로그램 풀이 시작되기 전에 해당 응용 프로그램 풀에 할당된 응용 프로그램을 구성하거나 콘텐츠를 수정하기 원하는 경우에는 자동 시작을 비활성화하는 것이 매우 유용할 것입니다.

다음의 샘플 코드에서는 단 두 줄의 코드를 사용해서 "NewAppPool"이라는 이름의 응용 프로그램을 생성합니다. 여기서 Create 메서드가 호출되는 방식, 즉 ApplicationPool의 인스턴스가 아닌 클래스 정의를 사용해서 호출된다는 점을 주의 깊게 살펴보시기 바랍니다. *:

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

oWebAdmin.Get("ApplicationPool").Create("NewAppPool")

대화식으로 응용 프로그램 풀을 생성하는 방법

몇 줄의 코드를 더 추가하면, 입력 대화 상자를 통해 대화식으로 응용 프로그램 풀을 생성하는 유용한 스크립트를 작성할 수도 있습니다.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

strNewAppPoolName = InputBox("Enter the name for the new application pool.")
If strNewAppPoolName <> "" Then
    oWebAdmin.Get("ApplicationPool").Create(strNewAppPoolName)
End If

응용 프로그램을 응용 프로그램 풀에 할당하기

응용 프로그램 풀을 생성했으므로 응용 프로그램을 응용 프로그램 풀에 할당해보도록 하겠습니다. WMI 스크립트를 사용해서 응용 프로그램의 응용 프로그램 풀을 수정하는 것은 매우 손쉬운 일이지만 반드시 기억해야 할 중요한 사실이 두 가지 있습니다. 먼저, IIS는 지정한 응용 프로그램 풀이 실제로 존재하는지 점검해주지 않기 때문에 이를 반드시 확인해야 합니다. 그리고, 응용 프로그램 풀을 할당한 내용을 저장하려면, 반드시 Put_ 메서드를 호출해야 한다는 점을 기억하십시오. Application 클래스는 WMI로부터 Put_ 메서드를 상속받습니다.

다음 스크립트는 기본 웹 사이트의 "/MyApp" 응용 프로그램의 응용 프로그램 풀을 "NewAppPool"로 변경합니다. **:

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
    
' MyApp 응용 프로그램을 얻습니다.
Set oApp = oWebAdmin.Get("Application.SiteName='Default Web Site',Path='/NewApp'")
WScript.Echo "Application Web site and Path: '" & oApp.SiteName & oApp.Path & "'"
WScript.Echo "Old application pool: " & oApp.ApplicationPool
WScript.Echo

' 새로운 응용 프로그램 풀의 이름을 지정합니다.
oApp.ApplicationPool = "NewAppPool"

' 변경 사항을 저장합니다.
oApp.Put_

' 새로운 응용 프로그램 풀의 이름을 출력합니다.
WScript.Echo
WScript.Echo "New application pool: " & oApp.ApplicationPool

응용 프로그램 풀 삭제

만약, 더 이상 사용하지 않는 응용 프로그램 풀을 제거하고자 한다면 WMI로부터 상속받은 ApplicationPool 클래스의 Delete_ 메서드를 사용하면 됩니다.

다음 스크립트는 "UnwantedAppPool"라는 이름의 응용 프로그램 풀을 삭제합니다.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

Set oAppPools = oWebAdmin.InstancesOf("ApplicationPool")
For Each oAppPool In oAppPools
    If oAppPool.Name = "OneMoreAppPool" Then
        oAppPool.Delete_
        Exit For
    End If
Next

웹 사이트의 기본 응용 프로그램 풀 설정

만약, 특정 웹 사이트에 존재하는 모든 응용 프로그램의 기본 응용 프로그램 풀을 직접 생성한 응용 프로그램 풀로 지정하고 싶다면 Site 개체의 ApplicationDefaults.ApplicationPool 속성을 사용하면 됩니다. 다시 한 번 강조하지만, 변경 내용을 저장하기 위해서는 반드시 Site 개체의 Put_ 메서드를 호출해야 합니다.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' 기본 웹 사이트를 얻습니다.
Set oSite = oWebAdmin.Get("Site.Name='Default Web Site'")

' 기본 응용 프로그램 풀 이름을 지정합니다.
oSite.ApplicationDefaults.ApplicationPool = "NewAppPool"

' 변경 사항을 저장합니다.
oSite.Put_

* 본문의 스크립트처럼 파이프라인 모드를 지정하지 않고 응용 프로그램 풀을 생성하면 다음과 같이 파이프라인 모드가 통합 모드로 생성됩니다.

** 이 스크립트를 테스트 할 때, 테스트에 사용되는 응용 프로그램의 이름에 주의하시기 바랍니다. 본문의 다른 스크립트 샘플 코드들은 "/NewApp"라는 이름의 응용 프로그램을 대상으로 작업을 수행하지만, 이 스크립트 샘플 코드만은 "/MyApp"라는 이름의 응용 프로그램을 대상으로 작업을 수행하고 있습니다. 따라서, 코드를 그대로 복사해서 실행하면 전혀 예상하지 못했던 오류를 만나게 될 것입니다.

응용 프로그램 풀을 관리하는 방법

또한, WMI 스크립트를 사용하면 손쉽게 응용 프로그램 풀을 시작하거나 중지하고, 재생할 수 있습니다. 이번 단락에서는 이런 작업들을 수행하는 방법을 살펴봅니다. 그리고, 추가적으로 응용 프로그램 풀의 현재 상태를 얻는 방법도 살펴보도록 하겠습니다.

응용 프로그램 풀 시작하기

IIS 7.0에서는 IIS 6.0의 IIsApplicationPool.Start 메서드를 대체하는 ApplicationPool.Start 메서드를 제공합니다.

다음과 같은 세 줄에 불과한 스크립트를 사용해서 응용 프로그램 풀을 시작할 수 있습니다:

' WMI WebAdministration 네임스페이스에 연결합니다.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' 응용 프로그램 풀을 지정합니다.
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")

' 응용 프로그램 풀을 시작합니다.
oAppPool.Start

응용 프로그램 풀 중지하기

IIS 7.0에서는 IIS 6.0의 IIsApplicationPool.Stop 메서드를 대체하는 ApplicationPool.Stop 메서드를 제공합니다.

응용 프로그램 풀을 중지하는 코드는 다음과 같습니다:

' WMI WebAdministration 네임스페이스에 연결합니다.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' 응용 프로그램 풀을 지정합니다.
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")

' 응용 프로그램 풀을 중지합니다.
oAppPool.Stop

응용 프로그램 풀 재생하기

IIS 7.0에서는 IIS 6.0의 IIsApplicationPool.Recycle 메서드에 해당하는 ApplicationPool.Recycle 메서드가 제공됩니다.

다음과 같이 응용 프로그램 풀을 재생하는 스크립트 코드는 이전 예제들의 패턴과 유사합니다. 그런데, 한 가지 주의해야 될 점은 Recycle 메서드는 이미 시작된 응용 프로그램 풀을 대상으로만 동작한다는 점입니다. *

' WMI WebAdministration 네임스페이스에 연결합니다.
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' 응용 프로그램 풀을 지정합니다.
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")

' 응용 프로그램 풀을 재생합니다.
oAppPool.Recycle

응용 프로그램 풀의 상태 얻기

응용 프로그램 풀의 런-타임 상태는 ApplicationPool 개체의 GetState 메서드를 사용해서 얻을 수 있으며 그 결과값으로 0에서 4사이의 열거형 값이 리턴됩니다. 다음 예제 코드는 리턴값의 의미와 사용자 정의 함수를 사용해서 그 의미를 출력하는 방법을 보여줍니다. IIS 6.0에는 이 메서드에 직접적으로 해당하는 메서드가 존재하지 않습니다.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='DefaultAppPool'")

' 응용 프로그램 풀의 이름과 상태를 얻습니다.
WScript.Echo oAppPool.Name & " is " & GetStateDescription(oAppPool.GetState) & "."

' 리턴값을 텍스트로 변환해주는 함수.
Function GetStateDescription(StateCode)
    Select Case StateCode
        Case 0
            GetStateDescription = "Starting"
        Case 1
            GetStateDescription = "Started"
        Case 2
            GetStateDescription = "Stopping"
        Case 3
            GetStateDescription = "Stopped"
        Case 4
            GetStateDescription = "Unknown"
        Case Else
            GetStateDescription = "Undefined value."
    End Select
End Function

여기서 리턴된 값은 스크립트가 실행되는 시점의 응용 프로그램 풀 상태만 반영한다는 점을 기억하시기 바랍니다. 따라서, 이 리턴값은 실시간 결과를 반영하는 것은 아닙니다. 만약 실시간 상태를 얻고 싶다면, 특정 응용 프로그램 풀이나 응용 프로그램 풀들의 상태를 점검하기 위해 일정한 주기마다 스크립트가 실행되도록 스케쥴을 설정할 수 있습니다.

서버상에 존재하는 응용 프로그램 풀들의 목록 얻기

모든 응용 프로그램 풀들의 목록을 얻고, 각 응용 프로그램 풀들의 속성을 출력하는 등의 반복적인 작업을 처리하려면 WMI InstancesOf 메서드를 사용할 수 있습니다. 다음 코드는 응용 프로그램 풀과 그 모드(통합 모드, 또는 ISAPI 모드)를 출력합니다.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppPools = oWebAdmin.InstancesOf("ApplicationPool")

For Each oAppPool In oAppPools
    WScript.Echo "Application pool name: " & oAppPool.Name
    If oAppPool.ManagedPipelineMode = 0 Then
        sAppPoolMode = "Integrated"
    ElseIf oAppPool.ManagedPipelineMode = 1 Then
        sAppPoolMode = "ISAPI"
    End if
    WScript.Echo "Application pool mode: " & sAppPoolMode
    WScript.Echo 
Next

이 스크립트를 실행시켜보면 아마도 다음과 비슷한 출력 결과를 확인할 수 있을 것입니다:

Application pool name: DefaultAppPool
Application pool mode: Integrated

Application pool name: Classic .NET AppPool
Application pool mode: ISAPI

통합 모드 vs. ISAPI 모드 **

만약, 관리되는 응용 프로그램이 통합 모드의 응용 프로그램 풀에서 실행된다면 서버는 요청을 처리하기 위해 IIS와 ASP.NET의 통합 요청 처리 파이프라인을 사용하게 됩니다. 그러나, 관리되는 응용 프로그램이 ISAPI 모드의 응용 프로그램 풀에서 실행된다면 서버는 요청을 처리하기 위해 IIS 6.0에서 사용되던 것과 같은 Aspnet_isapi.dll을 사용한 관리되는 코드 처리를 수행할 것입니다.

거의 대부분의 관리되는 응용 프로그램은 통합 모드에서 실행될 수 있지만 일부 응용 프로그램은 호환성을 이유로 ISAPI 모드에서 실행되어야 합니다. 따라서, 일단 먼저 통합 모드에서 응용 프로그램을 테스트해 본 다음, ISAPI 모드가 정말로 필요한지 결정하시기를 권해드립니다.

* 단적으로 중지되어 있는 응용 프로그램 풀을 재생시키기 위해서 ApplicationPool.Recycle 메서드를 호출하면 오류가 발생합니다.

** 본문에서 사용되고 있는 "통합 모드"와 "ISAPI 모드"라는 용어는, 마이크로소프트의 다른 문서에서는 각각 "IIS 7.0 통합 모드"와 "클래식 ASP.NET 통합 모드"라고 사용되는 경우가 더 많습니다. 그러나, 이미 한글화가 완료된 비스타를 기준으로 살펴보면 단순히 "통합 모드"와 "클래식 모드"라는 용어가 사용되고 있으므로 한글 용어는 가급적이면 이를 따르는 것이 좋을 것입니다.

이 두 모드의 차이점을 가장 간단하게 살펴보려면 다음의 링크를 클릭해서 IIS.net에서 제공해주는 이미지를 살펴보시기 바랍니다. 여러가지 다양한 이슈들이 이 두 장에 그림에 모두 녹아있습니다.

결론

본문에서는 WMI 스크립트를 사용해서 다음과 같은 기본적인 작업들을 처리하는 방법을 살펴봤습니다:

  • 응용 프로그램을 생성하고 열거하는 방법
  • 응용 프로그램 풀을 생성하고, 구성하고, 삭제하는 방법
  • 응용 프로그램 풀을 시작하고, 중지하고, 재생하는 방법
  • 응용 프로그램 풀의 상태를 조회하는 방법
  • 서버상에 존재하는 모든 응용 프로그램 풀의 목록을 얻는 방법

응용 프로그램과 응용 프로그램 풀에는 본문에서 다루지 않은 추가적인 기능들이 존재합니다. 보다 많은 정보를 보시려면 IIS 7.0 WMI Provider Reference 문서를 살펴보시기 바랍니다. *

* WMI 스크립트를 사용해서 IIS 7.0을 관리하려면 본문에서 소개하는 WMI 공급자 레퍼런스를 꼼꼼히 검토해 볼 필요가 있습니다. 그러나, 별다른 문제가 없고 관리되는 프로그램(.NET)을 사용하는 환경이라면 WMI 대신 MWA를 사용하는 것을 더 권장합니다. 이에 관해서는 제가 번역해서 MSDN에 기고한 Microsoft.Web.Administration.dll 관련 문서를 참고하시기 바랍니다.