Microsoft MVP성태의 닷넷 이야기
.NET Framework: 200. IIS Metabase와 ServerManager 개체 활용 [링크 복사], [링크+제목 복사],
조회: 20118
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13098정성태7/13/20226471개발 환경 구성: 647. Azure - scale-out 상태의 App Service에서 특정 인스턴스에 요청을 보내는 방법 [1]
13097정성태7/12/20225836오류 유형: 817. Golang - binary.Read: invalid type int32
13096정성태7/8/20228738.NET Framework: 2030. C# 11 - UTF-8 문자열 리터럴
13095정성태7/7/20226797Windows: 208. AD 도메인에 참여하지 않은 컴퓨터에서 Kerberos 인증을 사용하는 방법
13094정성태7/6/20226573오류 유형: 816. Golang - "short write" 오류 원인
13093정성태7/5/20227427.NET Framework: 2029. C# - HttpWebRequest로 localhost 접속 시 2초 이상 지연
13092정성태7/3/20228382.NET Framework: 2028. C# - HttpWebRequest의 POST 동작 방식파일 다운로드1
13091정성태7/3/20227320.NET Framework: 2027. C# - IPv4, IPv6를 모두 지원하는 서버 소켓 생성 방법
13090정성태6/29/20226360오류 유형: 815. PyPI에 업로드한 패키지가 반영이 안 되는 경우
13089정성태6/28/20226836개발 환경 구성: 646. HOSTS 파일 변경 시 Edge 브라우저에 반영하는 방법
13088정성태6/27/20225798개발 환경 구성: 645. "Developer Command Prompt for VS 2022" 명령행 환경의 폰트를 바꾸는 방법
13087정성태6/23/20228861스크립트: 41. 파이썬 - FastAPI / uvicorn 호스팅 환경에서 asyncio 사용하는 방법 [1]
13086정성태6/22/20228302.NET Framework: 2026. C# 11 - 문자열 보간 개선 2가지파일 다운로드1
13085정성태6/22/20228404.NET Framework: 2025. C# 11 - 원시 문자열 리터럴(raw string literals)파일 다운로드1
13084정성태6/21/20226837개발 환경 구성: 644. Windows - 파이썬 2.7을 msi 설치 없이 구성하는 방법
13083정성태6/20/20227462.NET Framework: 2024. .NET 7에 도입된 GC의 메모리 해제에 대한 segment와 region의 차이점 [2]
13082정성태6/19/20226527.NET Framework: 2023. C# - Process의 I/O 사용량을 보여주는 GetProcessIoCounters Win32 API파일 다운로드1
13081정성태6/17/20226537.NET Framework: 2022. C# - .NET 7 Preview 5 신규 기능 - System.IO.Stream ReadExactly / ReadAtLeast파일 다운로드1
13080정성태6/17/20227229개발 환경 구성: 643. Visual Studio 2022 17.2 버전에서 C# 11 또는 .NET 7.0 preview 적용
13079정성태6/17/20224838오류 유형: 814. 파이썬 - Error: The file/path provided (...) does not appear to exist
13078정성태6/16/20227028.NET Framework: 2021. WPF - UI Thread와 Render Thread파일 다운로드1
13077정성태6/15/20227245스크립트: 40. 파이썬 - PostgreSQL 환경 구성
13075정성태6/15/20226209Linux: 50. Linux - apt와 apt-get의 차이 [2]
13074정성태6/13/20226541.NET Framework: 2020. C# - NTFS 파일에 사용자 정의 속성값 추가하는 방법파일 다운로드1
13073정성태6/12/20226815Windows: 207. Windows Server 2022에 도입된 WSL 2
13072정성태6/10/20227100Linux: 49. Linux - ls 명령어로 출력되는 디렉터리 색상 변경 방법
... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...