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 Web サイトは、サイトまたはサブ アプリケーションのスクリプト マップが指す ASP.NET のバージョンによって、プールに読み込まれる .NET Framework ランタイムを決定します。ワーカー プロセスは、拡張子 (またはワイルドカード マッピングで定義されているもの) にマップされている必要な ISAPI DLL を盲目的にロードします。

この古い方法は、多くの場合、同じプールに割り当てられた 2 つの異なるサイトが異なるバージョンの ASP.NET を実行するように構成され、悪名高い:

ここに画像の説明を入力

...そして、次のイベントが Windows アプリケーション ログに記録されます。

イベントの種類: エラー
イベント ソース: ASP.NET 2.0.50727.0
イベント カテゴリ: なし
イベント ID: 1062
日付: 2011 年 12 月 1 日
時間: 12:31:43
ユーザー: なし
コンピューター: KK-DEBUG
説明:
2 つの異なるバージョンの ASP.NET を同じ環境で実行することはできません。
IIS プロセス。IIS 管理ツールを使用して再構成してください。
サーバーを使用して、アプリケーションを別のプロセスで実行します。

アプリケーション プールが実行するように構成されている .NET バージョンを特定する唯一の方法は、そのプールが割り当てられているすべてのサイトを調べて、未加工のスクリプト マップを確認することです。

これに関する唯一の問題は、(たとえば) なんらかの理由で、別のバージョンの ASP.NET を使用するようにセットアップされている、使用されなくなったサイト (またはサブアプリケーション) が誤って構成されている場合です。

サイト .NET バージョン アプリケーション プール
================================================== ==========
WebSite1 ASP.NET 4.0 AppPool1
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

実行しているOSを知っていると便利です。

于 2012-06-22T07:21:42.477 に答える