2

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

例如:

DefaultAppPool v2.0.50727

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

4

2 回答 2

7

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

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

这种旧方法通常会导致很多麻烦,因为分配给同一个池的两个不同站点可能被配置为运行不同版本的 ASP.NET,而您会得到臭名昭著的:

在此处输入图像描述

...并将以下事件记录到 Windows 应用程序日志中:

事件类型:错误
事件源:ASP.NET 2.0.50727.0
事件类别:无
事件编号:1062
日期:2011 年 12 月 1 日
时间:12:31:43
用户:不适用
电脑:KK-DEBUG
描述:
不可能同时运行两个不同版本的 ASP.NET
IIS 进程。请使用 IIS 管理工具重新配置您的
服务器在单独的进程中运行应用程序。

确定应用程序池配置为运行哪个 .NET 版本的唯一方法是遍历分配了该池的每个站点并检查原始脚本映射。

唯一的问题是(例如),无论出于何种原因,您有一个不再使用的配置错误的站点(或子应用程序)被设置为使用不同版本的 ASP.NET,例如:

站点 .NET 版本应用程序池
==================================================== ==========
网站 1 ASP.NET 4.0 应用程序池 1
WebSite2(不再使用)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 }

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

于 2012-06-23T04:46:19.710 回答
0

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

$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

知道你正在运行什么操作系统会很好。

于 2012-06-22T07:21:42.477 回答