Почему службы Windows не могут иметь графический интерфейс?

22

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

В чем причина удаления этой функции? Почему службы Windows не могут иметь графический интерфейс?

Arun
источник

Ответы:

47

В основном из соображений безопасности.

Как я понимаю, когда служба окон создает GUI элементы управления , такие как MessageBox, они обычно можно увидеть только в сессии , что пробеги услуги в то Session 0 , которые также используются , чтобы быть первым пользователь вошел в систему локально или кем - то протоколирования на использовании mstsc / admin. Следовательно, этот пользователь увидит эти элементы управления и сможет взаимодействовать со службой.

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

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

У Microsoft есть WhitePaper на эту тему, которую вы можете скачать здесь

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

sgmoore
источник
1
У меня есть ощущение, что это как-то связано с UAC - обеспечение безопасности означает, что приглашение UAC не может поделиться сеансом рабочей станции с интерактивным пользователем, или хакер может выдать свой собственный запрос, выдавая себя за приглашение UAC.
gbjbaanb
23

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

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

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

ChrisF
источник
Ваша версия устарела: службы не могут напрямую взаимодействовать с пользователем начиная с Windows Vista. Поэтому методы, упомянутые в разделе «Использование интерактивного сервиса», не должны использоваться в новом коде.
Немке
10

Поскольку службы должны работать в фоновом режиме, не взаимодействуя с пользователем; на самом деле они могут работать, пока ни один пользователь не вошел в систему.

Майкл Боргвардт
источник
тогда почему эта функция была в более ранних версиях? Учитывая ваш ответ, между службой Windows и настольным приложением не будет связи. Так что этот ответ не может быть уместным.
Арун
3
@Arun - если исходить из этой логики, то сломанные вещи никогда не будут исправлены. Майкл ответ правильный - услуги не должны иметь гайс. То, что они были в более ранних версиях Windows (сервисы с графическим интерфейсом), не означает, что они должны были быть.
8
@ Arun Это не правда, что нет связи между настольными приложениями и службами, просто у самой службы нет графического интерфейса. Скорее, настольное приложение имеет графический интерфейс и обменивается данными с сервером.
Пол Химстра
Итак, службы Windows могут иметь графический интерфейс, но они не должны иметь их?
Арун
1
@Arun, сервисы сами по себе не имеют графического интерфейса, но часто управляются отдельными интерфейсными приложениями, которые могут управлять сервисом, связываясь с ним каким-либо образом (через именованные каналы, сокеты, ...)
GrandmasterB
0

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

Теперь каждый разрабатывает нативные сервисы и добавляет приложение или журнал для управления сервисом. Это хороший шаблон дизайна, который сейчас используется в большинстве случаев.

Так что воспринимайте это скорее как наследство, чтобы это было возможно.

Люк Франкен
источник
-1

Сервисы предназначены для не посещаемых операций, в основном в фоновом режиме. Сам сервис имен означает действовать как сервер для некоторых клиентских приложений или других сервисов, которые используют этот сервис. Поэтому теперь MS может захотеть придерживаться основ и хочет провести четкое различие между сервисами и приложениями. Так что приложения поддерживают занятость пользователей и позволяют сервисам выполнять свои задачи в молчании. В то время как есть гвоздодер, зачем идти за кухонным ножом, чтобы резать ноль?

Тони Томас
источник