2011-06-11 79 views
0

我想用NamedPipeServerStream在應用程序實例之間做一些小的IPC。但是,如果服務器與客戶端位於相同的終端服務器會話上,我只想定位服務器(如果應用程序在TS環境中運行)。
實現此目的的一個想法是使用登錄用戶的SID並將其與Pipes名稱連接。懸停我認爲如果用戶在兩個不同的位置上閒逛,這會產生問題,而且對我來說似乎也不是很整潔。限制NamedPipeServerStream的範圍

是否有可能將NamedPipeServerStream作爲響應調用的範圍,並設置此範圍以便RDP會話構建邊界?或者有人很好的想法如何限制範圍/達到預期的行爲?

回答

2

如果您只想將其限制爲一個會話,您可以在本地命名空間內命名互斥體create以限制其在會話中的可見性。當客戶想要連接 時,它可以創建相同的互斥鎖,如果它得到最後一個錯誤代碼ERROR_ALREADY_EXISTS,它就知道在當前會話中有一個管道服務器。

您可以通過ProcessIdToSessionId獲取您當前的進程會話編號,以便您可以創建一個命名管道服務器,並在其名稱中包含會話標識。

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

Addenum: 獲得當前的會話ID,你可以簡單地使用Process.GetCurrentProcess()的SessionID,而不是上述定義的PInvoke簽名。

+0

+1謝謝,使用會話編號在我看來是一個正確的方法。 – HCL 2011-06-11 11:49:45

+0

據我所見,在.Net 2或4中沒有定義PInvoke簽名。您必須使用PInvoke – 2011-06-11 11:51:15

+0

System.Diagnostics.Process.GetCurrentProcess()。SessionId似乎可以做我所需要的。 – HCL 2011-06-11 11:58:24