Похоже, что начиная с Windows Vista, процессы с более низким уровнем целостности (IL) не могут отправлять сообщения процессам с более высоким уровнем целостности.Это имеет смысл с точки зрения безопасности, но нарушает некоторые из наших межпроцессных взаимодействий.
У нас есть устаревшее приложение (Процесс A), которое, к сожалению, должно работать с повышенными привилегиями «администратора» (для этого нужно установить для ярлыка значениевсегда запускать от имени администратора).Иногда требуется создать отдельное приложение (Процесс B).В результате процесс B наследует те же повышенные привилегии (и IL), что и процесс A. В этом и заключается проблема.Могут быть и другие независимые экземпляры Процесса B, которые не имеют повышенные привилегии, и все эти экземпляры Процесса B должны иметь возможность отправлять сообщения друг другу.Это, очевидно, дает сбой, если один экземпляр процесса B повышен, а другой нет.
Я знаю, что мы можем открыть дыры в фильтре сообщений UIPI, используя метод API ChangeWindowMessageFilter
, но это нене кажется идеальным решением.Вместо этого я бы предпочел, чтобы процесс A порождал процесс B с ограниченными привилегиями, в частности, чтобы он мог взаимодействовать с другими экземплярами процесса B.Я думаю, что по умолчанию другие экземпляры Процесса B работают на «Среднем» IL, поэтому я бы хотел, чтобы Процесс A вызывал экземпляры Процесса B с этим же IL.
Мои поиски привели меня к CreateProcessAsUser
и CreateRestrictedToken
Методы API, но, несмотря на эту документацию, все различные аспекты токенов и дескрипторов безопасности и тому подобное все еще очень меня смущают.
Я также сталкивался здесь с некоторыми потоками ( Запуск процесса с минимально возможными привилегиями в winapi и Удаление привилегий в C ++ в Windows ), но я не могу найти хороших примеров сcode.
Может ли кто-нибудь предоставить мне простой, но "правильный" код, который поможет мне порождать дочерние процессы, используя соответствующий Windows IL?В частности, я хотел бы привести пример того, как взять существующий токен Process A и преобразовать его, чтобы он имел уменьшенные привилегии (я уверен, что смогу выяснить остальное).Мне действительно неясно, нужно ли мне дублировать токен процесса перед его изменением.