终端服务器会话中的孤立命名管道

时间:2010-07-09 07:27:52

标签: .net wcf terminal-services

如果我的应用程序启动,我首先检查是否已有应用程序的实例,如果是,我将焦点放在正在运行的实例上并终止新创建的进程。我使用通过WCF注册的命名管道进行此操作。到目前为止工作正常。

现在我的应用程序也将用于终端服务器环境。命名管道是否在系统范围内是正确的,因此我必须更改启动逻辑以不将焦点放在其他用户的实例上(当然不会工作但会破坏我的应用程序)或者终端服务器(2003R2)是否隔离了WCF绑定每个TS会议?

我无法访问生产环境,这就是我发布此问题的原因。也许有人可以回答这个问题?

更新

通过another post关于app启动的问题,我了解到使用Mutex管理单个应用程序启动有一种更方便的方法,可以在系统范围内或在终端会话的基础上使用。

然而问题是开放的,也许有一个有良好的WCF知识的人可以回答它。这会很有趣。

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

本文介绍如何将命名管道限制为单个终端服务器会话: 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