Обход изоляции сеанса Windows, отображение предупреждающего сообщения в сеансе пользователя из системной службы, Windows 7+

Я хочу реализовать функцию, когда приложение, работающее как служба Windows (как localsystem), будет отображать модальное предупреждение, что-то похожее на экран выключения или экран предупреждения UAC. По сути, то, что невозможно игнорировать, не заметив

Есть 2 вещи, которые я не знаю, как реализовать:

  1. Насколько я понимаю, Windows Vista + больше не позволяет приложению создавать системные модальные окна. Можно ли это обойти и есть ли простой способ сделать это? Единственная альтернатива, о которой я мог думать, - это открыть полноэкранное окно и перехватить alt + tab, ctrl + alt + del и т. Д.

  2. Я также считаю, что невозможно отобразить пользовательский интерфейс в пользовательском сеансе из службы, поскольку он работает в другом сеансе. Есть ли хак, позволяющий это обойти? Одна вещь, о которой я мог подумать, - это найти и вставить код в csrss.exe или winlogon.exe, работающие в данном сеансе, и вызвать удаленный поток. Другой подход - получить дескриптор winlogon и CreateProcessAsUser (). Есть ли другой способ попроще?


person galets    schedule 03.05.2013    source источник


Ответы (2)


Если служба работает как локальная система, WTSQueryUserToken - это самый простой способ получить токен для выполнения кода в данном сеансе.

Вместо модального окна рассмотрите возможность создания нового рабочего стола (CreateDesktop) и переключиться на него. Вы не можете подавить control-alt-delete, но я считаю, что когда меню control-alt-delete закрывается, система обычно возвращается на ваш рабочий стол. Все другие специальные последовательности клавиш следует подавлять, поскольку перехватчики влияют только на рабочий стол, связанный с приложением, которое их устанавливает.

person Harry Johnston    schedule 04.05.2013

  1. Я не совсем понимаю, что вы имеете в виду под "модальными окнами системы". Вы имеете в виду сообщение, которое отображается пользователю даже на экране входа в систему?

  2. Это верно, даже если UserInteractive имеет значение true в реестре, Vista и более поздние версии не разрешат доступ к графическому интерфейсу Windows из служб. Есть несколько способов обойти это, у меня есть простое вспомогательное приложение, которое работает в фоновом режиме (не как служба, а просто непрерывный процесс), которое использует удаленное взаимодействие IPC поверх .NET для обработки простых сообщений, которые служба можно легко подключиться и отправить. Если вы хотите, я могу опубликовать более конкретный пример, но пока вот пошаговая инструкция, как вы можете это реализовать (я буду использовать .NET Remoting для этого примера, но тот же базовый принцип должен применяться к любому решению IPC. ты используешь):

    1. Create a program that acts as a .NET remoting server (NOT as a service, just a continuous process) using the IPC protocol. The remotable interface should contain at least one member for accepting new data, in most cases strings work fine for me. The implemented class should also be able to continuously process new messages.
    2. Подключитесь к службе с помощью удаленного интерфейса, реализованного на первом шаге, и отправьте сообщение, которое будет отображаться на IPC-сервере.
    3. Служба IPC должна обработать это сообщение и отобразить его для пользователя, используя ваши предпочтительные средства или отображая сообщения для пользователя. Я лично использую модальную форму в отдельном потоке, что позволяет конечному пользователю копировать сообщение, если они хотят.
person Bender the Greatest    schedule 21.05.2013
comment
Хотя этот подход проще, чем запуск процесса в контексте пользователя, обратите внимание, что он менее эффективен; для этого требуется, чтобы в контексте пользователя всегда был запущен дополнительный процесс. - person Harry Johnston; 21.05.2013
comment
В моем случае я вставил слушателя в приложение в трее, которое уже используется для управления / мониторинга службы. Да, это требует постоянного присутствия другого процесса, но поскольку у нас уже был другой процесс, который запускается при входе пользователя в систему, я просто добавил туда слушателя. Этот метод также работает, когда служба не работает под учетной записью LocalSystem. - person Bender the Greatest; 21.05.2013