Microsoft MVP성태의 닷넷 이야기
.NET Framework: 200. IIS Metabase와 ServerManager 개체 활용 [링크 복사], [링크+제목 복사],
조회: 26152
글쓴 사람
정성태 (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)
12339정성태9/21/202017060오류 유형: 655. 코어 모드의 윈도우는 GUI 모드의 윈도우로 교체가 안 됩니다.
12338정성태9/21/202017059오류 유형: 654. 우분투 설치 시 "CHS: Error 2001 reading sector ..." 오류 발생
12337정성태9/21/202018171오류 유형: 653. Windows - Time zone 설정을 바꿔도 반영이 안 되는 경우
12336정성태9/21/202021577.NET Framework: 942. C# - WOL(Wake On Lan) 구현
12335정성태9/21/202030742Linux: 31. 우분투 20.04 초기 설정 - 고정 IP 및 SSH 설치
12334정성태9/21/202015320오류 유형: 652. windbg - !py 확장 명령어 실행 시 "failed to find python interpreter"
12333정성태9/20/202015678.NET Framework: 941. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 (2)
12332정성태9/18/202018645.NET Framework: 940. C# - Windows Forms ListView와 DataGridView의 예제 코드파일 다운로드1
12331정성태9/18/202017544오류 유형: 651. repadmin /syncall - 0x80090322 The target principal name is incorrect.
12330정성태9/18/202018702.NET Framework: 939. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 [2]파일 다운로드1
12329정성태9/16/202021024오류 유형: 650. ASUS 메인보드 관련 소프트웨어 설치 후 ArmouryCrate.UserSessionHelper.exe 프로세스 무한 종료 현상
12328정성태9/16/202019992VS.NET IDE: 150. TFS의 이력에서 "Get This Version"과 같은 기능을 Git으로 처리한다면?
12327정성태9/12/202018132.NET Framework: 938. C# - ICS(Internet Connection Sharing) 제어파일 다운로드1
12326정성태9/12/202017529개발 환경 구성: 516. Azure VM의 Network Adapter를 실수로 비활성화한 경우
12325정성태9/12/202016726개발 환경 구성: 515. OpenVPN - 재부팅 후 ICS(Internet Connection Sharing) 기능이 동작 안하는 문제
12324정성태9/11/202017563개발 환경 구성: 514. smigdeploy.exe를 이용한 Windows Server 2016에서 2019로 마이그레이션 방법
12323정성태9/11/202016800오류 유형: 649. Copy Database Wizard - The job failed. Check the event log on the destination server for details.
12322정성태9/11/202020154개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한 [1]
12321정성태9/11/202015930오류 유형: 648. netsh http add urlacl - Error: 183 Cannot create a file when that file already exists.
12320정성태9/11/202017957개발 환경 구성: 512. RDP(원격 데스크톱) 접속 시 비밀 번호를 한 번 더 입력해야 하는 경우
12319정성태9/10/202017310오류 유형: 647. smigdeploy.exe를 Windows Server 2016에서 실행할 때 .NET Framework 미설치 오류 발생
12318정성태9/9/202016334오류 유형: 646. OpenVPN - "TAP-Windows Adapter V9" 어댑터의 "Network cable unplugged" 현상
12317정성태9/9/202019588개발 환경 구성: 511. Beats용 Kibana 기본 대시 보드 구성 방법
12316정성태9/8/202017399디버깅 기술: 170. WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
12315정성태9/7/202019804개발 환경 구성: 510. Logstash - FileBeat을 이용한 IIS 로그 처리 [2]
12314정성태9/7/202019963오류 유형: 645. IIS HTTPERR - Timer_MinBytesPerSecond, Timer_ConnectionIdle 로그
... 61  62  63  [64]  65  66  67  68  69  70  71  72  73  74  75  ...