2006/12/13

IIS 6 의 응용프로그램 풀 .NET FrameWork 버젼 체크

IIS 6 에서는, 여러개의 응용프로그램 풀 설정을 지원한다. 말하자면 웹사이트별로 별도의 Worker Process 설정을 통해서 웹사이트별 성능 보호가 가능해 진 것이다.

그런데, Asp VB Script 에서는 하나의 asp.dll 파서를 이용하므로 상관이 없으나, ASP.NET 이 2.0 으로 버젼업이 되면서 각 버젼별로 별도의 aspnet.dll 파서를 이용하게 된다.

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll
c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

응용프로그램 풀에서는 aspx 확장자 처리에 대한 하나의 파서만 로드가 가능하다.


만약 1.1 버젼과 2.0 버젼의 코드로 제작된 웹사이트를 하나의 풀에서 실행을 하게되면 선점된 파서로 실행을 하게 되며, 버젼이 맞지 않는 웹사이트에서는 응용프로그램 풀 로드 오류가 발생하게 된다.


위는 ASP.NET 2.0 버젼이 먼저 호출되어 로드가 된후에, 1.1 버젼을 호출하는 경우 웹사이트 오류를 출력함과 동시에 위와 같은 오류 이벤트가 생성된다.


마찮가지로 1.1 이 먼저 로드된후, 2.0 버젼을 호출한 경우다.


위와 같은 오류상황을 미연에 방지하기 위해서는, 웹사이트를 제작하는 프로그래머가 서버관리자에게 필히 닷넷프레임워크의 버젼을 알려주어야 하며 서버 관리자는 버젼별로 응용프로그램 풀을 별로로 분리해야 한다.




웹사이트 몇개가 안되거나, 할때는 상관없는데 문제는, 웹호스팅 서버와 같은 다수의 웹사이트에 각각의 별도 제작하는 프로그래머가 존재한다면 위와 같은 상황은 발생할 가능성이 높다. 또한 수 십에서 수백개의 웹사이트를 뒤지는 일도 만만치 않는 작업일 것이다.

접속자가 많은 크리티컬한 웹사이트에서 중단이 발생하면,, 암울 할것이다. -_-;


다음 스크립트는, 응용프로그램 풀에 실행요청된 ASP.NET 의 버젼을 확인할수 있는 스크립트이다.

option explicit

dim AppsInPool, objAppPool, index, IISObj, IISPath, Version, pos
Dim Versions(), objAppPools

function FindASPXScriptMapVersion(ScriptMaps)
 Dim pos, ScriptMap

 for pos = lbound(ScriptMaps) to UBOund(ScriptMaps)
   ScriptMap = lcase(ScriptMaps(POS))
   if (left(ScriptMap, 5) = ".aspx") then
    FindASPXScriptMapVersion = mid(ScriptMap, 42)
    FindASPXScriptMapVersion = left(FindASPXScriptMapVersion, _
     instr(FindASPXScriptMapVersion, "\")-1)
    exit function
   end if
 next 
 FindASPXScriptMapVersion = ""
end function

function AddVersion(Version, Path)
 dim Found, pos

 Found = false
 for pos = lbound(Versions) to UBound(Versions)-1
  if (Versions(pos) = Version) then
   Found = true
  end if
 next

 if (Found = false) then
  redim preserve Versions(ubound(Versions)+1)
  Versions(ubound(Versions)-1)= Version
 end if
end function

Set objAppPools = GetObject("IIS://localhost/W3SVC/AppPools")
for each objAppPool in objAppPools

 Redim Versions(0)
 Set objAppPool = GetObject("IIS://localhost/W3SVC/AppPools/" & objAppPool.Name )
 WScript.echo objAppPool.Name

 AppsInPool= objAppPool.EnumAppsInPool()
 if (ubound(AppsInPool) = -1) then
  WScript.echo vbtab  & "No applications using this pool!"
 else
  for index = lbound(AppsInPool) to UBound(AppsInPool)
   IISPath = AppsInPool(index)
   IISPath = "IIS://localhost/" & mid(IISPath,5, len(IISPath)-5)
   set IISObj = GetObject(IISPath)
   Version = FindASPXScriptMapVersion(IISObj.ScriptMaps)
   call AddVersion(Version, mid(IISPath,5, len(IISPath)-5))
  next
  if (ubound(Versions)> 1) then
   WScript.Echo vbcrlf & vbtab & _
    "Warning multiple version of the .NET framework detected!" & vbcrlf
   
   for pos = lbound(Versions) to ubound(Versions)-1
    WScript.echo vbtab & "Found references to " &  Versions(pos)
   next
   WScript.echo ""
   for index = lbound(AppsInPool) to UBound(AppsInPool)
    IISPath = AppsInPool(index)
    IISPath = "IIS://localhost/" & mid(IISPath,5, len(IISPath)-5)
    set IISObj = GetObject(IISPath)
    Version = FindASPXScriptMapVersion(IISObj.ScriptMaps)
    WScript.echo vbtab & mid(IISPath,5, len(IISPath)-5) & _
     space(70 - len(IISpath)) & " - " & Version
   next
  else
   for pos = lbound(Versions) to ubound(Versions)-1
    WScript.echo vbtab & "Found references to " &  Versions(pos)
   next  
  end if
 end if
 WScript.echo ""
next

스크립트출처 : http://blog.crowe.co.nz/

원리는, 각 응용프로그램 풀 목록을 ADSI 를 통해서 확인한 다음에,

각 응용프로그램 풀에 설정된 웹사이트 목록 확인. 그런다음에 각 웹사이트의 aspx 확장자에 대한 파서의 버젼을 확인합니다.

그런후에, 하나라도 서로 다른게 있으면 중복되어 있어 웹사이트 오류가 발생할 수 있다는 것입니다.

샘플 실행 결과는 다음과 같다.

E:\>iisappcheck.vbs
Microsoft (R) Windows Script Host 버전 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

ASP.NET V2.0
        Found references to v2.0.50727

DefaultAppPool
        Found references to v1.1.4322

MSSharePointAppPool
        Found references to v1.1.4322

ReportServer

        Warning multiple version of the .NET framework detected!

        Found references to v2.0.50727
        Found references to

        //localhost/W3SVC/1/ROOT/Report                                   - v2.0.50727
        //localhost/W3SVC/1/ROOT/ReportServe                              -

ASP.NET V1.1
        No applications using this pool!




12-net1.png
12-net2.png
12-net3.png

댓글 없음:

댓글 쓰기

가장 많이 본 글