2010-12-08 2 views
1

Я не могу использовать функцию AssignProcessToJobObject, чтобы назначить текущий процесс дескриптору объекта задания, заданному CreateJobObject. Это уже несколько раз задавали в StackOverflow, но пока что ни одно из решений (которое обычно сводится к внедрению манифеста UAC), похоже, работает на меня.Как назначить текущий процесс новому созданному объекту задания?

Я использую MSVC9 для Windows 7 для этого. Вот исходный код для моего приложения образца и небольшой манифест я вложению (который якобы фиксирует проблему - но не для меня):

Мой пример приложения (main.cpp):

#include <windows.h> 

static void dumpLastError() 
{ 
    LPVOID lpMsgBuf; 
    DWORD dw = GetLastError(); 

    FormatMessage(
     FORMAT_MESSAGE_ALLOCATE_BUFFER | 
     FORMAT_MESSAGE_FROM_SYSTEM, 
     NULL, 
     dw, 
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
     (LPTSTR) &lpMsgBuf, 
     0, NULL); 
    OutputDebugStringA((LPTSTR)lpMsgBuf); 

    LocalFree(lpMsgBuf); 
} 

int main() 
{ 
    HANDLE job = CreateJobObjectA(NULL, "demo job 123"); 
    if (!job) { 
     OutputDebugStringA("CreateJobObject failed"); 
     dumpLastError(); 
     return 1; 
    } 

    if (!AssignProcessToJobObject(job, GetCurrentProcess())) { 
     OutputDebugStringA("AssignProcessToJobObject failed"); 
     dumpLastError(); 
     return 1; 
    } 

    return 0; 
} 

ОАК манифеста (main.exe.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3"> 
     <ms_asmv3:security> 
     <ms_asmv3:requestedPrivileges> 
      <ms_asmv3:requestedExecutionLevel level="requireAdministrator"/> 
     </ms_asmv3:requestedPrivileges> 
     </ms_asmv3:security> 
    </ms_asmv3:trustInfo> 
</assembly> 

Я строю этот пример, запустив

cl main.cpp 
mt -manifest main.exe.manifest -outputresource:main.exe;1 

К сожалению, запуск моего образца main.exe после этих шагов по-прежнему приводит к ошибке «Доступ запрещен» при отладочном выходе при попытке вызова AssignProcessToJobObject. Кто-нибудь знает, почему это так?

+0

Вы используете cygwin случайно? Или ваши команды сборки/запуска в окне cmd? – 2010-12-08 12:20:56

+0

@ Ryan Calhoun: Нет, я не использую Cygwin, но я использую PyCmd (простая замена cmd.exe). Это интересный вопрос! Я просто попробовал его из cmd.exe, и теперь он работает! Странный. – 2010-12-08 12:47:31

ответ

2

В какой-то момент я последовал за несколькими обсуждениями вопросов, связанных с объектами работы и манифестами UAC. Единственная информация, которая помогла мне в той же проблеме, что у вас была, это то, что эта функция безопасности (представленная в Vista), по-видимому, не применяется при запуске из cmd.

Я предполагаю, что вы запускаете PyCmd из меню «Пуск». Попробуйте запустить его из cmd, и я готов поспорить, что проблема тоже исчезнет.

То, что я в конечном итоге делает (для запуска mintty с Cygwin) был сделать mintty.bat, который сказал

start mintty.exe 

, а затем ярлык mintty.bat который имел набор свойств для запуска «минимизировано» (Я забыл точную формулировку). Это позволяет оболочке, которую я хотел запустить из меню «Пуск», и все еще работать так, как если бы она была запущена из cmd.exe.

Как примечание, мне бы очень понравилось, если кто-то придет и действительно объяснит проблему на уровне сборки и как ее исправить.

+0

Я понятия не имею о проблеме UAC или о том, почему cmd имеет значение, но вы можете вырезать файл .bat, установив для этой цели ярлык: `C: \ Windows \ system32 \ cmd.exe/c start C : \ cygwin \ bin \ mintty.exe -` – ak2 2010-12-20 14:49:42

4

Я знаю, что это старый вопрос, но у меня недавно была такая же проблема. Как и предполагалось, я использовал обходное решение командной строки до тех пор, пока пару минут назад не нашел this post.

Поскольку я создавал этот процесс, я просто следовал инструкциям по статье добавления CREATE_BREAKAWAY_FROM_JOB флагам создания процесса:

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) 

с

CreateProcess(szPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi) 

Я проверил, и она работает, как ожидалось, процесс присваивается заданию, нет манифеста UAC, нет командной строки.

Надеюсь, это поможет вам или кому-либо еще с этой проблемой.

Смежные вопросы