我们如何在Windows Vista会话0和桌面之间进行通信?

时间:2020-03-05 18:51:11  来源:igfitidea点击:

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

解决方案

回答

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

我们必须确保我们创建的命名对象以" Global "为前缀,以使所有会话都可以访问它们,如此处所述。

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

回答

实际上,出于安全原因,不再可能直接与"桌面"进行通信。当我们居住在具有多个活动用户+远程会话的计算机中时,"桌面"到底是什么?

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

回答

为了使该服务与桌面进行通信,我们几乎不得不采用一种RPC机制。为此,.NET远程处理机制(IpcServerChannel)并不难实现。

同样,使用.NET,桌面应用程序可以使用ServiceController.ExecuteCommand将消息直接发送到服务。服务通过ServiceBase.OnCustomCommand接收这些命令。这甚至更容易做到,而如果仅需控制服务,则将满足所有需求。