是否有人熟悉获取与进程 ID 关联的应用程序池的方法?我正在使用 Win32_Process 查询 W3WP 服务并返回 PID 现在我正在尝试获取与之关联的应用程序池。
10 回答
在 Windows Server 2008 上,这已更改。
在 systemroot\system32\inetsrv 你找到 appcmd.exe
使用
appcmd 列表 wp
您将获得所有工作进程的列表以及它们正在服务的应用程序池。
您可能需要在具有管理员权限的 shell 中运行它。
如果您只是使用命令行来解决问题,您也可以这样做:
该脚本已放置在 Windows Server 2003 上的 systemroot\system32 中,因此只需转到您的命令提示符并输入 iisapp.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
微软直接从马口中记录了这一点。
我刚刚发现您也可以在 IIS 7 的 UI 中找到它。选择您的 Web 服务器节点并打开“工作进程”。这将显示每个应用程序池的名称及其进程 ID 和利用率详细信息。
如果您在 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
可以使用任务管理器查看进程运行的用户名(一般与应用池名称相同)和进程ID,但必须在任务管理器中开启这些列,而且还假设进程运行的用户名与应用程序池名称相同(据我所知,这是默认值,除非使用 Sharepoint 等)。
另请注意,此页面中列出的所有方法可能仅显示当前正在运行的进程,这意味着如果您的特定进程由于空闲时间而关闭,您必须首先使用该站点才能在列表中显示该进程,在您的情况下,这意味着您应该首先访问所有站点以确保与它们关联的进程正在运行。
ServerManager serverManager = new ServerManager();
ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;
尝试使用它,它应该可以满足您的需求。
打开 IIS 管理器(运行 > Inetmgr),从左侧站点导航树中选择根级别,然后从“功能视图面板”中选择“工作进程”</p>
单击“工作进程”以获取当前正在运行的所有工作进程的详细信息
从此列表中,您将获得应用程序池名称、进程 ID
这应该这样做。
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;
}
PID 和应用程序池给出其名称:
$AppPoolName = 'AppPoolForSite1'
(Get-ItemProperty IIS:\AppPools\$AppPoolName -Name WorkerProcesses).Collection.processId
如果您有多个应用程序池并且想知道每个应用程序池的 PID。您可以运行下面的 powershell,它将遍历机器上的所有应用程序池,查询 PID,并以漂亮的表格格式显示应用程序池名称和 PID。
import-module webadministration
$dirs = dir IIS:\AppPools\
foreach($dir in $dirs)
{
Write-Output([pscustomobject]@{
Name = $dir.Name
PID = (dir IIS:\AppPools\$($dir.Name)\WorkerProcesses).ProcessId
})
}