我的应用程序正在运行。我想使用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(参数不正确):(
答案 0 :(得分:0)
好的,看起来没有任何支持的方法。这并不意味着它无法完成! : - )
要枚举系统中的所有句柄,请参阅this question。示例代码here过滤句柄,只查找属于特定进程的句柄,但这很容易更改。您可能需要先启用调试权限。
对于每个句柄,将其复制到您的过程中,然后调用IsProcessInJob以确定它是否是正确的句柄。
完成工作后,检查SYSTEM_HANDLE.ObjectTypeNumber
对于作业对象是否始终相同。它可能(在任何给定的操作系统上,至少)在这种情况下,只需检查作业对象句柄就可以大大提高代码的效率。
您也许也可以过滤到运行Secondary Logon服务的进程,因为这似乎是为runas创建作业对象的。
(如果确实如此,请发布代码 - 这对未来的访问者非常有用。)