IIS6 Избройте версията на .net, на която се изпълнява набор от приложения

Искам да изброя пуловете приложения, работещи на сървър. В IIS7 мога да изтегля .net версията чрез WMI WIn32_Process, но я няма в IIS6. Как мога да получа версията на .net, в която работи работен процес/пул от приложения?

Например:

DefaultAppPool v2.0.50727

В IIS6 .Net е зададен във виртуалните директории в раздела ASP.NET, а наборът от приложения се настройва в раздела виртуална директория. FYI: Работя с Windows 2003 SP2 IIS6.


person Ken J    schedule 22.06.2012    source източник


Отговори (2)


Проблемът с IIS6 Application Pools е, че за разлика от IIS7 те нямат информация каква версия на .NET Framework се зарежда в тях.

Уебсайтовете на IIS6 определят коя среда за изпълнение на .NET Framework се зарежда в пул от версията на ASP.NET, към която сочат картите на скриптове на сайт или подприложение. Работният процес просто ще зареди сляпо необходимата ISAPI DLL, която е картографирана към разширение (или каквото и да е дефинирано в картографирането със заместващи символи).

Този стар метод често е причина за много скръб, когато два различни сайта, разпределени към един и същ пул, могат да бъдат конфигурирани да изпълняват различни версии на ASP.NET и получавате прословутото:

въведете описание на изображението тук

... и следното събитие се регистрира в регистъра на приложенията на Windows:

Event Type: Error
Event Source:   ASP.NET 2.0.50727.0
Event Category: None
Event ID:   1062
Date:       12/01/2011
Time:       12:31:43
User:       N/A
Computer:   KK-DEBUG
Description:
It is not possible to run two different versions of ASP.NET in the same 
IIS process. Please use the IIS Administration Tool to reconfigure your
server to run the application in a separate process.

Единственият начин да определите каква версия на .NET е конфигуриран да изпълнява пул от приложения е да разгледате всеки сайт, на който е присвоен този пул, и да проверите необработените скриптови карти.

Единственият проблем с това е, когато (например), по някаква причина, имате неправилно конфигуриран сайт (или подприложение), което вече не се използва и е настроено да използва различна версия на ASP.NET, напр.:

Site                         .NET Version   Application Pool 
============================================================
WebSite1                     ASP.NET 4.0    AppPool1
WebSite2 (no longer used)    ASP.NET 2.0    AppPool1

В този случай трябва да решите кой сайт има предимство, за да определите версията на рамката.

Този скрипт на PowerShell може да ви помогне да установите коя версия на ASP.NET се използва във всеки пул:

# Walk sites
$allsites = ([adsi]"IIS://Localhost/W3SVC").children | where { $_.SchemaClassName -eq "IIsWebServer" }
$pools = @()

foreach($site in $allsites)
{
  $path = "IIS://Localhost/W3SVC/" + $site.Name + "/root"
  $siteRoot = [adsi]$path
  $sitePool = $siteRoot.AppPoolId

  $aspx = $siteRoot.ScriptMaps | where { $_.StartsWith(".aspx") }

  if( $aspx.Contains("v1.1")) {
    $runtime = "1.1"
  } elseif ($aspx.Contains("v2.0")) {
    $runtime = "2.0"
  } elseif( $aspx.Contains("v4.0")) {
    $runtime = "4.0"
  } else {
    $runtime = "Unknown"
  }

  $v =  @{AppPool = $siteRoot.AppPoolId; RunTime = $runtime; SiteId = $site.Name}
  $pools += $v
}

$pools | Sort-Object { $_.AppPool } | % { Write-Host $_.AppPool $_.SiteId $_.RunTime }

Той разглежда само сайтовете на основно ниво и не влиза рекурсивно във всеки от тях, за да идентифицира подприложения.

person Kev    schedule 23.06.2012

Мисля, че можете да изпълните следните изявления:

$computer = "LocalHost" 
$namespace = "root\MicrosoftIISv2" 
Get-WmiObject -class IIsApplicationPoolSetting -computername $computer -namespace $namespace

и използвайте свойството ManagedRuntimeVersion във върнатия обект.

Редактиране: Както Анди каза в коментар по-долу, това не работи. Ако обаче сте на WS2003, можете да опитате това и да анализирате върнатия резултат:

C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -lk

Би било хубаво да знаете на каква операционна система работите.

person David Brabant    schedule 22.06.2012
comment
Опитах го на IIS 6 и 7 и ManagedRuntimeVersion беше наличен само за IIS 7. - person Andy Arismendi; 22.06.2012
comment
@Анди: прав си. Току-що проверих на стар WS2003 сървър, работещ с IIS6. Редактиране на моя отговор. - person David Brabant; 22.06.2012
comment
Не aspnet_regiis.exe -lk обаче просто изброява .net назначенията за виртуални директории? Ако е така, как да изброя виртуални директории за пулове приложения? - person Ken J; 22.06.2012