2010-07-09 81 views
9

如果我的应用程序启动,我首先检查是否已经有该应用程序的实例,如果是,则将焦点放到正在运行的实例并终止新创建的进程。我使用通过WCF注册的命名管道进行此操作。迄今为止工作正常。终端服务器会话中的独立命名管道

现在我的应用程序也将在终端服务器环境中使用。命名管道是系统范围的,所以我必须改变启动逻辑,不要将焦点放在其他用户的实例上(当然不会工作,但会中断我的应用程序),或者终端服务器(2003R2)将WCF绑定分离为每个TS会话?

我无法访问生产环境,这就是为什么我发布这个问题。也许有人可以给我这个问题的答案?

通过another post我没有关于App启动更新,我了解到,有一种更便捷的方式来管理单个应用程序启动时使用互斥,可用于系统范围或在终端会话基础。

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

回答

8

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

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

1

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

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