Интерактивные службы

Как правило, службы — это консольные приложения, предназначенные для автоматического запуска без графического пользовательского интерфейса . Однако для некоторых служб может потребоваться случайное взаимодействие с пользователем. На этой странице рассматриваются лучшие способы взаимодействия с пользователем из службы.

Важно!

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

 

Косвенное взаимодействие с пользователем из службы

Для взаимодействия с пользователем из службы во всех поддерживаемых версиях Windows можно использовать следующие методы:

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

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

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

Для Windows Server 2003 и Windows XP также доступен следующий метод:

  • Отображение окна сообщения путем вызова функции MessageBox с MB_SERVICE_NOTIFICATION. Рекомендуется для отображения простых сообщений о состоянии. Не вызывайте MessageBox во время инициализации службы или из подпрограммы HandlerEx , если только вы не вызываете ее из отдельного потока, чтобы своевременно вернуться к SCM.

Использование интерактивной службы

По умолчанию службы используют неинтерактивную оконную станцию и не могут взаимодействовать с пользователем. Однако интерактивная служба может отображать пользовательский интерфейс и получать введенные пользователем данные.

Внимание!

Службы, работающие в контексте безопасности с повышенными привилегиями, такие как учетная запись LocalSystem, не должны создавать окно на интерактивном рабочем столе, так как любое другое приложение, работающее на интерактивном рабочем столе, может взаимодействовать с этим окном. Это предоставляет службу любому приложению, которое выполняет пользователь, выполнивший вход. Кроме того, службы, работающие как LocalSystem, не должны получать доступ к интерактивному рабочему столу путем вызова функции OpenWindowStation или GetThreadDesktop .

 

Чтобы создать интерактивную службу, при вызове функции CreateService выполните следующие действия:

  1. Укажите значение NULL для параметра lpServiceStartName , чтобы запустить службу в контексте учетной записи LocalSystem.
  2. Укажите флаг SERVICE_INTERACTIVE_PROCESS .

Чтобы определить, запущена ли служба как интерактивная служба, вызовите функцию GetProcessWindowStation , чтобы получить дескриптор оконной станции, и функцию GetUserObjectInformation , чтобы проверить, имеет ли оконная станция атрибут WSF_VISIBLE .

Однако обратите внимание, что следующий раздел реестра содержит значение NoInteractiveServices, которое управляет эффектом SERVICE_INTERACTIVE_PROCESS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

Значение NoInteractiveServices по умолчанию равно 1, что означает, что служба не может работать в интерактивном режиме, независимо от того, имеет ли она SERVICE_INTERACTIVE_PROCESS. Если noInteractiveServices имеет значение 0, службы с SERVICE_INTERACTIVE_PROCESS могут работать в интерактивном режиме.

Windows 7, Windows Server 2008 R2, Windows XP и Windows Server 2003: Значение NoInteractiveServices по умолчанию равно 0, что означает, что службам с SERVICE_INTERACTIVE_PROCESS разрешено работать в интерактивном режиме. Если для NoInteractiveServices задано ненулевое значение, служба, запущенная после этого, не может выполняться в интерактивном режиме независимо от того, имеет ли она SERVICE_INTERACTIVE_PROCESS.

Важно!

Все службы выполняются в сеансе 0 служб терминалов. Таким образом, если интерактивная служба отображает пользовательский интерфейс, он будет виден только пользователю, подключившемуся к сеансу 0. Так как нет способа гарантировать, что интерактивный пользователь подключен к сеансу 0, не настраивайте службу для запуска в качестве интерактивной службы в службах терминалов или в системе, поддерживающей быстрое переключение пользователей (быстрое переключение пользователей реализуется с помощью служб терминалов).