Как дать процессу определенные привилегии в windows

Я пишу программное обеспечение для тестирования, которое получает исходный код, компилирует его на сервере, выполняет его, пересылает ввод из базы данных, улавливает вывод и сравнивает его с кодом в базе данных, чтобы убедиться, что он правильный. Проблема в том, что исходный код может быть любым (он написан на c / c ++ и скомпилирован с помощью Visual Studio cl), поэтому мне нужно как-то предотвратить злонамеренных пользователей. Я автоматически убиваю эти процессы, если они работают дольше определенного времени или используют больше памяти, чем разрешено.

Вопрос в том, могу ли я разрешить этим процессам только писать и читать из стандартных потоков ввода / вывода и запрещать любые другие права доступа в Windows.

Прошу прощения за мой английский.

Заранее спасибо.


person Klark    schedule 11.06.2010    source источник


Ответы (1)


Возможно, вам помогут объекты задания (см. http://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx). Эта очень мощная функция малоизвестна.

Работать с вакансиями очень легко. Вы можете создать задание с учетом CreateJobObject и установить множество различных ограничений, таких как время, память и некоторые ограничения. Затем вы можете создать процесс с флагом приостановки, назначить процесс заданию и возобновить процесс. Тогда вы получите полный контроль над созданным процессом и всем деревом дочерних процессов, которые этот процесс может создать. Функция Job существует с Windows 2000.

Другой современный способ - изоляция привилегий пользовательского интерфейса (UIPI) (см. http://msdn.microsoft.com/en-us/library/bb625963.aspx) или способ использования процессов низкой целостности, представленных Vista. См. http://msdn.microsoft.com/en-us/library/Bb250462#dse_stlip, как создать процесс с низким уровнем целостности.

person Oleg    schedule 11.06.2010
comment
Спасибо, это было действительно полезно. Большая часть моего проекта написана на java, поэтому я постараюсь найти какой-нибудь хороший API для объектов заданий, либо воспользуюсь JNI, либо попробую UIPI. Большое Вам спасибо. - person Klark; 11.06.2010