Соображения по обеспечению
безопасности диалоговых служб
Службы, запускающиеся в
улучшенном контексте обеспечения
безопасности, типа учетной записи LocalSystem, не
должны создавать окно на диалоговом
рабочем столе, потому что любое другое
приложение, которое запускается на
диалоговом рабочем столе, может
взаимодействовать с этим окном. Это
отличает службу от любого приложения,
которое начал выполнять пользователь.
Кроме того, службы, которые запускаются как LocalSystem, не должны обращаться к диалоговому
рабочему столу, вызывая функцию OpenWindowStation
или GetThreadDesktop.
Нижеследующий список
идентифицирует два способа, которыми
служба может взаимодействовать с
пользователем, не создавая диалоговую
службу:
Показывать на экране окно
сообщения, вызывая функцию MessageBox с
флажком MB_SERVICE_NOTIFICATION. Это рекомендуется
для того, чтобы показать на экране
простые сообщения о состоянии. Не
вызывайте функцию MessageBox в ходе
инициализации службы или из процедуры
HandlerEx, если Вы не вызываете ее из
отдельного потока, так, чтобы Вы
возвратились к Диспетчеру управления
службами (SCM) обычным способом.
Создайте отдельное скрытое
приложение GUI и используйте функцию
CreateProcessAsUser, чтобы запустить приложение в
пределах контекста пользователя
работающего в диалоговом режиме.
Проектируйте приложение GUI так, чтобы
общаться со службой через некоторый
метод межпроцессного взаимодействия (IPC),
например, через именованные каналы. Служба
общается с приложением GUI, чтобы сообщить
ему, когда показывать на экране GUI. Клиент
сообщает результаты пользовательского
взаимодействия обратно службе так, чтобы
служба могла предпринять
соответствующее действие.
Обратите
внимание! на то, что это IPS может выделить
ваши сервисные интерфейсы по сети, если
Вы не используете соответствующий список
управления доступом (ACL).
Будущие версии Windows, возможно, не
будут поддерживать диалоговые службы.
Поэтому, лучше использовать другой подход,
чтобы поддерживать взаимодействие между
пользователем и службой.