Как я могу назначить текущий процесс недавно созданному объекту работы? - PullRequest
2 голосов
/ 08 декабря 2010

Я не могу использовать функцию 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;
}

Манифест UAC (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.Кто-нибудь знает, почему это так?

Ответы [ 2 ]

5 голосов
/ 20 апреля 2012

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

Поскольку я создавал процесс, я просто следовал инструкциям в статье, добавляющей 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, без командной строки.

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

2 голосов
/ 08 декабря 2010

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

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

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

start mintty.exe

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...