EgoCube.IISWebAdmin 컴포넌트 02.

등록일시: 2002-03-15 이전,  수정일시: 2018-04-07 08:46
조회수: 15,699
본문은 최초 작성 이후, 약 22년 이상 지난 문서입니다. 일부 내용은 최근의 현실과 맞지 않거나 동떨어져 있을 수 있으며 문서 내용에 오류가 존재할 수도 있습니다. 또한 본문을 작성하던 당시 필자의 의견과 현재의 의견에 많은 차이가 존재할 수도 있습니다. 이 점, 참고하시기 바랍니다.

GetWebServerState() 메서드와 SetWebServerState() 메서드

이 두 개의 메서드, GetWebServerState() 메서드와 SetWebServerState() 메서드는 지정된 가상 웹 서버의 현재 상태를 리턴하거나 설정해준다. 다시 말해서 GetWebServerState() 메서드는 지정한 가상 웹 서버가 시작됐는지 또는 정지됐는지 등과 같은 현재 상태 정보를 리턴해주고, SetWebServerState() 메서드는 그와는 반대로 지정한 가상 웹 서버를 정지시키거나 시작시키는 등의 작업을 수행하고 그 결과를 리턴해준다. 이 두 메서드들의 정확한 시그니처(Signature)는 각각 다음과 같다.

Public Function GetWebServerState(WebServerIndex As Integer,
                Optional WebServerName As String = "") As Integer

Public Function SetWebServerState(WebServerIndex As Integer,
                StateNumber As Integer,
                Optional WebServerName As String = "") As Integer

먼저 GetWebServerState() 메서드의 사용법부터 살펴보자. 이 메서드는 두 개의 변수를 인자로 받는데, Integer 형의 WebServerIndex 인자는 상태를 얻으려는 가상 웹 서버의 인덱스 값이고, String 형의 WebServerName 인자는 가상 웹 서버가 설정된 웹 서버의 NetBIOS 이름으로, 이 두 번째 인자를 생략할 경우 현재 컴포넌트가 실행되고 있는 웹 브라우저의 NetBIOS 이름이 사용된다.

이 글에서 자주 언급되는 웹 서버가상 웹 서버라는 용어간의 차이점이 잘 이해되지 않는 분들이 계실지도 모른다는 노파심에서 이 용어들의 정의를 정리해보면, 글의 문맥상 전자는 IIS가 설치된 물리적 머신 자체 또는 운영 체제인 Windows 2000/NT Server를 지칭하는 것이고 후자는 IIS 내부적으로 생성 가능한 여러 개의 논리적인 웹 서버들을 의미하는 것이다.

이렇게 IIS는 내부적으로 생성하는 논리적인 웹 서버, 즉 가상 웹 서버를 지원하므로써 적게는 수십 개에서 많게는 수백 개의 가상 웹 서버를 단일 머신에 구축할 수 있는 기능을 제공하고 있다. 잠시 사족을 달자면 IIS에서 다중 가상 웹 서버를 구축하는 방법에는 모두 세 가지가 있는데, 그 중 일반적으로 가장 널리 알려진 방법은 하나의 IP 주소에 여러 개의 Port 번호를 부여하는 방법과 여러 개의 IP 주소를 이용하는 방법이다. 그리고, 마지막 방법은 그다지 잘 알려지지 않은 방법으로 바로 호스트 헤더(Host Header)를 이용하는 것이다.

아무튼 IIS와 가상 웹 서버의 갯수는 일 대 다의 관계를 가지므로, GetWebServerState() 메서드나 SetWebServerState() 메서드를 사용할 때 다수의 가상 웹 서버들 중에서 어떤 가상 웹 서버를 대상으로 작업을 수행할지를 결정해줘야 하는데 WebServerIndex 인자가 바로 이를 지정해주는 역할을 한다.

가상 웹 서버의 인덱스는 1부터 시작해서 순차적으로 증가한다. 따라서, IIS 에서 가장 처음으로 만들어진 가상 웹 서버(일반적으로 '기본 웹 사이트')의 인덱스는 1이 되며, 그 다음으로 만들어진 가상 웹 서버(역시 일반적으로 '관리 웹 사이트')의 인덱스는 2가 된다. 또한, 일단 임의의 가상 웹 서버에 할당된 인덱스는 해당 가상 웹 서버가 삭제될 경우 그냥 사용하지 않는 채로 남겨지게 되며 차후에 새로운 가상 웹 서버가 만들어져 할당될때까지는 그대로 남아있게 된다. 이는 일반 배열의 인덱스와 Collection 객체의 인덱스간의 차이점을 생각해보면 쉽게 이해가 가능할 것이다.

따라서, WebServer_01이라는 이름을 가진 임의의 웹 서버에 설정된 첫 번째 가상 웹 서버의 현재 상태를 알고 싶다면 아래와 같이 ASP 프로그램을 작성하면 된다. 또한, 가상 웹 서버의 현재 상태는 Integer 형의 숫자로 리턴되는데, 그 숫자값에 따른 실제 의미는 코드 상단의 주석부에 나와 있다.

<%
  
  '******************************************************
  '*
  '* 리턴되는 결과값에 따른 가상 웹 서버의 상태
  '*
  '*    1 : 가상 웹 서버가 시작되는 중
  '*    2 : 가상 웹 서버가 시작됨
  '*    3 : 가상 웹 서버가 정지되는 중
  '*    4 : 가상 웹 서버가 정지됨
  '*    5 : 가상 웹 서버가 일시 정지되는 중
  '*    6 : 가상 웹 서버가 일시 정지됨
  '*    7 : 가상 웹 서버가 재시작되는 중
  '*   -1 : 오류
  '*
  '******************************************************

  Dim oIISAdmin

  Set oIISAdmin = Server.CreateObject("EgoCube.IISWebAdmin")
  
  Response.Write "<font size=2>Web Server State :: "
  Response.Write oIISAdmin.GetWebServerState(1, "WebServer_01")
  Response.Write "</font><br>"

  Set oIISAdmin = Nothing

%>

그러나, 이미 IIS상에 많은 수의 가상 웹 서버들이 등록되어 운영되고 있는 상황이라면, 특별한 다른 방법 없이 단순히 인터넷 서비스 관리자만으로 각각의 가상 웹 서버의 인덱스 값을 일괄적으로 알아낸다는 것이 쉬운 일은 아닐 것이다.

일단 프로그래밍으로 IIS에 등록된 모든 가상 웹 서버의 인덱스를 알아내는 가장 간단한 방법은 지난 글에서 설명한 GetWebServerList() 메서드를 이용하는 방법이다. GetWebServerList() 메서드가 리턴하는 RecordSet 객체의 Field들 중, Index Field가 바로 해당 가상 웹 서버의 인덱스 값이다. 또는, Taeyo's ASP & ASP.NET에서 설명했던 MDUtil.exe나 MetaEdit, 또는 Active Directory Browser 같은 유틸리티들을 이용하는 것도 한 방법이다.

그러나, 이도저도 번거롭고 위에서 얘기한 유틸리티들을 다운로드 받기에도 무리가 있는 상황이라면 단지 인터넷 서비스 관리자만을 사용하여 인덱스 값을 알아낼 수 있는 방법도 있는데 사실 알아내야 할 인덱스의 개수가 많을 때는 조금 번거로운 방법이기도 하다. 우선 인터넷 서비스 관리자에서 인덱스 값을 알아내고자 하는 가상 웹 서버의 등록 정보 대화 상자를 열고, 웹 사이트 탭에서 활성 로그 형식 콤보 박스의 오른쪽에 위치한 등록 정보 버튼을 눌러서 다음 그림과 같은 확장 로깅 등록 정보 대화 상자를 띄운다.

'확장 로깅 등록 정보' Dialog-Box

확장 로깅 등록 정보 대화 상자에서 일반 속성 탭의 하단을 살펴보면 로그 파일 이름: 이라는 항목이 출력되는데, 위의 그림의 경우 이 항목에 'W3SVC1\exyymmdd.log'라는 문자열이 출력된 것을 볼 수 있다. 바로 이 문자열에서 'W3SVC1'의 '1'이라는 값이 이 가상 웹 서버의 인덱스 값인 것이다.

SetWebServerState() 메서드는 모두 세 개의 변수를 인자로 받으며, 그 중 두 개는 GetWebServerState() 메서드와 동일한 것이다. 추가된 또 하나의 인자는 Integer 형의 StateNumber로서 지정된 가상 웹 서버가 변경될 상태를 지정한다. SetWebServerState() 메서드는 모든 과정이 정상적으로 실행되면 그 결과를 Integer 형의 숫자로 리턴해주며, 그 값과 의미는 GetWebServerState() 메서드가 리턴해주는 값과 동일하다.

따라서, WebServer_01 이라는 이름을 가진 가상의 웹 서버에 설정된 첫 번째 가상 웹 서버를 중지하고 싶다면 다음과 같이 ASP 프로그램을 작성하면 된다. 이때 가상 웹 서버의 상태를 지정할 StateNumber 인자에 지정 가능한 숫자값과 그 숫자값에 따른 실제 의미는 코드 상단의 주석부에 나와 있다.

<%
  
  '******************************************************
  '*
  '* 가상 웹 서버의 상태를 지정하는 값
  '*
  '*    1 : 가상 웹 서버를 시작시킨다.
  '*    2 : 가상 웹 서버를 정지시킨다.
  '*    3 : 가상 웹 서버를 일시 정지시킨다.
  '*
  '* 리턴되는 결과값에 따른 가상 웹 서버의 상태
  '*
  '*    GetWebServerState() 의 리턴값과 모든 의미가 동일하다.
  '*
  '******************************************************

  Dim oIISAdmin

  Set oIISAdmin = Server.CreateObject("EgoCube.IISWebAdmin")
  
  Response.Write "<font size=2>Web Server State :: "
  Response.Write oIISAdmin.SetWebServerState(1, 2, "WebServer_01")
  Response.Write "</font><br>"

  Set oIISAdmin = Nothing

%>

한 가지 주의해야 할 점은 SetWebServerState() 메서드가 리턴해주는 결과값이 해당 가상 웹 서버의 최종 상태를 반영할 수도 있고 그렇지 않을 수도 있다는 것이다. 예를 들어서 현재 실행이 정지되어 있는 임의의 가상 웹 서버를 SetWebServerState() 메서드를 사용하여 시작시키는 경우, 그 가상 웹 서버의 구동(Wake Up) 시간이 비교적 짧은 경우라면 곧바로 실행 상태로 전환되어 '시작됨'을 의미하는 2가 리턴되겠지만, 구동 시간이 길다면 '시작되는 중'을 의미하는 1이 리턴될 수도 있다는 뜻이다.

그리고, SetWebServerState() 메서드를 사용해서 가상 웹 서버를 정지시키거나 일시 정지시킬 때, 자기 자신을 정지시키거나 일시 정지시키지 않도록 조심해야 한다. 만약, SetWebServerState() 메서드를 사용하는 ASP 프로그램 그 자체가 실행되는 가상 웹 서버를 정지시킨다면 사이트 자체가 올바르게 실행되지 않을 것은 자명한 일이다.

GetWebServerDefaultDoc() 메서드와 SetWebServerDefaultDoc() 메서드

이 GetWebServerDefaultDoc() 메서드와 SetWebServerDefaultDoc() 메서드 역시, 위의 두 메서드와 매우 유사한 구조로 한 쌍을 이루고 있다. 즉, GetWebServerDefaultDoc() 메서드는 지정한 가상 웹 서버의 루트 디렉터리에 현재 설정된 기본 문서들의 목록을 콤마(,)로 연결된 문자열로 리턴해주며, SetWebServerDefaultDoc() 메서드는 이러한 기본 문서들을 사용자가 입력한 값으로 설정한 후 그 결과를 리턴해준다. 이 두 메서드들의 정확한 시그니처는 각각 다음과 같다.

Public Function GetWebServerDefaultDoc(WebServerIndex As Integer,
                Optional WebServerName As String = "") As String
  
Public Function SetWebServerDefaultDoc(WebServerIndex As Integer,
                DefaultDoc As String,
                Optional WebServerName As String = "") As String

이미 IIS의 기본 문서 개념에 대해서는 익히 알고 있을 것이다. 다음 그림은 필자의 작업용 머신에 설치된 기본 웹 사이트의 기본 문서 설정이다.

'기본 문서' 목록

만약, 이 기본 문서 설정을 ASP 프로그램을 사용해서 얻고 싶다면 GetWebServerDefaultDoc() 메서드를 사용하여 다음과 같이 코딩하면 된다. 이 때, 필요한 인자, WebServerIndex와 WebServerName은 언제나처럼 각각 가상 웹 서버의 인덱스 값과 웹 서버의 NetBIOS 이름이다.

<%
  
  '******************************************************
  '*
  '* 기본 웹 사이트의 기본 문서 설정을 얻고 출력한다.
  '*
  '******************************************************

  Dim oIISAdmin

  Set oIISAdmin = Server.CreateObject("EgoCube.IISWebAdmin")
  
  '** 첫 번째 가상 웹 서버를 지정, 머신의 NetBIOS 이름은 생략
  Response.Write "<font size=2>Web Server Default Document :: "
  Response.Write oIISAdmin.GetWebServerDefaultDoc(1)       
  Response.Write "</font><br>"

  Set oIISAdmin = Nothing

%>

이 코드는 문자열 'index.html,Default.htm,Default.asp,iisstart.asp,Default.aspx'를 리턴한다. 콤마로 구분된 파일들의 순서는 기본 문서 설정 목록의 우선 순위와 일치한다.

만약, 이 기본 문서의 설정을 수정하고 싶다면 단순한 문자열 조작 후 SetWebServerDefaultDoc() 메서드를 호출하면 된다. 가령, index.asp를 기본 문서 목록의 제일 상단에 설정하고 싶다면 다음과 같이 코딩하면 된다. 이 때, SetWebServerDefaultDoc() 메서드에 필요한 또 하나의 인자인 String 형의 DefaultDoc 인자는 파일들의 이름이 콤마로 연결된 새롭게 설정하려는 기본 문서 목록 문자열이다.

<%
  
  '******************************************************
  '*
  '* 먼저 기존의 기본 문서 목록을 얻고, 문자열 조작을 통해
  '* 목록의 앞에 문자열 "index.asp," 을 추가한 후 기본 문서
  '* 목록을 재설정한다.
  '*
  '******************************************************

  Dim oIISAdmin
  Dim OldDefaultDocs 
  
  Set oIISAdmin = Server.CreateObject("EgoCube.IISWebAdmin")
  
  '** 먼저 기존의 기본 문서 목록을 얻는다.
  OldDefaultDocs = oIISAdmin.GetWebServerDefaultDoc(1)
  
  '** index.asp 와 위에서 얻은 기본 문서 목록를 ',' 로 연결하여 문자열을 구성하고 재설정한다.
  Response.Write "<font size=2>Web Server Default Document :: "
  Response.Write oIISAdmin.SetWebServerDefaultDoc(1, "index.asp," & OldDefaultDocs)
  Response.Write "</font><br>"

  Set oIISAdmin = Nothing

%>

이 코드를 실행시키고 인터넷 서비스 관리자를 열어서 확인해보면 다음과 같이 그 실행 결과가 반영되어져 있는 것을 확인할 수 있을 것이다.

수정된 '기본 문서' 목록

이처럼 기본 문서의 우선 순위를 수정한다든가 또는 새 문서를 목록에 추가한다든가 하는 작업은 사실 대부분 문자열 조작을 수행하는 작업의 범주를 벗어나지 못한다. 또한, VBScript 에서 제공하는 Split() 함수나 Join() 함수를 사용하면 작업이 더욱 간단해지므로 매우 수월하게 기본 문서를 설정할 수 있을 것이다.

GetWebServerAccessPermit() 메서드와 SetWebServerAccessPermit() 메서드

이 GetWebServerAccessPermit() 메서드와 SetWebServerAccessPermit() 메서드 또한 이 글의 다른 메서드들 처럼 함께 쌍을 이루는 메서드들로서 가상 웹 서버의 접근 권한과 관련된 작업을 수행한다. 구체적으로 말하자면 GetWebServerAccessPermit() 메서드는 지정한 가상 웹 서버의 루트 디렉터리에 현재 설정된 접근 권한을 리턴해주며 SetWebServerAccessPermit() 메서드는 그 접근 권한을 사용자기 입력한 상태로 재설정한 후 그 결과를 리턴해준다.

다음 그림은 인터넷 서비스 관리자를 사용해서 살펴본 필자의 작업용 머신의 기본 웹 사이트 접근 권한이다. 이 두 개의 메서드는 이 그림에서 볼 수 있는 접근 권한 항목들 중 체크 박스 형태의 읽기(R)쓰기(W) 권한, 그리고 그 하단에 콤보 박스 형태의 실행 권한(P)에 대한 현재 설정값을 얻거나 재설정한다.

수정된 '기본 문서' 목록

이 두 메서드들의 정확한 시그니처는 각각 다음과 같다. 또한, 여기에서 사용되는 인자들 중 WebServerIndex와 WebServerName은 언제나처럼 각각 가상 웹 서버의 인덱스 값과 웹 서버의 NetBIOS 이름이다.

Public Function GetWebServerAccessPermit(WebServerIndex As Integer,
                Optional WebServerName As String = "") As String

Public Function SetWebServerAccessPermit(WebServerIndex As Integer,
                Optional AccessRead As Boolean = True,
                Optional AccessWrite As Boolean = False,
                Optional AccessScript As Boolean = True,
                Optional AccessExecute As Boolean = False,
                Optional WebServerName As String = "") As String

먼저, GetWebServerAccessPermit() 메서드의 사용법부터 살펴보자. 이 GetWebServerAccessPermit() 메서드는 인자로 WebServerIndex와 WebServerName만을 전달받는 매우 간단한 메서드이다. 이 메서드는 실행을 정상적으로 완료하면 String 형의 네 자리 숫자를 리턴하고 실패하면 빈 문자열을 리턴하는데, 정상적으로 완료되었을 때 리턴해주는 값은 "1010" 또는 "1110" 등의 2진수 형태의 문자열이다.

이 값은 실제 1000단위의 10진수 숫자값이나 2진수 숫자값을 의미하는 것은 아니고, 단지 설정 상태를 의미하는 '1'과 비설정 상태를 의미하는 '0'이 Flag의 의미로 네 개가 연이어진 문자열일 뿐이다. 이는 VBScript의 Mid() 함수를 사용해서 Flag를 쉽게 비교할 수 있도록 하기 위한 것이며 그 의미는 다음과 같다.

실행 권한 + Script 실행 권한 + 쓰기 권한 + 읽기 권한

예를 들어서, GetWebServerAccessPermit() 메서드에서 "0101"이 리턴됐다면, 실행 권한은 없으며 스크립트 실행 권한은 설정 되었고 쓰기 권한은 없으며 읽기 권한은 설정되었다는 뜻이다.

SetWebServerAccessPermit() 메서드의 사용법 역시 매우 쉽다. 이 메서드에는 가장 기본적인 WebServerIndex와 WebServerName 인자 외에도 AccessRead, AccessWrite, AccessScript, AccessExecute 이렇게 네 개의 인자가 추가적으로 존재하는데 이 인자들은 모두 Boolean 형으로써 각각 읽기 권한, 쓰기 권한, 스크립트 실행 권한, 실행 권한의 설정 유무를 True나 False로 설정하면 된다.

다음의 ASP 코드는 기본 웹 사이트의 모든 권한을 제거한다.

<%
  
  '******************************************************
  '*
  '* 먼저 기본 웹 사이트의 권한 설정 상태를 얻어 출력한 후,
  '* 모든 권한을 제거하고 그 결과를 출력한다.
  '*
  '******************************************************

  Dim oIISAdmin
  Dim OldDefaultDocs 
  
  Set oIISAdmin = Server.CreateObject("EgoCube.IISWebAdmin")
  
  '** 먼저 기본 웹 사이트의 권한 설정 상태를 얻고 출력한다.
  Response.Write "<font size=2>Web Server Access Permit :: "
  Response.Write oIISAdmin.GetWebServerAccessPermit(1)
  Response.Write "</font><br>"
    
  '** 기본 웹 사이트의 모든 권한을 제거한다.
  Response.Write "<font size=2>Web Server Access Permit :: "
  Response.Write oIISAdmin.SetWebServerAccessPermit(1, False, False, False, False)
  Response.Write "</font><br>"

  Set oIISAdmin = Nothing

%>

다음글에서는 GetLastWebServerIndex() 메서드와 GetWebServerBindings() 메서드, 그리고 가장 흥미로운 부분인 CreateWebServer() 메서드에 관하여 이야기를 진행해 나가도록 하겠다.