限制NamedPipeServerStream的范围

限制NamedPipeServerStream的范围

问题描述:

我想用NamedPipeServerStream在应用程序实例之间做一些小的IPC。但是,如果服务器与客户端位于相同的终端服务器会话上,我只想定位服务器(如果应用程序在TS环境中运行)。
实现此目的的一个想法是使用登录用户的SID并将其与Pipes名称连接。悬停我认为如果用户在两个不同的位置上闲逛,这会产生问题,而且对我来说似乎也不是很整洁。限制NamedPipeServerStream的范围

是否有可能将NamedPipeServerStream作为响应调用的范围,并设置此范围以便RDP会话构建边界?或者有人很好的想法如何限制范围/达到预期的行为?

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

您可以通过ProcessIdToSessionId获取您当前的进程会话编号,以便您可以创建一个命名管道服务器,并在其名称中包含会话标识。

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

Addenum: 获得当前的会话ID,你可以简单地使用Process.GetCurrentProcess()的SessionID,而不是上述定义的PInvoke签名。

+0

+1谢谢,使用会话编号在我看来是一个正确的方法。 – HCL 2011-06-11 11:49:45

+0

据我所见,在.Net 2或4中没有定义PInvoke签名。您必须使用PInvoke – 2011-06-11 11:51:15

+0

System.Diagnostics.Process.GetCurrentProcess()。SessionId似乎可以做我所需要的。 – HCL 2011-06-11 11:58:24