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