2014-01-22 346 views
0

好吧,这已经让我烦恼了几天。我在一个客户站点上,他们在Windows 2008R2 IIS服务器上运行一些定制的,内部编写的服务。问题在于这些服务中的一些仍然挂起,它们处于“停止”状态,并且将它们关闭的唯一方法是打开进程管理器并终止线程。在任何人使用'runas'或以本地管理员或服务所有者等身份登录之前,我们已经完成了所有这些操作。如何使用Powershell来杀死特定进程ID的线程

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

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

为了让事情变得更加困难,我无法使用进程名称,因为在此服务器上有两个其他网站使用同名的exe,只是在不同的文件夹中。 我所追求的是一种查找和杀死processID的线程的方法,我已经通过脚本获得了这些线程,因此脚本的其余部分可以完成重新启动所述服务的任务。目前这种服务在白天和晚上都会以不一致的方式消失,支持人员必须将RDP放到服务器上,打开进程管理器,查找违规进程并关闭线程,然后重新启动服务。对于这些已经过时的人来说有点太麻烦了,尤其是如果我们可以让PowerShell自动完成。

希望有人能帮助这个。提前致谢。

回答

1

低级别线程处理可能需要本机Win32 API使用。 Powershell可能会帮助P/Invoke,但这个过程将变得非常复杂。对于初学者,找出是否可以使用以下工具来识别卡住的螺纹。也许你可以将这个信息与一些Sysinternals工具(如handle.exe)结合起来,找出真正阻止线程的东西。

.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

+0

嗨,感谢您的意见。然而,你提到的大多数如使用gwmi win32_process和线程我已经尝试过。不幸的是,终止方法取消了进程而不是线程,因此不起作用。是否有可能通过PowerShell更改进程的权限? – Wynn