终端服务器会话中的隔离命名管道

Posted

技术标签:

【中文标题】终端服务器会话中的隔离命名管道【英文标题】:Isolated Named Pipes in Terminal Server Sessions 【发布时间】:2010-07-09 07:27:51 【问题描述】:

如果我的应用程序启动,我首先检查是否已经有一个应用程序实例,如果是,我将焦点放在正在运行的实例上并终止新创建的进程。我使用通过 WCF 注册的命名管道来实现这一点。到目前为止效果很好。

现在我的应用程序也将在终端服务器环境中使用。命名管道是系统范围的,所以我必须更改启动逻辑以不将注意力集中在其他用户的实例上(当然不会工作但会破坏我的应用程序)或者终端服务器(2003R2)是否隔离 WCF-Bindings每个 TS 会话?

我还不能访问生产环境,这就是我发布这个问题的原因。也许有人可以给我这个问题的答案?

更新

通过another post我对应用程序启动所做的处理,我了解到使用 Mutex 可以更方便地管理单个应用程序启动,它可以在系统范围或终端会话基础上使用。

无论如何,这个问题是开放的,也许具有良好 WCF 知识的人可以回答它。这会很有趣。

【问题讨论】:

【参考方案1】:

命名管道是系统范围的。没有像其他内核对象类型那样的“全局”或“本地”前缀。

这是因为命名管道被用作网络资源的一部分,例如myComputer\pipename。获得“全局”和“本地”前缀的对象(事件、信号量、互斥体、计时器、文件映射和作业)的范围仅限于计算机,其他计算机无法访问。

【讨论】:

【参考方案2】:

本文解释了如何将命名管道限制为终端服务器的单个会话: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365600(v=vs.85).aspx

要防止远程用户或不同终端服务会话上的用户访问命名管道,请使用管道的 DACL 上的登录 SID。登录 SID 也用于 run-as 登录;它是用于保护每个会话对象名称空间的 SID。有关详细信息,请参阅在 C++ 中获取登录 SID。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa446670(v=vs.85).aspx

【讨论】:

以上是关于终端服务器会话中的隔离命名管道的主要内容,如果未能解决你的问题,请参考以下文章

win 2003:2个 远程桌面用户(单会话?)升级为终端服务多用户(多会话)

Linux 安装screen 实现会话共享功能

Linux 安装screen 实现会话共享功能

Mac终端Screen命令使用指南

将本地文件从 Mac 复制到终端中的 ssh 会话 [关闭]

通过命名管道从 Windows 服务(会话#0)连接到桌面应用程序(会话#1)