2

我有一个在本地系统帐户下运行的 .NET Window 服务。然后,此服务运行使用 COM 互操作在 Visual Studio 6 上以 ATL 编写的 COM 组件。然后,此 COM 组件在 SYSTEM 帐户下运行。我知道我可以冒充另一个帐户,但现在我想把东西留在原处。

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

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

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

4

1 回答 1

3

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

至于一直存在的 COM 服务器:COM 服务器有一个引用计数,并且它们仅在计数降至 0 后才会自行关闭。在您的情况下,服务器可能由于以下几个原因而无法关闭:

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