【问题标题】:How to get a handle to a JobObject without knowing its name?如何在不知道其名称的情况下获取 JobObject 的句柄?
【发布时间】:2012-11-09 12:21:28
【问题描述】:

我的应用程序正在作业中运行。我想使用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(参数不正确):(

【问题讨论】:

  • 不幸的是,runas 似乎没有使用命名的作业对象,因此 OpenJobObject 在您的特定情况下不会有帮助。

标签: c windows jobs


【解决方案1】:

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

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

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

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

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

(如果您确实可以使用,请发布代码 - 它可能对未来的访问者非常有用。)

【讨论】:

  • 非常感谢!这应该是可行的……理论上 :) 我肯定会得到这项工作,因为它给我和其他人带来了很多麻烦。我还有一个问题,有人建议使用 jobobjects。 stackoverflow.com/questions/13399313/… 你也可以看看。也许你有另一个想法来解决我的问题。不过我也会这样解决,等我准备好了再贴代码。
  • 是的,我做到了,但不幸的是它没有用。它启动 setup.exe,但在 setup.exe 启动了它的两个进程后,setup.exe 关闭,您的程序也退出了:(
  • 在这种情况下,我认为这可能是唯一现实的用户模式解决方案。如果由于某种原因无法正常工作,或者您不能使用不受支持的 Win32 功能作为政策问题,则需要进入内核模式。
  • 我照你说的做了。但是现在,我遇到了另一个有趣的错误。我从SetInformationJobObject 收到错误 87(参数不正确)。我插入了我的代码的链接。你能检查一下吗?也许我做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2013-11-20
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多