2008-09-11 4 views
6

В предыдущих версиях Windows перед Vista вы могли иметь службу Windows, взаимодействующую с текущим зарегистрированным пользователем на рабочем столе, чтобы легко отображать информацию на экране из службы. В Windows Vista для обеспечения изоляции служб с рабочего стола был добавлен сеанс 0. Что такое простой способ связи между службой и приложением, находящимся за пределами сеанса 0? До сих пор я обошел это, используя TCP/IP для обмена данными между ними, но, похоже, это небрежный способ сделать это.Как вы общаетесь между сеансом Windows Vista 0 и Desktop?

ответ

4

Вы также можете использовать общую память или именованный канал для облегчения IPC. Концептуально это похоже на TCP/IP, но вам не нужно беспокоиться о поиске неиспользуемого порта.

Вы должны убедиться, что именованные объекты, созданные вами, имеют префикс «Глобальный», чтобы разрешить им доступ ко всем сеансам, как описано here.

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

3

Действительно, по соображениям безопасности более невозможно напрямую связаться с «рабочим столом». Что такое «рабочий стол» в любом случае, когда вы живете в машине с несколькими активными пользователями + удаленные сеансы?

Общий способ решения проблемы - использовать сервисные приложения, которые обмениваются данными через какой-либо механизм RPC (TCP/IP, IPC, .Net Remoting Channels по одному из них и т. Д.). Это своего рода боль, но я думаю, что выгоды стоят того изменения.

1

Для обслуживания, чтобы поговорить с рабочим столом, вы в значительной степени застряли в одном из механизмов RPC. Механизм удаленного доступа .NET (IpcServerChannel) не будет трудно реализовать для этой цели.

Также с .NET настольное приложение может отправлять сообщения непосредственно службе с помощью ServiceController.ExecuteCommand. Эти команды принимаются службой через ServiceBase.OnCustomCommand. Это еще проще сделать, и все, что вам нужно, если контролировать обслуживание - это ваше единственное требование.