关于C#:在调试器下运行时,AssignProcessToJobObject失败,并显示” Access Denied”错误

关于C#:在调试器下运行时,AssignProcessToJobObject失败,并显示” Access Denied”错误

AssignProcessToJobObject fails with “Access Denied” error when running under the debugger

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


这使我困惑了大约30分钟。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 
    <!-- Identify the application security requirements. -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
        <requestedPrivileges>
          <requestedExecutionLevel
            level="asInvoker"
            uiAccess="false"/>
        </requestedPrivileges>
      </security>
    </trustInfo>
  </assembly>

第二(这就是我坚持的一点),当您在调试器下运行应用程序时,它将在作业对象中创建进程。在将子进程分配到您的工作之前,需要能够脱离哪个子进程。因此(duh),您需要在CreateProcess的标志中指定CREATE_BREAKAWAY_FROM_JOB)。

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


这似乎经常咬我,虽然好,但是1800INFORMATION的帖子似乎没有包含很多有用的原因和修复,因此,值得总结一下为什么我会看到这种情况。

  • 尝试自己解决此问题时,请注意此问题
    从CMD.EXE,资源管理器,
    和Visual Studio。尝试从中运行失败的可执行文件
    各个地方都可以帮助确定问题的原因。您
    尽管V.S失败,但该应用仍可以从CMD.EXE查找。
    和Explorer.exe
  • 就我而言,在Win7下,我似乎需要取消注释" supportedOS"
    表示来自app.manifest的Win7兼容性的元素
    文件。从资源管理器运行时,这似乎可以解决问题。至
    添加清单,右键单击该项目,单击"添加",然后找到
    "应用清单文件"。
  • 为了使Visual Studio 2010正常工作,我似乎需要停止使用程序兼容性助手,Tom Minka在此处共享了两种方法来执行此操作:https://stackoverflow.com/a/4232259/86375,请注意,我必须重新启动VS2010以进行建议的更改。

  • 推荐阅读