.net IIS应用程序池PID

.net IIS应用程序池PID,.net,iis,application-pool,pid,.net,Iis,Application Pool,Pid,是否有人熟悉获取与进程ID关联的应用程序池的方法?我正在使用Win32_进程查询W3WP服务并返回PID,现在我正在尝试获取与其关联的应用程序池 ServerManager serverManager = new ServerManager(); ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools; 试着使用它,它会满足您的需要。如果您只是使用命令行临时解决它,您也可以这样做:

是否有人熟悉获取与进程ID关联的应用程序池的方法?我正在使用Win32_进程查询W3WP服务并返回PID,现在我正在尝试获取与其关联的应用程序池

ServerManager serverManager = new ServerManager();
ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;

试着使用它,它会满足您的需要。

如果您只是使用命令行临时解决它,您也可以这样做:

该脚本已放置在Windows Server 2003上的systemroot\system32中,因此只需转到命令提示符并键入iisap.vbs(该.vbs是可选的),您将获得一个即时列表,其中包含您一直希望了解的所有应用程序池信息。如果cscript不是默认的WSH脚本主机,则可能需要键入cscript iisapp.vbs

让我们看一个输出示例:

W3WP.exe PID: 1468 AppPoolId: AppPoolForSite1.com
W3WP.exe PID: 3056 AppPoolId: AppPoolForSite2.com
W3WP.exe PID: 1316 AppPoolId: AppPoolForSite3.com

直接从马口中获取Microsoft文档。

在Windows Server 2008上,这一点已经改变

在systemroot\system32\inetsrv中可以找到appcmd.exe

使用

appcmd列表wp

您将获得所有工作进程及其服务的应用程序池的列表


您可能需要在具有管理员权限的shell中运行此命令。

如果您在Windows Server 2008上运行,并且只希望将PID馈送到另一个脚本或命令,则可以使用此命令:

c:\windows\system32\inetsrv\appcmd list wps /apppool.name:"My Application Pool" /text:WP.NAME
c:\windows\system32\inetsrv\appcmd list wps /apppool.name:"My Application Pool" /text:WP.NAME > "%temp%\pid.txt"
for /F %%a in (%temp%\pid.txt) do c:\debugger\adplus.exe -hang -o d:\dumps -p %%a
pause
例如,要创建创建特定应用程序池内存转储的批处理脚本,请使用以下命令:

c:\windows\system32\inetsrv\appcmd list wps /apppool.name:"My Application Pool" /text:WP.NAME
c:\windows\system32\inetsrv\appcmd list wps /apppool.name:"My Application Pool" /text:WP.NAME > "%temp%\pid.txt"
for /F %%a in (%temp%\pid.txt) do c:\debugger\adplus.exe -hang -o d:\dumps -p %%a
pause

您可以使用任务管理器查看进程运行时使用的用户名(通常与应用程序池名称相同)和进程ID,但必须在任务管理器中打开这些列,并且它还假定进程运行时使用的用户名与应用程序池名称相同(据我所知,这是默认设置,除非使用Sharepoint等。)
还请注意,此页面中列出的所有方法可能只显示当前正在运行的进程,这意味着如果您的特定进程由于空闲时间而关闭,您必须首先使用该站点才能将该进程添加到列表中,在您的情况下,这意味着您应该首先访问所有站点以确保该进程与它们关联的正在运行。

我刚刚发现,您也可以在IIS 7的UI中找到它。选择您的web服务器节点并打开“工作进程”。这将显示每个应用程序池的名称及其进程ID和利用率详细信息。

PID和应用程序池的名称:

$AppPoolName = 'AppPoolForSite1'
(Get-ItemProperty IIS:\AppPools\$AppPoolName -Name WorkerProcesses).Collection.processId
这应该可以做到

public string getAppPoolName(int pid)
{            
    ServerManager serverManager = new ServerManager();

    ApplicationPoolCollection apc = serverManager.ApplicationPools;

    foreach (var app in apc)
    {
        var workers = app.WorkerProcesses;

        foreach (var w in workers)
        {                   
            if (w.ProcessId == pid)
            {
                return app.Name;
            }
        }
    }

    return string.Empty;
}
打开IIS管理器(运行>Inetmgr),从左侧站点导航树中选择根级别,然后从“功能视图面板”中选择“工作进程”

单击“工作进程”以获取当前正在运行的所有工作进程的详细信息


从该列表中,您将获得应用程序池名称、进程id

这似乎没有列出作为计算机用户运行的应用程序池(系统/网络服务)…有什么想法吗?我可以很好地列出网络服务w3wp角色。也许您没有以管理员权限运行该命令,或者w3wp进程被回收?--以管理员身份运行--、--以管理员身份运行--、--以管理员身份运行--因为清单10中的w3wp进程及其PID不会告诉您哪个进程用于哪个应用程序池…@Shaamaan我可能还不够清楚(我现在编辑了这篇文章以使其更清楚),但进程运行时所使用的“用户名”通常与应用程序池名称相同(请检查,在大多数情况下,如果不是所有情况下,它都应该是正确的)。如果每个应用程序池都在其自己的用户上运行,则这是正确的。但在Sharepoint的情况下(在Sharepoint中,池的数量可能与站点的数量相同)这些都是在同一个用户上运行的。因此,您依赖于一个很大的假设。在95%到99%的情况下,这是正确的,如果不正确,那么用户名将与应用程序池名称不匹配,事实上,“appcmd”将有同样的问题(正如Doug在评论中指出的),任务管理器显然简单多了。感谢您指出这一点。在我的情况下,用户名列没有帮助,但有另一列名为Command Line,它告诉我是哪个应用程序池。这让我开始了,但我不关心临时文件。我修改了它,将PID提取到一个变量中,其中包含以下内容:for/F“tokens=2”%%I In(“%SystemRoot%/system32/inetsrv/appcmd list wps/apppool.name:MyAppPool”)是否设置pid=%i。此脚本在我的服务器2008 R2或10框中不存在,请参阅appcmd.exe选项