杀死SYSTEM帐户下的ATL COM流程?

时间:2011-09-06 10:15:13

标签: com atl kill kill-process

我有一个.NET Winddows服务,它在本地系统帐户下运行。然后,此服务运行COM组件,该组件使用COM Interop在Visual Studio 6上的ATL中编写。然后,此COM组件在SYSTEM帐户下运行。我知道我可以冒充另一个帐户,但现在我想留下他们所在的地方。

问题是在Windows服务停止后,COM组件仍然在运行。我也无法杀死这个过程。任务管理器不会杀死它,所以我从命令行尝试了TaskKill。这甚至表示它成功终止了该过程但是当我检查任务管理器时它仍在运行。我尝试过PSKill,但是说拒绝访问。

我已经筋疲力尽了谷歌寻找解决方案。有人可以帮忙吗?

另外,为什么它仍然在运行?

1 个答案:

答案 0 :(得分:3)

杀死进程只是权限问题。假设启用了UAC的Vista / 7,如果您不是以管理员身份运行,则无法终止系统进程。注意 - 成为本地管理员组的成员是不够的。您必须启动任务管理器/进程资源管理器/ pskill或任何使用“以管理员身份运行”以使用管理权限实际运行它们的任何内容。否则,你只是一个普通用户,而你被拒绝了。

至于COM服务器:COM服务器有一个引用计数,只有在计数降到0后它们才会自行关闭。在这种情况下,服务器可能由于以下几个原因而无法关闭:

  1. 您的客户端未正确释放COM服务器创建的所有实例。我不是.NET程序员,所以我不能说这是你应该关注的,或者垃圾收集是否适合你。如果由于崩溃或外部终止导致您的服务在没有正确清理的情况下终止,您将会遇到这个问题。
  2. 服务器可能会在内部增加其引用计数,无论创建者想到什么原因。这甚至可能是服务器中的错误。
  3. IIRC,即使没有活动的客户端,COM也可能会使服务器运行一段时间。如果是这种情况,服务器将在几分钟后关闭。