确定给定应用程序池的w3wp System.Diagnostics.Process

Mos*_*ose 4 iis system.diagnostics application-pool w3wp

我的服务器上运行的网站很少.

我在应用程序中有一个"诊断"页面,显示当前进程的内存量(非常有用).

现在这个应用程序"链接"到另一个应用程序,我希望我的诊断页面能够显示另一个w3wp进程的内存.

为了获得内存量,我使用了一个简单的代码:

var process = Process.GetProcessesByName("w3wp");
string memory = this.ToMemoryString(process.WorkingSet64);
Run Code Online (Sandbox Code Playgroud)

如何识别我的第二个w3wp进程,知道它的应用程序池?

我找到了一个相应的线程,但没有适当的答案: 在IIS6应用程序池上查看特定于进程的性能统计信息的可靠方法

谢谢

Dar*_*rov 6

您可以使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)


RJ *_*han 5

您还可以使用IIS ServerManager组件获取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;
}
Run Code Online (Sandbox Code Playgroud)