Win32: как отправить сообщение процессу, запущенному другим пользователем в Windows?

Мы запускаем два приложения, каждое из которых регистрирует одно и то же сообщение с помощью RegisterWindowMessage(): приложение A как обычный пользователь и приложение B как администратор в сеансе одного и того же пользователя на машине, и эти приложения будут отправлять это сообщение друг другу. Когда A и B запускались от одного и того же пользователя, все было в порядке, и мы могли общаться с помощью обмена сообщениями PostMessage(). Теперь, когда приложение B запускается от имени администратора, сообщения больше не приходят. Что мы можем с этим поделать?

Обязывает ли нас эта ситуация использовать другие механизмы (кроме сообщений)?


person Artem    schedule 15.03.2013    source источник
comment
Пространства имен ядра не применяются к оконным сообщениям.   -  person Remy Lebeau    schedule 16.03.2013
comment
Почему бы не использовать другой тип IPC?   -  person rkosegi    schedule 16.03.2013
comment
@rkosegi Просто не хотел перекодировать то, что уже было закодировано.   -  person Artem    schedule 18.03.2013


Ответы (1)


В Windows Vista и более поздних версиях Изоляция привилегий пользовательского интерфейса (UIPI) не позволяет процессу с более низким уровнем целостности отправлять оконные сообщения процессу с более высоким уровнем целостности. В более ранних версиях Windows вредоносный код мог атаковать административные процессы, неправильно используя оконные сообщения. По умолчанию UIPI блокирует все сообщения со значением выше WM_USER, включая сообщения, зарегистрированные через RegisterWindowMessage(). Таким образом, чтобы позволить A отправлять такие сообщения B, B должен сначала вызвать ChangeWindowMessageFilter() или ChangeWindowMessageFilterEx() для каждого заблокированного сообщения, которое он хочет получить от процессов с более низким уровнем целостности.

person Remy Lebeau    schedule 16.03.2013