2011-09-06 26 views
2

我有一个运行在本地系统帐户下的.NET Winddows服务。然后,此服务运行COM组件,该COM组件使用COM Interop在Visual Studio 6上的ATL中编写。此COM组件然后在SYSTEM帐户下运行。我知道我可以冒充另一个帐户,但现在我想把事情留在原地。在SYSTEM帐户下杀死一个ATL COM进程?

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

我已经穷尽Google寻找解决方案。谁能帮忙?

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

回答

3

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

至于COM服务器坚持围绕:COM服务器有一个引用计数,和他们自行关闭计数下降到0。在你的情况下,只有后,服务器可能无法关闭的原因有几个原因:

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