我想枚举在服务器上运行的应用程序池。在 IIS7 中,我可以通过 WMI WIn32_Process 提取 .net 版本,但在 IIS6 中不存在。如何获取运行工作进程/应用程序池的 .net 版本?
例如:
DefaultAppPool v2.0.50727
在 IIS6 中,.Net 设置在 ASP.NET 选项卡下的虚拟目录中,应用程序池设置在虚拟目录选项卡下。仅供参考:我正在运行 Windows 2003 SP2 IIS6。
我想枚举在服务器上运行的应用程序池。在 IIS7 中,我可以通过 WMI WIn32_Process 提取 .net 版本,但在 IIS6 中不存在。如何获取运行工作进程/应用程序池的 .net 版本?
例如:
DefaultAppPool v2.0.50727
在 IIS6 中,.Net 设置在 ASP.NET 选项卡下的虚拟目录中,应用程序池设置在虚拟目录选项卡下。仅供参考:我正在运行 Windows 2003 SP2 IIS6。
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 }
它只遍历根级别的站点,不会递归地遍历每个站点以识别子应用程序。
我认为您可以执行以下语句:
$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
知道你正在运行什么操作系统会很好。