在调试器下运行时,AssignProcessToJobObject失败并显示“Access Denied”错误

时间:2008-09-18 02:52:32

标签: c++ c winapi createprocess

您执行AssignProcessToJobObject并且失败并显示“拒绝访问”,但仅当您在调试器中运行时才会失败。这是为什么?

2 个答案:

答案 0 :(得分:20)

这个让我困惑了大约30分钟。

首先,您可能需要在应用中嵌入UAC清单(as suggested here)。像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <!-- Identify the application security requirements. -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel
            level="asInvoker"
            uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>

其次(这是我坚持的一点),当您在调试器下运行您的应用程序时,它会在作业对象中创建您的进程。您的子流程需要在将其分配到您的工作之前脱离。所以(呃),你需要在CREATE_BREAKAWAY_FROM_JOB的标志中指定CreateProcess

如果您没有在调试器下运行,或者您的父进程在工作中,则不会发生这种情况。

答案 1 :(得分:5)

这似乎经常让我感到困惑,虽然好,1800INFORMATION的帖子似乎并没有包含许多看似有用的理由和修正,所以似乎有必要发布我为什么看到这种情况发生的总结。

  1. 当试图为自己解决这个问题时,请注意这个问题 从CMD.EXE,Explorer,运行时可能出于不同的原因 和Visual Studio。试图从中运行失败的可执行文件 各个地方可以帮助确定问题的原因。您 应用程序可能只是从CMD.EXE找到,尽管从V.S.失败。 和Explorer.exe
  2. 在我的情况下,在Win7下,我似乎需要取消评论“supportedOS” 元素表示来自app.manifest的Win7兼容性 文件。这似乎解决了从资源管理器运行时的问题。至 添加清单,右键单击项目,点击添加,然后查找 'Application Manifest File'。
  3. 为了让Visual Studio 2010正常工作,我似乎需要阻止它使用程序兼容性助手,Tom Minka在这里分享了两种方法:https://stackoverflow.com/a/4232259/86375,请注意,我必须重新启动VS2010才能使用建议的更改。