如何在PowerShell脚本中关联WebRequest与IIS工作进程PID
PowerShell获取IIS请求对应工作进程PID的解决方案
方法1:直接读取Get-WebRequest内置属性
你当前使用的Get-WebRequest返回的请求对象本身就包含对应工作进程的ID字段WorkerProcessId,无需额外做关联映射,直接在筛选后输出该字段即可:
# 筛选testpool中运行超过100秒的请求,同时输出对应工作进程PID Get-WebRequest -AppPool "testpool" | Where-Object {$_.timeElapsed -gt 100000} | Select-Object url,timeElapsed,WorkerProcessId,ClientIPAddress,HostName
输出结果中的WorkerProcessId就是对应w3wp进程的PID,可直接和你获取的应用池工作进程PID列表匹配。
方法2:IISAdministration模块兼容方案(适用于Win10/Server2016及以上版本)
如果使用的是新版IISAdministration模块,可直接遍历应用池下的工作进程,逐个拉取进程内的请求,天然绑定PID:
Import-Module IISAdministration # 定位目标应用池 $targetPool = Get-IISAppPool -Name "testpool" # 遍历所有工作进程,筛选超时请求并关联PID $timeoutRequests = foreach ($workerProc in $targetPool.WorkerProcesses) { $workerProc.GetRequests() | Where-Object {$_.TimeElapsed -gt 100000} | Select-Object ` Url,TimeElapsed,@{Name='ProcessId';Expression={$workerProc.ProcessId}},ClientIPAddress } # 输出结果 $timeoutRequests
注意:以上命令均需要以管理员身份运行PowerShell,且系统已安装IIS对应的「管理脚本和工具」功能。
校验PID对应关系(可选)
如果需要验证PID对应的w3wp进程确实归属目标应用池,可执行以下命令:
Get-Process -Name w3wp | Select-Object Id,@{Name='AppPoolName';Expression={ (Get-CimInstance Win32_Process -Filter "ProcessId = $($_.Id)").CommandLine.Split(' ')[-1] }} | Where-Object AppPoolName -eq "testpool"
内容的提问来源于stack exchange,提问作者manydoubts
相关产品推荐
相关产品推荐

