【问题标题】:How to detach a process from a JobObject如何从 JobObject 中分离进程
【发布时间】:2012-11-20 10:50:13
【问题描述】:

有没有办法从 JobObject 中分离进程? 我的问题是,如果我使用 RunAs 创建一个新进程,例如 cmd.exe,那么它将自动分配给 JobObject。如果我想从这个 cmd 运行我的应用程序,它也会被分配给这个 jobobject。问题从这里开始,因为我的应用程序会创建一个新的jobobject并创建一个新进程,然后将其分配给我的新JobObject,但它无法关联,因为第一个cmd以runas开头,已经分配给了一个jobobject,并且所以我创建的新进程也分配给了这个jobobject。

所以我的问题是,如何将第一个 cmd 从将自动创建的作业对象中分离出来,或者我该如何解决这个问题?

【问题讨论】:

  • 查看 CREATE_BREAKAWAY_FROM_JOB 标志 (msdn.microsoft.com/en-us/library/windows/desktop/…)。但我不知道 RunAs 是否使用作业对象作为安全措施。如果是这样,它将禁用JOB_OBJECT_LIMIT_BREAKAWAY_OK,并且该标志将不起作用。
  • 另外,Windows 8 似乎支持嵌套作业 (msdn.microsoft.com/en-us/library/windows/desktop/…),所以如果您可以让您的应用“仅限 Windows 8”... :)
  • @atzz:不幸的是,我的应用程序也必须在 XP 和 Windows 7 下运行,所以不能选择 Windows 8 :)
  • @atzz:我认为 RunAs 使用作业对象,因为如果您使用 runas 打开 cmd,它已经与作业相关联。这是我的问题:(
  • 您不能取消现有流程与作业的关联。但是如果CREATE_BREAKAWAY_FROM_JOB标志在RunAs下工作,你可以用这个标志创建一个子进程,这个子进程就可以从工作中解脱出来。问题是 RunAs 是否允许使用这个标志。如果在启动cmd 时没有设置JOB_OBJECT_LIMIT_BREAKAWAY_OK,则该标志将不起作用。

标签: c windows


【解决方案1】:

考虑以标准用户身份运行父应用程序并使用CreateProcessWithLogonW 提升权限,而不是使用runas。

或者,您可以使用psexec,尽管它设计用于远程执行命令,但通常可以用于转义本地计算机上的当前上下文。您可以使用 psexec 作为 runas 的替代方案:

psexec -i \\%COMPUTERNAME% -u adminuser cmd.exe

(系统将提示您输入密码)或者您可以使用 runas 然后

psexec -s -i \\%COMPUTERNAME% parent.exe

在本地系统上下文中运行parent.exe。这将转义现有的作业对象,因为新进程是从系统服务启动的。

请注意,在 Vista 及更高版本中使用带有 -i 标志的 psexec 会更棘手,因为它更广泛地使用多个终端服务器会话;在那种情况下,您最好还是坚持使用 runas。幸运的是,您的问题仅适用于 XP。 :-)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多