com - 杀死系统帐户下的 ATL COM 进程?

标签 com atl kill kill-process

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

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

我已经用尽谷歌来寻找解决方案。有人可以帮忙吗?

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

最佳答案

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

至于 COM 服务器仍然存在:COM 服务器有一个引用计数,只有在计数降至 0 后它们才会自行关闭。在您的情况下,服务器可能由于以下原因而不会关闭:

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

关于com - 杀死系统帐户下的 ATL COM 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318266/

相关文章:

C# + COM,修改参数中的数组

c++ - 使用媒体基础从 h.264 字节流(附件 B)创建 MP4 容器?

c++ - 为什么 IStream::Commit 无法将数据写入文件?

c - 系统调用kill将子进程转换为僵尸进程

c - POSIX 信号行为

c++ - 编写针对 IE7 的 BHO

COM MFC ATL值得学习吗?

c++ - 框架上的权限被拒绝

c++ - 直接访问 C++ ATL COM 对象

python - 如何在运行方法中没有循环的情况下终止 Python 中的线程?