Microsoft MVP성태의 닷넷 이야기
.NET Framework: 200. IIS Metabase와 ServerManager 개체 활용 [링크 복사], [링크+제목 복사],
조회: 27367
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 4개 있습니다.)
IIS Metabase와 ServerManager 개체 활용

보통, IIS 6까지는 Metabase를 접근해서 관련 정보를 얻어올 수가 있는데요. 이때 이용하는 것은 DirectoryEntry 타입입니다.

string rootPath = string.Format("IIS://{0}/W3SVC", Environment.MachineName);
DirectoryEntry root = new DirectoryEntry(rootPath);

애석하게도, 이렇게 프로그램을 만들어서 배포하면 IIS 7 / 7.5가 설치된 Windows Server 2008 / R2에서는 다음과 같은 오류가 발생할 수 있습니다.

System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)

"Unknown error"로 알려져 있다 보니, 다양한 상황에서 나올 수 있겠지만 아래와 같이 콜스택이 가리키는 위치가 Bind라면?

************** Exception Text **************
System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_IsContainer()
   at System.DirectoryServices.DirectoryEntries.ChildEnumerator..ctor(DirectoryEntry container)
   at MyApp.MainForm.MainForm_Load(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   ...[생략]...
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

...[생략]...

아마도 대부분은 Windows Server 2008 제품군에서 기본적으로 설치가 안 된 "IIS 6 Metabase Compatibility" 구성 요소 때문일 것입니다. 물론, "Server Manager" / "Web Server (IIS)" / "Add Role Services"를 통해 "IIS 6 Metabase Compatibility" 구성 요소를 설치해 주면 이 문제는 해결됩니다.

하지만, 좀 더 매끄럽게 해결하고 싶다면 Microsoft.Web.Administration.ServerManager 타입을 이용해야 합니다. 사실, 구현은 더욱 간단하고 명확해졌습니다. 일례로 개인적으로 껄끄러웠던 처리 중의 하나가 Web Site 하위에 생성된 Virtual Application을 나열하는 것인데, IIS 6 메타베이스에서는 Web Site 하위에 생성된 폴더와 Virtual Directory를 재귀호출로 찾아내려가야 하는 식이었는데요. ServerManager의 경우에는 다음과 같이 컬렉션으로 간단하게 나열을 해줍니다.

ServerManager svr = new ServerManager();

foreach (Site site in svr.Sites) // IIS에 등록된 Web Site
{
    foreach (Microsoft.Web.Administration.Application app in site.Applications)
    {
        // Web Site에 등록된 모든 Virtual Application 열람
    }
}




아쉬운 점이 있다면, 현재 IIS 6은 분명히 건재하고 있고 이를 지원하던 기존 응용 프로그램들의 마이그레이션이 애매하다는 정도입니다. 왜냐하면, IIS 7+ 자체에는 메타베이스가 없기 때문에 기존에 쓰던 내용들의 개념이 1:1로 매핑되고 있지 않기 때문입니다. 대표적인 것이 Metabase Key인데요. 가령 "/LM/W3SVC/1/ROOT"와 같은 키 값은 새로운 applicationHost.config 기반의 IIS 7+에는 없기 때문에 ServerManager를 통해서는 해당 값을 알아낼 수 없습니다.

공식 문서상으로는 없는데, 일단 "IIS 6 Metabase Compatibility" 설치 후 매핑이 되는 것을 보면 공개되지 않은 매핑 규칙이 있다고 짐작해 볼 수 있습니다. 실제로 다음과 같은 정도의 규칙이 있더군요.

Microsoft.Web.Administration.Id == [Site ID]
Microsoft.Web.Administration.Application.Path == "/[Virtual Application 경로]"


이를 기반으로 무조건 "/LM/W3SVC/[Site ID]/" + Microsoft.Web.Administration.Application.Path 연산을 하면 그나마 메타베이스 키로 매핑시킬 수 있습니다.

아래는 첨부한 프로젝트를 실행한 화면입니다. 왼쪽 트리는 DirectoryEntry 기반으로 조회한 값이고, 오른쪽 트리는 ServerManager로 조회한 것입니다. (물론, Windows 2003에서 실행하면 오른쪽 트리는 비어있게 됩니다.)

iis_metabase_dependency_1.png

... 참고로, UAC 환경에서는 반드시 관리자 권한으로 실행시켜야 합니다. ^^



[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/28/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...
NoWriterDateCnt.TitleFile(s)
12119정성태1/17/202020607디버깅 기술: 160. Windbg 확장 DLL 만들기 (3) - C#으로 만드는 방법
12118정성태1/17/202021719개발 환경 구성: 466. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 - 세 번째 이야기 [1]
12117정성태1/15/202020329디버깅 기술: 159. C# - 디버깅 중인 프로세스를 강제로 다른 디버거에서 연결하는 방법파일 다운로드1
12116정성태1/15/202021060디버깅 기술: 158. Visual Studio로 디버깅 시 sos.dll 확장 명령어를 (비롯한 windbg의 다양한 기능을) 수행하는 방법
12115정성태1/14/202021292디버깅 기술: 157. C# - PEB.ProcessHeap을 이용해 디버깅 중인지 확인하는 방법파일 다운로드1
12114정성태1/13/202022693디버깅 기술: 156. C# - PDB 파일로부터 심벌(Symbol) 및 타입(Type) 정보 열거 [1]파일 다운로드3
12113정성태1/12/202022976오류 유형: 590. Visual C++ 빌드 오류 - fatal error LNK1104: cannot open file 'atls.lib' [1]
12112정성태1/12/202017666오류 유형: 589. PowerShell - 원격 Invoke-Command 실행 시 "WinRM cannot complete the operation" 오류 발생
12111정성태1/12/202021521디버깅 기술: 155. C# - KernelMemoryIO 드라이버를 이용해 실행 프로그램을 숨기는 방법(DKOM: Direct Kernel Object Modification) [16]파일 다운로드1
12110정성태1/11/202021609디버깅 기술: 154. Patch Guard로 인해 블루 스크린(BSOD)가 발생하는 사례 [5]파일 다운로드1
12109정성태1/10/202017793오류 유형: 588. Driver 프로젝트 빌드 오류 - Inf2Cat error -2: "Inf2Cat, signability test failed."
12108정성태1/10/202018759오류 유형: 587. Kernel Driver 시작 시 127(The specified procedure could not be found.) 오류 메시지 발생
12107정성태1/10/202020212.NET Framework: 877. C# - 프로세스의 모든 핸들을 열람 - 두 번째 이야기
12106정성태1/8/202020483VC++: 136. C++ - OSR Driver Loader와 같은 Legacy 커널 드라이버 설치 프로그램 제작 [1]
12105정성태1/8/202019007디버깅 기술: 153. C# - PEB를 조작해 로드된 DLL을 숨기는 방법
12104정성태1/7/202021042DDK: 9. 커널 메모리를 읽고 쓰는 NT Legacy driver와 C# 클라이언트 프로그램 [4]
12103정성태1/7/202024163DDK: 8. Visual Studio 2019 + WDK Legacy Driver 제작- Hello World 예제 [1]파일 다운로드2
12102정성태1/6/202019713디버깅 기술: 152. User 권한(Ring 3)의 프로그램에서 _ETHREAD 주소(및 커널 메모리를 읽을 수 있다면 _EPROCESS 주소) 구하는 방법
12101정성태1/5/202020866.NET Framework: 876. C# - PEB(Process Environment Block)를 통해 로드된 모듈 목록 열람
12100정성태1/3/202018117.NET Framework: 875. .NET 3.5 이하에서 IntPtr.Add 사용
12099정성태1/3/202021039디버깅 기술: 151. Windows 10 - Process Explorer로 확인한 Handle 정보를 windbg에서 조회 [1]
12098정성태1/2/202020794.NET Framework: 874. C# - 커널 구조체의 Offset 값을 하드 코딩하지 않고 사용하는 방법 [3]
12097정성태1/2/202018721디버깅 기술: 150. windbg - Wow64, x86, x64에서의 커널 구조체(예: TEB) 구조체 확인
12096정성태12/30/201920784디버깅 기술: 149. C# - DbgEng.dll을 이용한 간단한 디버거 제작 [1]
12095정성태12/27/201923194VC++: 135. C++ - string_view의 동작 방식
12094정성태12/26/201920949.NET Framework: 873. C# - 코드를 통해 PDB 심벌 파일 다운로드 방법
... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...