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и Explorer.exe
- В моем случае, в соответствии с Win7, мне, казалось, нужно было разместить элемент «поддержки», указывающий на совместимость Win7 из файла App.Manifest.Кажется, это решает проблему при запуске из Проводника.Чтобы добавить манифест, щелкните правой кнопкой мыши на проект, нажмите «Добавить» и найдите «Файл манифеста приложения».
- Чтобы заставить Visual Studio 2010 работать, мне, похоже, нужно было запретить ей использовать Помощник по совместимости программ. Том Минка рассказывает здесь о двух способах сделать это: https://stackoverflow.com/a/4232259/86375, Обратите внимание: мне пришлось перезапустить VS2010, чтобы принять предложенные им изменения.