4

サーバーで実行されているWebサイトはほとんどありません。

現在のプロセスのメモリ量を示す「診断」ページがアプリケーションにあります(非常に便利です)。

これで、このアプリは別のアプリに「リンク」され、診断ページに別のw3wpプロセスのメモリのアモットを表示できるようにしたいと思います。

メモリの量を取得するために、私は簡単なコードを使用します:

var process = Process.GetProcessesByName("w3wp");
string memory = this.ToMemoryString(process.WorkingSet64);

アプリケーションプールを知っている2番目のw3wpプロセスを特定するにはどうすればよいですか?

対応するスレッドが見つかりましたが、適切な答えがありません: IIS6アプリプールでプロセス固有のパフォーマンス統計を確認するための信頼できる方法

ありがとう

4

2 に答える 2

7

WMIを使用して、特定のw3wp.exeプロセスが属するアプリケーションプールを特定できます。

var scope = new ManagementScope(@"\\YOURSERVER\root\cimv2");
var query = new SelectQuery("SELECT * FROM Win32_Process where Name = 'w3wp.exe'");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach (ManagementObject process in searcher.Get())
    {
        var commandLine = process["CommandLine"].ToString();
        var pid = process["ProcessId"].ToString();
        // This will print the command line which will look something like that:
        // c:\windows\system32\inetsrv\w3wp.exe -a \\.\pipe\iisipm49f1522c-f73a-4375-9236-0d63fb4ecfce -t 20 -ap "NAME_OF_THE_APP_POOL"
        Console.WriteLine("{0} - {1}", pid, commandLine);
    }
}
于 2010-01-29T08:51:10.567 に答える
5

IISServerManagerコンポーネントを使用してPIDを取得することもできます。つまり、コンソール出力をリダイレクトおよび解析せずに、コードでアクセスする必要がある場合。

public static int GetIISProcessID(string appPoolName)
{
    Microsoft.Web.Administration.ServerManager serverManager = new   
        Microsoft.Web.Administration.ServerManager();
    foreach (WorkerProcess workerProcess in serverManager.WorkerProcesses)
    {
        if (workerProcess.AppPoolName.Equals(appPoolName))
            return workerProcess.ProcessId;
    }

    return 0;
}
于 2013-07-19T05:08:00.947 に答える