如何获取IIS AppPool工作进程ID

时间:2011-08-10 16:42:07

标签: iis powershell automation

我有一个PowerShell脚本,当我们的监控服务检测到网站已关闭时,该脚本会自动运行。 它应该停止AppPool(使用Stop-WebAppPool -name $AppPool;),等到它真的停止然后重新启动它。

有时它的过程实际上并没有停止,表现为错误

Cannot Start Application Pool:  
The service cannot accept control messages at this time.
(Exception from HRESULT: 0x80070425)"

当你尝试再次启动时。

如果需要超过一定的秒数才能停止(我会在经过多次停留以查看通常需要多长时间后选择那段时间),我想要终止这个过程。

我知道我可以通过dir IIS:\AppPools\MyAppPool\WorkerProcesses\获取AppPool中工作人员使用的进程列表,

Process ID  State      Handles  Start Time
----------  -----      -------  ----------
7124        Running

但我无法弄清楚如何实际捕获进程ID,以便我可以杀死它。

3 个答案:

答案 0 :(得分:31)

如果进程ID确实是要杀死的进程的ID,您可以:

$id = dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | Select-Object -expand processId
Stop-Process -id $id

dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | % { Stop-Process -id $_.processId }

答案 1 :(得分:13)

在服务器上的命令提示符中,我只是执行以下操作以获取正在运行的AppPool PID列表,以便我可以使用taskkill或任务管理器终止它们:

cd c:\windows\system32\inetsrv
appcmd list wp

taskkill /f /pid *PIDhere*

答案 2 :(得分:8)

(从罗马的评论中添加答案,因为stej的解决方案可能存在缓存问题)

在Web服务器上以管理员身份打开Powershell,然后运行:

gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | select AppPoolName,ProcessId 

您应该看到类似的内容:

AppPoolName ProcessId
----------- ---------
AppPool_1        8020
AppPool_2        8568

然后,您可以使用任务管理器将其终止或在Powershell中使用:

Stop-Process -Id xxxx

如果你得到 Get-WmiObject:无法从名称空间root / WebAdministration获取对象。无效的命名空间然后您需要使用以下命令启用 IIS管理脚本和工具功能:

ipmo ServerManager
Add-WindowsFeature Web-Scripting-Tools