为什么WmiPrvSE.exe会占用我的进程作业对象的句柄?

3
我有一个.NET应用程序,它会生成多个子“工作进程”。我正在使用Windows Job对象API和JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE设置,以确保在父进程终止时始终杀死子进程。
然而,我观察到在父进程关闭后,机器上仍有许多孤立的进程在运行。使用Process Explorer,我可以看到它们仍然正确地分配给了Job,并且Job已经配置了正确的“Kill on Job Close”设置。
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE的文档说明如下: “当关闭与作业关联的最后一个句柄时,导致所有与作业相关的进程终止。”
这似乎意味着某个地方仍然打开了对Job的句柄...我搜索了我的Job对象的句柄,并在结果中发现了WmiPrvSE.exe的实例。如果我杀死相关的WmiPrvSE.exe进程,则显然关闭了对Job的未处理句柄,并且所有孤立的应用程序进程都得到了预期的终止。
为什么WmiPrvSE.exe会有一个对我的Job的句柄?
1个回答

2
您可以在这篇博客中了解WmiPrvSE的相关信息:http://blogs.msdn.com/b/wmi/archive/2009/05/27/is-wmiprvse-a-real-villain.aspx WmiPrvSE是WMI提供程序宿主。这意味着它托管WMI提供程序,这些提供程序是DLL文件。因此,几乎可以肯定WmiPrvSE没有处理您的作业,但是它托管的提供程序之一可能有。为了找出哪个提供程序是罪魁祸首,一种方法是按照这里的过程,然后查看哪个单独的进程持有该句柄。
确定哪个提供程序持有句柄后,您可以尝试推断基于提供程序管理的系统组件,哪种查询会持有对作业的句柄。或者,如果您不关心失去对提供程序提供的组件管理的访问权限,可以禁用提供程序。
如果您可以确定哪种查询将持有句柄,则可以推断发出查询的程序是什么。或者,事件日志可以告诉您(参见上面的第一个链接)。
要获取更多帮助,请在OP中提供其他详细信息,例如在WmiPrvSE中运行哪些提供程序、任何相关的事件日志事件以及您获得的任何其他诊断信息。
编辑1/27/16
找出导致WMIPrvSE获取您作业句柄的原因的方法之一是使用Windbg的!htrace扩展。在加载.EXE但在Windbg中执行它之前,您需要运行!htrace -enable。然后,稍后可以中断并执行!htrace <handle>以查看操作句柄时的堆栈跟踪。您可能需要从这篇关于句柄实现的文章开始。

感谢您的帮助 - 显然是WmiPrvSE进程拥有对作业的句柄(而不是其他查询WMI的进程)。我已按照上述博客启用了诊断日志记录,但由于我无法确定何时打开了该句柄,很难将根本原因与众多的WMI事件相关联。不过还是非常感谢您的帮助 - 我会继续努力的。 - Chris Brook
另一个进程查询WMI可能会导致WMIPrvSE打开一个句柄。据我理解,WMIPrvSE并不是自行操作,而是由于WMI查询而产生的。因此,即使另一个进程正在进行查询并且没有直接拥有该句柄,那个进程也可能是罪魁祸首。请参阅我对这个答案的编辑。 - Χpẘ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接