2010-07-09 84 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