限制NamedPipeServerStream的范围

本文关键字:范围 NamedPipeServerStream 限制 | 更新日期: 2023-09-27 17:58:51

我想使用NamedPipeServerStream在应用程序实例之间进行一些小型IPC。但是,我只想将服务器作为目标,如果它与客户端位于同一个终端服务器会话上(如果应用程序在TS环境中运行)
实现这一点的一个想法是使用登录用户的SID,并将其与管道名称连接起来。悬停我认为如果用户从两个不同的位置登录,这会带来问题,而且对我来说似乎也不太整洁

是否有可能为NamedPipeServerStream提供一个作用域来响应调用,并设置此作用域以使RDP会话构建边界?或者有人知道如何限制范围/实现期望的行为吗?

限制NamedPipeServerStream的范围

如果只想将其限制为一个会话,则可以在本地命名空间中创建一个命名互斥体,以限制其在会话中的可见性。当客户端想要连接时它可以创建相同的互斥,如果它得到最后一个错误代码error_ALREADY_EXISTS,它就知道在当前会话中有一个管道服务器。

您可以通过ProcessIdToSessionId获取进程的当前会话编号,这样您就可以创建一个名称中包含会话id的命名管道服务器。

[DllImport("kernel32.dll",SetLastError=true)]
static extern int ProcessIdToSessionId(int pid, ref int session);

Addenum:要获取当前会话Id,您可以简单地使用Process.GetCurrentProcess().SessionId,而不是上面定义的PInvoke签名。