2010-12-08 48 views
1

我似乎无法使用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; 
} 

的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> 

我通过运行

cl main.cpp 
mt -manifest main.exe.manifest -outputresource:main.exe;1 
生成此示例

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

+0

你是否在使用cygwin?或者是在cmd窗口中构建/运行命令? – 2010-12-08 12:20:56

+0

@Ryan Calhoun:不,我没有使用Cygwin,但我使用PyCmd(一个简单的cmd.exe替换)。这是一个有趣的问题!我只是从cmd.exe中试过,现在它似乎工作!奇。 – 2010-12-08 12:47:31

回答

2

我跟踪了一些与工作对象和UAC清单相关的讨论。唯一帮助我解决与您遇到的问题相关的信息是,从cmd运行时,此安全功能(在Vista中引入)显然未实施。

我假设你从开始菜单启动PyCmd。尝试从cmd启动它,我敢打赌,问题也会消失。

我最终什么事做(运行使用Cygwin mintty)中做出mintty.bat该说

start mintty.exe 

,然后一个快捷方式到mintty.bat其中有一个属性设置为运行“最小化” (我忘记了确切的措词)。这允许我想从启动菜单启动的外壳,仍然可以像从cmd.exe启动一样工作。

作为一个侧面说明,如果有人会出现并真正在构建级别解释问题以及如何解决问题,那么我会喜欢它。

+0

我不知道UAC问题或为什么cmd有所作为,但可以通过设置快捷方式目标来切出.bat文件,如下所示:`C:\ Windows \ system32 \ cmd.exe/c start C :\ cygwin \ bin \ mintty.exe -` – ak2 2010-12-20 14:49:42

4

我知道这是一个老问题,但我最近有完全相同的问题。 建议我使用命令行解决方法,直到几分钟前我发现this post

自从我创建的过程中,我只是跟着在文章中加入CREATE_BREAKAWAY_FROM_JOB的进程创建标志说明:

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) 

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi) 

我测试和它的作品如预期,进程被分配给作业,没有UAC清单,没有命令行。

希望它可以帮助你或任何其他人有这个问题。

相关问题