我想枚举服务器上运行的应用程序池。在IIS7中,我能够通过WMI WIn32_Process提取.net版本,但它在IIS6中不存在。如何获取正在运行工作进程/应用程序池的.net版本?
例如:
DefaultAppPool v2.0.50727
在IIS6中,在ASP.NET选项卡下的虚拟目录中设置.Net,并在“虚拟目录”选项卡下设置“应用程序池”。仅供参考:我正在运行Windows 2003 SP2 IIS6。
答案 0 :(得分:6)
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 }
它只在根级别遍历站点,并且不会递归地遍历每个站点以识别子应用程序。
答案 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
了解您正在运行的操作系统会很好。