如何将当前过程分配给新创建的作业对象?

Fre*_*abe 2 c++ windows winapi

我似乎无法使用AssignProcessToJobObject函数将当前进程分配给CreateJobObject给定的作业对象句柄。这个问题已经在StackOverflow上问过几次了,但是到目前为止,所有解决方案(通常归结为嵌入UAC清单)似乎都不适合我。

我正在Windows 7上使用MSVC9。这是我的示例应用程序的源代码以及我要嵌入的一个小清单(据称可以解决问题-但对我而言不是):

我的示例应用程序(main.cpp):

#include <windows.h>

static void dumpLastError()
{
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );
    OutputDebugStringA( (LPTSTR)lpMsgBuf );

    LocalFree(lpMsgBuf);
}

int main()
{
    HANDLE job = CreateJobObjectA( NULL, "demo job 123" );
    if ( !job ) {
        OutputDebugStringA( "CreateJobObject failed" );
        dumpLastError();
        return 1;
    }

    if ( !AssignProcessToJobObject( job, GetCurrentProcess() ) ) {
        OutputDebugStringA( "AssignProcessToJobObject failed" );
        dumpLastError();
        return 1;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

UAC清单(main.exe.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">
      <ms_asmv3:security>
         <ms_asmv3:requestedPrivileges>
            <ms_asmv3:requestedExecutionLevel level="requireAdministrator"/>
         </ms_asmv3:requestedPrivileges>
      </ms_asmv3:security>
   </ms_asmv3:trustInfo>
</assembly>
Run Code Online (Sandbox Code Playgroud)

我通过运行来构建此示例

cl main.cpp
mt -manifest main.exe.manifest -outputresource:main.exe;1
Run Code Online (Sandbox Code Playgroud)

不幸的是,main.exe在尝试执行这些步骤之后运行示例仍会在调试输出中产生“访问被拒绝”错误AssignProcessToJobObject。有人知道为什么吗?

小智 6

我知道这是一个老问题,但是最近我遇到了完全相同的问题。如建议的那样,直到几分钟前我一直在使用命令行解决方法,我发现了这篇文章

自创建流程以来,我只是按照文章中的说明将CREATE_BREAKAWAY_FROM_JOB添加到流程创建标志中:

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)
Run Code Online (Sandbox Code Playgroud)

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi)
Run Code Online (Sandbox Code Playgroud)

我进行了测试,它可以按预期工作,该进程已分配给该作业,没有UAC清单,没有命令行。

希望它可以帮助您或其他任何有此问题的人。