如何在Windows Vista Session 0和Desktop之间进行通信?

时间:2008-09-11 01:29:22

标签: windows-vista ipc

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

3 个答案:

答案 0 :(得分:4)

您也可以使用共享内存或命名管道来促进IPC。从概念上讲,这类似于TCP / IP,但您不必担心找到未使用的端口。

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

AFAIK服务无法再直接与桌面交互。

答案 1 :(得分:3)

实际上,出于安全原因,不再可能直接与“桌面”通信。无论如何,当您居住在具有多个活动用户+远程会话的计算机中时,“桌面”究竟是什么?

解决问题的一般方法是使用通过某种RPC机制(TCP / IP,IPC,.Net Remoting Channels等通过其中一种机制进行通信)的服务应用程序。它有点痛苦,但我认为这些好处值得改变。

答案 2 :(得分:1)

对于与桌面通信的服务,你几乎停留在其中一个RPC机制上。 .NET远程处理机制(IpcServerChannel)并不难为此目的而实现。

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