限制 NamedPipeServerStream 的范围

Posted

技术标签:

【中文标题】限制 NamedPipeServerStream 的范围【英文标题】:Limiting the scope of a NamedPipeServerStream 【发布时间】:2011-06-11 11:17:27 【问题描述】:

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

是否有可能为NamedPipeServerStream 提供一个响应调用的范围并设置此范围以便 RDP-Session 建立边界?或者有人知道如何限制范围/实现所需的行为?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

+1 谢谢,在我看来使用会话号是正确的方法。 据我所知,.Net 2 或 4 中没有定义 PInvoke 签名。您必须使用 PInvoke System.Diagnostics.Process.GetCurrentProcess().SessionId 似乎可以满足我的需要。 啊确实错过了那个。我只查看了对 ProcessIdToSessionId 的方法调用,但 Process 类使用 NtQuerySystemInformation 获取其数据。

以上是关于限制 NamedPipeServerStream 的范围的主要内容,如果未能解决你的问题,请参考以下文章

NamedPipeServerStream 和 WaitForConnection 方法

为啥我的 NamedPipeServerStream 不等待?

CallNamedPipe 和 NamedPipeServerStream,访问被拒绝?

NamedPipeServerStream/async 可靠断开问题

C#:异步NamedPipeServerStream理解

调用 NamedPipeServerStream.SetAccessControl 时“尝试执行未经授权的操作”