在调试器下运行时,AssignProcessToJobObject 失败并出现“访问被拒绝”错误
-
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 的帖子似乎没有包含一些看起来有帮助的原因和修复方法,因此似乎值得发布我看到这种情况发生的原因的摘要。
- 当尝试自己解决这个问题时,请注意,从CMD.EXE,Explorer和Visual Studio运行时,可能会出于不同的原因而出现此问题。尝试从各个地方运行失败的可执行文件可以帮助确定问题的原因。您的应用程序可能会从cmd.exe找到工作,尽管vs失败了和资源管理器.exe
- 就我而言,在Win7下,我似乎需要取消征服“支持的索斯”元素,以指示app.manifest文件中的win7兼容性。这似乎解决了从资源管理器运行时的问题。要添加清单,请右键单击该项目,点击添加,然后查找“应用清单文件”。
- 为了让 Visual Studio 2010 正常工作,我似乎需要阻止它使用程序兼容性助手,Tom Minka 在这里分享了两种方法: https://stackoverflow.com/a/4232259/86375, ,注意,我必须重新启动 VS2010 才能接受他建议的更改。
不隶属于 StackOverflow