Подтвердить что ты не робот

Как служба Windows может выполнить приложение GUI?

Я написал службу Windows, которая позволяет удаленно запускать и останавливать приложения. Эти приложения запускаются с помощью CreateProcess, и это работает для меня, потому что большинство из них выполняют только обработку бэкэнд. Недавно мне нужно запустить приложения, которые представляют GUI для текущего пользователя в журнале. Как сделать код на С++, чтобы моя служба могла найти текущий активный рабочий стол и запустить графический интерфейс?

4b9b3361

Ответ 1

Ответ Роджера Липскомба, чтобы использовать WTSEnumerateSessions, чтобы найти нужный рабочий стол, затем CreateProcessAsUser, чтобы запустить приложение на этом рабочем столе (вы передаете ему дескриптор рабочего стола как часть структуры

Но самое главное, если приложение внезапно появится на рабочем столе пользователя, это может произойти в очень трудное время (либо потому, что пользователь просто этого не ожидает, либо потому, что вы пытаетесь запустить приложение, когда сеанс еще не инициализирован, в процессе выключения или что-то еще).

Более обычным подходом было бы разместить ярлык для небольшого клиентского приложения для вашей службы в глобальной группе запуска. Это приложение будет запускаться вместе с каждым сеансом пользователя и может использоваться для запуска других приложений (если это необходимо) без какого-либо манипулирования учетными данными пользователя, сеансами и/или рабочими столами.

Кроме того, этот ярлык может быть перемещен/отключен администраторами по желанию, что значительно упростит развертывание вашего приложения, поскольку оно не отклоняется от стандартов, используемых другими приложениями Windows...

Ответ 2

Короткий ответ: "Вы не делаете", поскольку открытие программы GUI, работающей под другим пользовательским контекстом, является уязвимостью безопасности, которая обычно называется Shatter Attack.

Взгляните на эту статью MSDN: Интерактивные службы. Он предоставляет некоторые параметры обслуживания для взаимодействия с пользователем.

Короче, у вас есть следующие опции:

  • Отобразите диалоговое окно в пользовательском сеансе, используя функцию WTSSendMessage.

  • Создайте отдельное скрытое приложение GUI и используйте функцию CreateProcessAsUser для запуска приложения в контексте интерактивного пользователя. Создайте приложение GUI для связи с услугой через некоторый метод межпроцессного взаимодействия (IPC), например, именованные каналы. Служба связывается с приложением GUI, чтобы сообщить об этом, когда отображать графический интерфейс пользователя. Приложение связывает результаты взаимодействия пользователя с сервисом, чтобы служба могла предпринять соответствующие действия. Обратите внимание, что IPC может раскрывать ваши сервисные интерфейсы по сети, если вы не используете соответствующий список управления доступом (ACL).

    Если эта служба работает в многопользовательской системе, добавьте приложение в следующий ключ, чтобы он запускался в каждом сеансе: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Если приложение использует именованные каналы для IPC, сервер может различать несколько пользовательских процессов, предоставляя каждому каналу уникальное имя на основе идентификатора сеанса.

Ответ 3

WTSEnumerateSessions и CreateProcessAsUser.

Ответ 4

Несколько человек предложили WTSEnumerateSessions и CreateProcessAsUser. Интересно, почему никто не предложил WTSGetActiveConsoleSessionId, так как вы сказали, что хотите настроить таргетинг только на одного зарегистрированного пользователя.

Некоторые люди уверены, что имеют право предлагать CreateProcessAsUser. Если вы называете простой старый CreateProcess так, как вы сказали, тогда графический интерфейс приложения будет запускаться с вашими привилегиями службы, а не с правами пользователя.

Ответ 5

Это проблемы Сессия 0, Интерактивные службы, Служба Windows разрешает обслуживание для взаимодействия с рабочим столом на Windows 7 или Windows Vista​​p >

Вы можете прочитать эту статью http://www.codeproject.com/KB/vista-security/SubvertingVistaUAC.aspx

Я попробую объяснить здесь, как он работает с Windows 7

Ответ 6

В Win2K, XP и Win2K3 пользователь консоли входит в сеанс 0, тот же сеанс, в котором живут службы. Если служба настроена как интерактивная, она сможет отображать пользовательский интерфейс на рабочем столе пользователя.

Однако, в Vista, ни один пользователь не может быть зарегистрирован в сеансе 0. Отображение пользовательского интерфейса из службы немного сложнее. Вам необходимо перечислить активные сеансы, используя WTSEnumerateSessions API, найти консольный сеанс и создать процесс как этот пользователь. Конечно, для этого вам нужны также токены или учетные данные пользователя. Подробнее об этом процессе вы можете прочитать здесь.

Ответ 7

Я думаю, что пока у вас будет только один пользователь, он будет автоматически отображаться на этом рабочем столе пользователя.

В любом случае, будьте очень осторожны при запуске службы exe.

Если доступ для записи в папку с exe не ограничен, любой пользователь может заменить этот exe любой другой программой, которая затем будет запускаться с правами sytem. Возьмем, например, cmd.exe(доступно для всех оконных систем). В следующий раз, когда служба попытается запустить exe, вы получите командную оболочку с правами системы...

Ответ 8

Если вы запустите графический интерфейс из своей службы, он появится на текущем рабочем столе.

Но только если вы настроили разрешения службы: вам нужно разрешить взаимодействовать с рабочим столом.

Ответ 9

Важные службы не могут напрямую взаимодействовать с пользователем с Windows Vista. Поэтому методы, упомянутые в разделе "Использование интерактивной службы", не должны использоваться в новом коде.

Это взято из: http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx