使用Powershell获取IIS应用程序池ProcessID



我已经搜索了很多选项,以获取powershell脚本的应用程序池进程id。我遇到的问题是,我发现大多数解决方案都指向使用WebAdministration WorkerProcess。我在Windows Server 2012(IIS 8(和Windows Server 2019(IIS 10(上尝试了以下脚本。

Get-ChildItem -Path IIS:AppPools |%{
$AppPool = $_.Name
Get-WmiObject -NameSpace 'rootWebAdministration' -class 'WorkerProcess' | Where-Object {$_.AppPoolName -match $AppPool} | Select-Object -Expand ProcessId | ForEach-Object {
$AppPoolPID=$_
$AppPoolProcces = Get-Wmiobject -Class Win32_PerfFormattedData_PerfProc_Process | Where-Object { $_.IdProcess -eq $AppPoolPID } 
$AppPoolCpu = $AppPoolProcces.PercentProcessorTime
$AppPoolMemory = [Math]::Round(($AppPoolProcces.workingSetPrivate / 1MB),2)
$Cpu += $AppPoolCpu
$Memory += $AppPoolMemory
Write-Host "Application pool $AppPool process id: $_ Percent CPU: $Cpu Private Memory: $Memory"
}
}

运行Get-WmiObject -NameSpace 'rootWebAdministration' -List提供了一个相当大的项目列表,但WorkerProcesses不是其中之一。

我还尝试过dir IIS:AppPools$AppPoolWorkerProcesses,它也没有提供任何结果。

如何获取特定应用程序池的processId?或者,如果这不再可能,我将如何获得特定应用程序池的cpu和内存消耗?

尝试管道以获取一些额外信息:

$id = dir IIS:AppPoolsMyAppPoolWorkerProcesses | Select-Object -expand processId
$id

感谢@dai指出,由于缺少web请求,进程甚至可能无法运行。我的印象是它会一直运行。

我最初发布的脚本部分确实有效。因此,就我的目的而言,没有结果是一件好事。

您可以使用appcmd.exe列出所有正在运行的工作进程,如下所示:

C:WindowsSystem32inetsrvappcmd list wp

输出

WP "16474" (applicationPool:testSite1)
WP "30531" (applicationPool:testSite2)

如果你想只返回一个应用程序池的进程ID,你可以这样调用:

C:WindowsSystem32inetsrvappcmd list wp /apppool.name:"testSite1" /text:WP.NAME

输出

16474

进一步阅读

  • IIS应用程序池PID
  • 确定哪个w3wp.exe进程属于Windows 7/IIS7.5中的哪个应用程序池

最新更新