Windows Vista Session 0 和桌面之间如何通信?
-
09-06-2019 - |
题
在 Vista 之前的 Windows 早期版本中,您可以让 Windows 服务与当前登录的桌面用户进行交互,以便轻松地从该服务在屏幕上显示信息。在 Windows Vista 中,为了安全起见,添加了 Session 0,以将服务与桌面隔离。在服务和会话 0 之外运行的应用程序之间进行通信的简单方法是什么?到目前为止,我已经通过使用 TCP/IP 在两者之间进行通信来解决这个问题,但这似乎是一种草率的方法。
解决方案
您也可以使用共享内存或命名管道来促进 IPC。从概念上讲,这类似于 TCP/IP,但您不必担心找到未使用的端口。
您必须确保您创建的命名对象以“Global\”为前缀,以允许所有会话访问它们,如下所述 这里.
据我所知,服务无法再直接与桌面交互。
其他提示
事实上,出于安全原因,不再可能直接与“桌面”通信。当您生活在具有多个活动用户+远程会话的计算机中时,“桌面”到底是什么?
解决该问题的一般方法是使用通过某种 RPC 机制(TCP/IP、IPC、其中之一的 .Net 远程通道等)进行通信的服务应用程序。这有点痛苦,但我认为改变的好处是值得的。
对于与桌面对话的服务,您几乎只能使用其中一种 RPC 机制。.NET 远程处理机制(Ipc服务器通道)为此目的实施并不难。
此外,通过 .NET,桌面应用程序可以使用以下命令直接向服务发送消息: 服务控制器.执行命令. 。这些命令由服务通过接收 ServiceBase.OnCustomCommand. 。这更容易做到,如果控制服务是您唯一的要求,这将是您所需要的。
不隶属于 StackOverflow