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

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  52  53  54  55  56  57  58  59  [60]  ...
NoWriterDateCnt.TitleFile(s)
12471정성태1/1/202119628.NET Framework: 992. C# - .NET Core 3.0 이상부터 제공하는 runtimeOptions의 rollForward 옵션 [1]
12470정성태12/30/202019688.NET Framework: 991. .NET 5 응용 프로그램에서 WinRT API 호출 [1]파일 다운로드1
12469정성태12/30/202023944.NET Framework: 990. C# - SendInput Win32 API를 이용한 가상 키보드/마우스 [1]파일 다운로드1
12468정성태12/30/202020742Windows: 186. CMD Shell의 "Defaults"와 "Properties"에서 폰트 정보가 다른 문제 [1]
12467정성태12/29/202020660.NET Framework: 989. HttpContextAccessor를 통해 이해하는 AsyncLocal<T> [1]파일 다운로드1
12466정성태12/29/202018123.NET Framework: 988. C# - 지연 실행이 꼭 필요한 상황이 아니라면 singleton 패턴에서 DCLP보다는 static 초기화를 권장 [1]파일 다운로드1
12465정성태12/29/202021829.NET Framework: 987. .NET Profiler - FunctionID와 연관된 ClassID를 구할 수 없는 문제
12464정성태12/29/202019558.NET Framework: 986. pptfont.exe - PPT 파일에 숨겨진 폰트 설정을 일괄 삭제
12463정성태12/29/202018514개발 환경 구성: 520. RDP(mstsc.exe)의 다중 모니터 옵션 /multimon, /span
12462정성태12/27/202021063디버깅 기술: 177. windbg - (ASP.NET 환경에서 유용한) netext 확장
12461정성태12/21/202020751.NET Framework: 985. .NET 코드 리뷰 팁 [3]
12460정성태12/18/202018769기타: 78. 도서 소개 - C#으로 배우는 암호학
12459정성태12/16/202020389Linux: 35. C# - 리눅스 환경에서 클라이언트 소켓의 ephemeral port 재사용파일 다운로드1
12458정성태12/16/202017458오류 유형: 694. C# - Task.Start 메서드 호출 시 "System.InvalidOperationException: 'Start may not be called on a task that has completed.'" 예외 발생 [1]
12457정성태12/15/202018489Windows: 185. C# - Windows 10/2019부터 추가된 SIO_TCP_INFO파일 다운로드1
12456정성태12/15/202019496VS.NET IDE: 156. Visual Studio - "Migrate packages.config to PackageReference"
12455정성태12/15/202018958오류 유형: 693. DLL 로딩 시 0x800704ec - This Program is Blocked by Group Policy [1]
12454정성태12/15/202019436Windows: 184. Windows - AppLocker의 "DLL Rules"를 이용해 임의 경로에 설치한 DLL의 로딩을 막는 방법 [1]
12453정성태12/14/202020418.NET Framework: 984. C# - bool / BOOL / VARIANT_BOOL에 대한 Interop [1]파일 다운로드1
12452정성태12/14/202020746Windows: 183. 설정은 가능하지만 구할 수는 없는 TcpTimedWaitDelay 값
12451정성태12/14/202018289Windows: 182. WMI Namespace를 열거하고, 그 안에 정의된 클래스를 열거하는 방법 [5]
12450정성태12/13/202019582.NET Framework: 983. C# - TIME_WAIT과 ephemeral port 재사용파일 다운로드1
12449정성태12/11/202020668.NET Framework: 982. C# - HttpClient에서의 ephemeral port 재사용 [2]파일 다운로드1
12448정성태12/11/202022240.NET Framework: 981. C# - HttpWebRequest, WebClient와 ephemeral port 재사용파일 다운로드1
12447정성태12/10/202020419.NET Framework: 980. C# - CopyFileEx API 사용 예제 코드파일 다운로드1
12446정성태12/10/202021410.NET Framework: 979. C# - CoCreateInstanceEx 사용 예제 코드파일 다운로드1
... 46  47  48  49  50  51  52  53  54  55  56  57  58  59  [60]  ...