2

我的应用程序正在工作中运行。我想使用这个 Jobobject 获得一个句柄,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 ://pastebin.com/aJ7XMmci 现在,我收到错误 87(参数不正确)来自SetInformation:(

4

1 回答 1

0

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

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

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

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

您也许还可以过滤到仅运行辅助登录服务的进程,因为这似乎是为 runas 创建作业对象的原因。

(如果你确实得到了这个工作,请发布代码 - 它可能对未来的访问者非常有用。)

于 2012-11-21T21:28:17.817 回答