singlepost

Запуск процесса с ограничениями с помощью JobObject на C++ << На главную или назад  

"Требуется написать приложение запускающее процесс с ограничениями: на доступ к буферу обмена, к другим приложениям. так же можно ограничивать время использования. Для этого надо использоватьJobObject"
Вот такое вот задание. Написала я программу, но она все равно не ставит ограничения, стала проверять на выполнение, выяснилось,что не создается CreatProcess в чем ошибка понять не могу, подскажите если кто знает.
Вот код:

#include "stdafx.h"
#define UNICODE
#define _WIN32_WINNT 0×0500
#include "windows.h"
#include "conio.h"
#include "stdio.h"
#include <tchar.h>
#include "string.h"
#include "sys/types.h"
#include "stdlib.h"

bool c = false,o=false,t=false;

void fill(LPTSTR str)
{
if(_tcscmp(str,L"c") == 0)
c = true;
else if(_tcscmp(str,L"o") == 0)
o = true;
else if(_tcscmp(str,L"t") == 0)
t = true;

}

void _tmain(int argc, LPTSTR argv[])
{

if(argc < 3)
{
printf("exe app [c] [o] [t]\nc – block read and write clipboard\no – block access to ui objects\nt – end app in 10 sec");
return;
}
if(argc > 3)
fill(argv[3]);
if(argc > 4)
fill(argv[4]);
if(argc > 5)
fill(argv[5]);

HANDLE hjob = CreateJobObject(NULL, NULL);

JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };

if(t)
{
//процесс не может работать больше 10 секунд
jobli.PerProcessUserTimeLimit.QuadPart = 100000000;

jobli.LimitFlags = JOB_OBJECT_LIMIT_JOB_TIME;
}

SetInformationJobObject(hjob, JobObjectBasicLimitInformation,
&jobli, sizeof(jobli));

JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;

jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;

if(c){
// процесс не имеет доступа к чтению буфера обмена
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_READCLIPBOARD;

// процесс не имеет доступа к стиранию буфера обмена
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
}

if(o)
// процесс не имеет права обращаться к USER-объектам в системе (например, к другим окнам)

jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;

SetInformationJobObject(hjob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir));

STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
int er = GetLastError();

CreateProcess(NULL, argv[1], NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);

if(er!=GetLastError())printf("error creating process\n");
er = GetLastError();

AssignProcessToJobObject(hjob, pi.hProcess);

if(er!=GetLastError())printf("error assigning process\n");

ResumeThread(pi.hThread);

CloseHandle(pi.hThread);

HANDLE h[2];
h[0] = pi.hProcess;
h[1] = hjob;

DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);

switch (dw – WAIT_OBJECT_0){

case 0: // процесс завершился.,
printf("process is ended");
break;

case 1: // лимит процессорного времени исчерпан
printf("process is");
break;

}

CloseHandle(pi.hProcess);
CloseHandle(hjob);
return;
}

38 ответов в теме “Запуск процесса с ограничениями с помощью JobObject на C++”

  1. 9
    Оля Шелопаева ответил:

    Поставила проверку и на SetInformationJobObject, самое смешное теперь он говорит что ошибки в обоих SetInformationи в AssignProcess

  2. 8
    Александр Lert ответил:

    Ну печально, конечно… Больше пока идей нет…
    Установите все-таки, в какой точке происходит ошибка.
    SetInformationJobObject тоже может не работать.

  3. 7
    Оля Шелопаева ответил:

    Я так поняла, что этот флаг надо было устанавливать, как флаг создания. Увы, при установке ничего не изменилось, ограничения так и не подключаются =(

  4. 6
    Александр Lert ответил:

    Я не имел в виду ошибку компиляции.
    Есть одна мысль… Вы везде исправили обработку ошибок? Особенно где AssignProcessToJobObject. В Windows XP/Vista стартующие приложения автоматически добавляются в некоторый системный Job. А если процесс уже находится в каком-нибудь Job'е, то его нельзя добавить в еще один Job. Это должно выражаться в том, что AssignProcessToJobObject возвратит FALSE (именно так надо проверять, что есть ошибка). Для исправления надо в CreateProcess указать дополнительный флаг CREATE_BREAKAWAY_FROM_JOB.

  5. 5
    Оля Шелопаева ответил:

    так фишка в том что при компиляции ошибки нет, просто когда через командную строку запускается процесс ограничения накладываемые на него не работают, тое сть он работает больше 10 секунд, имеет доступ к буферу обмена и к другим приложениям =(

  6. 4
    Александр Lert ответил:

    Странный способ проверки на ошибку :)
    вот проверка:
    if(!CreateProcess(…)) {
    //если мы здесь, значит ошибка
    er=GetLastError();//получить код ошибки
    …//вывести сообщение
    }
    А с вашей проверкой не исключено, что CreateProcess работает правильно, но у вас будет выдаваться сообщение об ошибке.
    Кстати, если вы сообщите код ошибки, будет проще понять, в чем проблема.

  7. 3
    Оля Шелопаева ответил:

    Сергей Lucius Старовой
    Проверка на выполнение, то есть если возникает ошибка, то он выдает об этом сообщение.

  8. 2
    Денис Гублин ответил:

    Здорово! Студенты резко активизировались к сессии, и вот занимательное наблюдение – среди просящих помощи гораздо больше девушек, причем, в отличие от ребят, онигораздо чаще прикладывают какие-то конкретные наработки.

  9. 1
    Сергей Старовой ответил:

    а в чем смысл сравнения
    if(er!=GetLastError())

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.