获取运行进程的作业对象的句柄



我可以通过 IsProcessInJob 检查我的进程是否在作业中,带有 null。但我需要一个处理这项工作的把柄。我该怎么做?

我们有一个自动化系统,将流程包装在作业对象中。但是,我们必须调用提供给我们的脚本,该脚本在此作业对象之外启动进程。因此,我们需要手动添加该过程,以便在作业失败并且必须终止时,它也会被杀死。

Windows 不提供任何受支持的方法来打开与进程关联的作业对象;创建作业对象的进程负责为其他进程提供一种查找它的方法(如果它们希望能够这样做)。 但是,由于您想让孩子从事工作的唯一原因是为了让自动化系统杀死它,因此还有另一种解决方案。

不要尝试将子项放入现有作业对象中,而是创建一个您自己控制的新作业对象,并将子项分配给该对象。 设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE基本限制标志,以便在删除作业对象时终止子项(及其可能具有的任何子项),并确保作业对象的句柄不可继承。

如果自动化系统终止您的进程,或者如果它因任何其他原因退出,Windows 将自动关闭句柄并删除作业对象,从而根据需要终止子进程。

Harry Johnstons的建议奏效了。

如果让孩子从事这项工作的唯一原因是为了杀死它,你也许可以用另一种方式做到这一点。将子项放入新创建的作业对象中,并设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,并确保作业句柄不可继承。如果进程被终止,作业句柄将关闭,从而导致子项被终止。

最新更新