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

비밀번호

댓글 작성자
 




... 151  152  153  154  155  156  157  158  [159]  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1073정성태6/20/201127159오류 유형: 127. Visual Studio에서 WCF 서비스의 이름 변경 시 발생할 수 있는 오류
1072정성태6/19/201126630.NET Framework: 224. EF 4.1 Code First에서 Identity 칼럼 생성하는 방법파일 다운로드1
1071정성태6/19/201130182.NET Framework: 223. Entity Framework 4.1의 Code First를 이용한 SQL Azure 데이터베이스 생성 [3]파일 다운로드1
1070정성태6/19/201127695.NET Framework: 222. Windows Azure - VM Role 베타 프로그램 참여 [2]
1069정성태6/18/201127788.NET Framework: 221. Cache 영향을 받지 않는 DNS 이름 풀이 [2]파일 다운로드1
1068정성태6/16/201125387개발 환경 구성: 127. Portable Library - 닷넷 N-Screen용 공통 라이브러리 제작 [1]
1067정성태6/15/201124953오류 유형: 126. Windows failed to apply the Group Policy Folder Options settings. [1]
1066정성태6/14/201127978개발 환경 구성: 126. MSDN 구독자 - Windows Azure 무료 서비스 신청하는 방법 [4]
1065정성태6/13/201132797개발 환경 구성: 125. Firebird - 유니코드 기본 문자셋 지정
1064정성태6/11/201127451웹: 22. Visual Studio 2010에서 CSS 3 인텔리센스(intellisense) 지원하는 방법 [1]
1063정성태6/10/201129049웹: 21. Sysnet 웹 사이트의 CSS 2.1 변환 기록 [1]
1062정성태6/9/201129201웹: 20. Sysnet 웹 사이트의 HTML5 변환 기록 [1]
1061정성태6/8/201127448오류 유형: 125. 인터넷 익스플로러 - 개발자 도구에서 정지점(BP: Breakpoint) 설정이 안 되는 경우 [1]
1060정성태6/8/201124010VC++: 51. PHP 모듈의 F5 디버깅
1059정성태6/6/201129132VC++: 50. PHP 모듈 - php_mysql 빌드하는 방법파일 다운로드1
1058정성태6/5/201132782개발 환경 구성: 124. .NET 개발자가 처음 해보는 PHP + MySQL 연동 [2]
1057정성태6/4/201130161VC++: 49. 소스 코드로부터 php5apache2_2.dll 생성하는 방법파일 다운로드1
1056정성태6/2/201128318VC++: 48. 윈도우에서 Apache Module - Content Handler 컴파일파일 다운로드1
1055정성태6/1/201125537오류 유형: 124. MVC 프로젝트의 Site.Master 관련 오류 정리
1054정성태5/31/201129789.NET Framework: 220. ASP.NET MVC Web Site 프로젝트 - 단위 테스트 작성파일 다운로드1
1053정성태5/31/201132318VC++: 47. Apache Module에 대한 'F5 디버그 (Start with debugging)' [2]
1052정성태5/30/201129949.NET Framework: 219. ASP.NET MVC Web Site 프로젝트 구성하기파일 다운로드1
1051정성태5/28/201138427VC++: 46. 윈도우에서 Apache Module 컴파일 (VC++)파일 다운로드1
1050정성태5/28/201124609오류 유형: 123. Firebird - Exception of type 'FirebirdSql.Data.Common.IscException' was thrown.
1049정성태5/28/201130300.NET Framework: 218. WCF REST 서비스 - 웹 브라우저 측 Ajax 호출 캐시 [1]
1048정성태5/27/201132238개발 환경 구성: 123. Apache 소스를 윈도우 환경에서 빌드하기
... 151  152  153  154  155  156  157  158  [159]  160  161  162  163  164  165  ...