在调试器下运行时,AssignProcessToJobObject 失败并出现“访问被拒绝”错误

StackOverflow https://stackoverflow.com/questions/89588

  •  01-07-2019
  •  | 
  •  

你做 AssignProcessToJobObject 并且仅当您在调试器中运行时才会因“访问被拒绝”而失败。为什么是这样?

有帮助吗?

解决方案

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

首先,您可能需要在您的应用程序中嵌入一个 UAC 清单(正如这里所建议的)。像这样的东西:

<?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).

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

其他提示

这似乎经常困扰着我,虽然很好,但 1800INFORMATION 的帖子似乎没有包含一些看起来有帮助的原因和修复方法,因此似乎值得发布我看到这种情况发生的原因的摘要。

  1. 当尝试自己解决这个问题时,请注意,从CMD.EXE,Explorer和Visual Studio运行时,可能会出于不同的原因而出现此问题。尝试从各个地方运行失败的可执行文件可以帮助确定问题的原因。您的应用程序可能会从cmd.exe找到工作,尽管vs失败了和资源管理器.exe
  2. 就我而言,在Win7下,我似乎需要取消征服“支持的索斯”元素,以指示app.manifest文件中的win7兼容性。这似乎解决了从资源管理器运行时的问题。要添加清单,请右键单击该项目,点击添加,然后查找“应用清单文件”。
  3. 为了让 Visual Studio 2010 正常工作,我似乎需要阻止它使用程序兼容性助手,Tom Minka 在这里分享了两种方法: https://stackoverflow.com/a/4232259/86375, ,注意,我必须重新启动 VS2010 才能接受他建议的更改。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top