如何使用Powershell杀死特定processID的线程

时间:2014-01-22 10:07:33

标签: iis powershell service pid threadstatic

好吧,这一直困扰着我几天。我在一个客户端站点,他们有一些定制,内部编写,在Windows 2008R2 IIS服务器上运行的服务。问题是这些服务中有几个一直处于挂起状态,它们处于“停止”状态,杀死它们的唯一方法是打开进程资源管理器并终止线程。在任何人说出使用'runas',或以本地管理员或服务所有者等身份登录之前,我们已经完成了所有这些。

问题在于可执行文件本身。在另一个国家的开发团队将会考虑这个问题,但最少需要4-5个月,我们不确定他们是否能够做到这一点。

我有一个Powershell脚本来定期检查服务,该服务能够确保服务正在运行,如果没有,则强制停止并重新启动服务,然后发送电子邮件以确认操作。但是,提到这些特定服务它无能为力。它们不能在任务管理器,taskkill或进程资源管理器中被杀死(除非有人杀死线程)它只是说访问被拒绝。可以在进程资源管理器中更改权限并终止它,但这比杀死线程更长。

为了使事情变得更加困难,我无法使用进程名称,因为在此服务器上有两个其他网站使用具有相同名称的exe,只是在不同的文件夹中。 我所追求的是一种查找和终止processID线程的方法,我已经通过我自己的脚本获取了该线程,因此脚本的其余部分可以完成重启所述服务的任务。目前,这项服务在整个白天和晚上以不一致​​的方式死亡,并且支持人员必须将RDP放到服务器上,打开进程资源管理器,找到有问题的进程并终止线程然后重新启动服务。对于这些已经过度工作的人来说有点麻烦,特别是如果我们可以让powershell自动完成它。

希望有人可以帮忙解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

低级线程处理可能需要本机Win32 API使用。 Powershell可能对P / Invoke有所帮助,但这个过程将变得复杂。对于初学者,请确定是否可以使用以下工具来识别卡住的线程。也许你可以将这些信息与一些像sys.exe这样的Sysinternals工具结合起来,找出真正阻塞线程的内容。

.Net框架通过System.Diagnostics.Process命名空间提供了一些工具。可以使用命名流程的线程列表,

$ps = [diagnostics.process]::getProcessesByName("iexplore")
$p = $ps[0]
$p.Threads[0]

完整documentation位于MSDN中。没有杀死线程的方法,但这应该是识别卡住线程的起点。

另一种方法是使用WMI来获取win32_thread这样的数据,

$threads = gwmi win32_thread

输出完全不同,需要进行一些过滤。一些例子are available。另一个WMI解决方案尝试可能基于具有Terminate方法的Win32_process