IIS6 Перечислить версию .net, в которой запущен пул приложений.

Я хочу перечислить пулы приложений, запущенные на сервере. В IIS7 я могу загрузить версию .net через WMI WIn32_Process, но ее нет в IIS6. Как я могу получить версию .net, в которой запущен рабочий процесс / пул приложений?

Например:

DefaultAppPool v2.0.50727

В IIS6 .Net устанавливается в виртуальных каталогах на вкладке ASP.NET, а пул приложений настраивается на вкладке виртуального каталога. К вашему сведению: я использую Windows 2003 SP2 IIS6.


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


Ответы (2)


Проблема с пулами приложений IIS6 заключается в том, что в отличие от 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