IIS6列出正在运行的应用程序池的.net版本

时间:2012-06-22 03:15:10

标签: powershell iis-6

我想枚举服务器上运行的应用程序池。在IIS7中,我能够通过WMI WIn32_Process提取.net版本,但它在IIS6中不存在。如何获取正在运行工作进程/应用程序池的.net版本?

例如:

DefaultAppPool v2.0.50727

在IIS6中,在ASP.NET选项卡下的虚拟目录中设置.Net,并在“虚拟目录”选项卡下设置“应用程序池”。仅供参考:我正在运行Windows 2003 SP2 IIS6。

2 个答案:

答案 0 :(得分:6)

IIS6应用程序池的问题在于,与IIS7不同,它们不知道将.NET Framework的哪个版本加载到它们中。

IIS6 网站确定哪个.NET Framework运行时由站点或子应用程序的脚本映射指向的ASP.NET版本加载到池中。工作进程将盲目地加载映射到扩展(或通配符映射中定义的任何内容)的必需ISAPI DLL。

这种旧方法经常引起很大的痛苦,因为分配给同一个池的两个不同站点可能被配置为运行不同版本的ASP.NET而你会得到臭名昭着的:

enter image description here

...并将以下事件记录到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 }

它只在根级别遍历站点,并且不会递归地遍历每个站点以识别子应用程序。

答案 1 :(得分:0)

我认为您可以执行以下语句:

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

并在返回的对象中使用ManagedRuntimeVersion属性。

编辑:正如Andy在下面的评论中所说,这不起作用。但是,如果您使用的是WS2003,则可以尝试此操作并解析返回的结果:

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

了解您正在运行的操作系统会很好。