2013-05-03 1 views
1

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

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

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

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

ответ

2

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

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

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

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

    1. Создайте программу, которая работает как удаленный сервер .NET (НЕ как услуга, только непрерывный процесс) с использованием протокола IPC. Удаленный интерфейс должен содержать хотя бы один элемент для приема новых данных, в большинстве случаев строки работают отлично для меня. Внедренный класс также должен иметь возможность непрерывно обрабатывать новые сообщения.
    2. Подключитесь к службе с помощью удаленного интерфейса, реализованного на первом шаге, и отправьте сообщение, которое будет отображаться на сервере IPC.
    3. Служба IPC должна обработать это сообщение и отобразить его пользователю с использованием ваших предпочтительных средств или отображения сообщений пользователю. Я лично использую модальную форму в отдельном потоке, который позволяет конечному пользователю копировать сообщение, если захочет.
+0

Хотя этот подход проще, чем запуск процесса в контексте пользователя, обратите внимание, что он менее эффективен; он требует, чтобы дополнительный процесс выполнялся в контексте пользователя во все времена. –

+0

В моем случае я засунул слушателя в приложение для трейлов, которое уже используется для управления/мониторинга службы. Да, это требует наличия другого процесса, выполняемого в любое время, но поскольку у нас уже был другой процесс, который запускается при входе пользователя, я просто бросил туда слушателя. Этот метод также работает, когда служба не работает как учетная запись LocalSystem. –

Смежные вопросы