如何获得一个JobObject的句柄,而不知道它的名字?

我的应用程序正在运行。 我想使用OpenJobObject得到一个Handle到这个OpenJobObject所以我以后可以使用这个句柄。 问题是,我不知道作业名称,并传递NULL作业名称它给出了错误87(参数不正确)回来。

这是我的尝试:

 HANDLE handle = OpenJobObject( JOB_OBJECT_QUERY, FALSE, NULL ); if ( !handle ) printf( "\nError %d", GetLastError() ); else printf( "\nOK" ); 

我也在MSDN上发现:应用程序无法获得它所运行的作业对象的句柄,除非它具有作业对象的名称。 但是,应用程序可以使用NULL调用QueryInformationJobObject函数以获取有关作业对象的信息。

所以我的问题是,是否有可能得到一个处理我的应用程序正在运行的JobObject? 或者得到我的应用程序正在运行的工作的名称?

谢谢!

更新:
我的代码到目前为止: http : SetInformation现在,我得到错误87(参数不正确)从SetInformation 🙁

Solutions Collecting From Web of "如何获得一个JobObject的句柄,而不知道它的名字?"

好的,看起来没有任何支持的方法。 这并不意味着它不能做! 🙂

要枚举系统中的所有句柄,请参阅此问题 。 这里的示例代码过滤了句柄,只查找属于特定进程的那些句柄,但是这很容易改变。 您可能需要先启用调试权限。

对于每个句柄,将其复制到您的进程中,然后调用IsProcessInJob来查找它是否是正确的句柄。

一旦你有这个工作,检查是否SYSTEM_HANDLE.ObjectTypeNumber总是相同的作业对象。 它可能是(在任何给定的操作系统,至少)在这种情况下,你可以通过检查作业对象句柄大幅度提高代码的效率。

你也许也可以过滤运行Secondary Logon服务的进程,因为这似乎是为runas创建作业对象。

(如果你能做到这一点,请张贴代码 – 这对未来的访问者可能非常有用。)