Win32: Как отправить сообщение процессу, запущенному другим пользователем в Windows?
Мы запускаем два приложения, каждое из которых регистрирует одно и то же сообщение, используя RegisterWindowMessage(): приложение A в качестве обычного пользователя и приложение B в качестве администратора в сеансе одного и того же пользователя на компьютере, и эти приложения отправляют это сообщение одно в другое. Когда A и B работали как один и тот же пользователь, все было хорошо, и мы могли общаться с помощью обмена сообщениями PostMessage(). Теперь, когда приложение B запускается от имени администратора, сообщения больше не поступают. Что мы можем с этим поделать?
Обязывает ли эта ситуация нас использовать другие механизмы (кроме сообщений)?
1 ответ
В Windows Vista и более поздних версиях изоляция привилегий пользовательского интерфейса (UIPI) не позволяет процессу с более низкой целостностью отправлять оконные сообщения процессу более высокой целостности. В более ранних версиях Windows вредоносный код мог атаковать административные процессы, злоупотребляя сообщениями окна. По умолчанию UIPI блокирует все сообщения со значением выше WM_USER
, который включает в себя сообщения, зарегистрированные через RegisterWindowMessage()
, Таким образом, чтобы позволить А отправлять такие сообщения B, B должен сначала вызвать ChangeWindowMessageFilter()
или же ChangeWindowMessageFilterEx()
для каждого заблокированного сообщения, которое оно хочет получить от процессов с более низкой целостностью.