2008-09-11 129 views
6

在Vista以前的Windows版本中,您可以让Windows Service与当前登录的桌面用户进行交互,以便在服务屏幕上轻松显示信息。在Windows Vista中,为了安全性添加了会话0以将服务与桌面隔离开来。在服务和在Session 0之外运行的应用程序之间进行通信的简单方法是什么?到目前为止,我通过使用TCP/IP在两者之间进行通信来解决这个问题,但它似乎是一种马虎的做法。如何在Windows Vista Session 0和桌面之间进行通信?

回答

4

您也可以使用共享内存或命名管道来方便IPC。从概念上讲,这与TCP/IP类似,但您不必担心发现未使用的端口。

您必须确保您创建的命名对象的前缀为“全局”,以允许它们被所有会话访问,如here所述。

AFAIK无法让服务直接与桌面进行交互。

3

的确,出于安全原因,不再可以直接与“桌面”进行通信。无论如何,当你在一台拥有多个活跃用户+远程会话的计算机中时,究竟是什么“桌面”?

解决该问题的一般方法是使用通过某种RPC机制(TCP/IP,IPC,.Net远程处理通道之一等)进行通信的服务应用程序。这是一种痛苦,但我认为好处值得改变。

1

对于服务与桌面交谈,你几乎坚持使用RPC机制之一。 .NET远程处理机制(IpcServerChannel)不难为此实现。

此外,使用.NET,桌面应用程序可以将消息直接发送到ServiceController.ExecuteCommand的服务。这些命令由服务通过ServiceBase.OnCustomCommand接收。这更容易做到,如果控制服务是您唯一的要求,那将是您所需要的。

相关问题