如何在不知道其名称的情况下获取JobObject的句柄?

时间:2012-11-21 09:27:58

标签: c windows jobs

我的应用程序正在运行。我想使用OpenJobObject获取此Jobobject的句柄,以便稍后我可以使用此句柄。问题是,我不知道作业名称,并且将NULL传递给作业名称,它返回错误87(参数不正确)。

这是我尝试的方式:

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

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

所以我的问题是,是否有可能以某种方式获得运行我的应用程序的JobObject的句柄?或者获取我的应用程序正在运行的作业的名称?

谢谢!

更新:
到目前为止我的代码:http://pastebin.com/aJ7XMmci 现在,我从SetInformation收到错误87(参数不正确):(

1 个答案:

答案 0 :(得分:0)

好的,看起来没有任何支持的方法。这并不意味着它无法完成! : - )

要枚举系统中的所有句柄,请参阅this question。示例代码here过滤句柄,只查找属于特定进程的句柄,但这很容易更改。您可能需要先启用调试权限。

对于每个句柄,将其复制到您的过程中,然后调用IsProcessInJob以确定它是否是正确的句柄。

完成工作后,检查SYSTEM_HANDLE.ObjectTypeNumber对于作业对象是否始终相同。它可能(在任何给定的操作系统上,至少)在这种情况下,只需检查作业对象句柄就可以大大提高代码的效率。

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

(如果确实如此,请发布代码 - 这对未来的访问者非常有用。)