2012-11-01 33 views
9

我有連接到NamedPipeServerStream的NamedPipeClientStream。他們交換幾條消息,然後關閉NamedPipeClientStream,重新創建NamedPipeServerStream並繼續偵聽客戶端管道。 (我無法制作一個異步的服務器管道,所以這是某種狗狗式的)NamedPipeClientStream無法訪問會話0下的NamedPipeServerStream

客戶端 - 服務器交互在我的客戶端從正常用戶會話啓動的流期間工作正常。

但是,在Win7和win2008服務器上,會話0啓動Client管道時會出現這種情況。當發生這種情況,我在客戶端流的錯誤:

「的路徑訪問被拒絕」

問題是什麼?如何避免它?

對不起,我不能告訴你關於異常的更多信息。只有我有這個消息在日誌中。而且我無法從零會話調試我的程序,可以嗎?

服務器流代碼:

PipeSecurity ps = new PipeSecurity(); 
System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null); 
PipeAccessRule par = new PipeAccessRule(sid, PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow); 
ps.AddAccessRule(par); 
pipeClientConnection = new NamedPipeServerStream(General.PIPENAME, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, General.BUFFERSIZE, General.BUFFERSIZE, ps); 
Console.Write("Waiting for client connection..."); 
IAsyncResult result = pipeClientConnection.BeginWaitForConnection(OnPipeConnected, pipeClientConnection); 

也許東西是錯誤的安全設置?

而且客戶端代碼:

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", General.PIPENAME, PipeDirection.InOut)) 
{ 
    try 
    { 
     Console.WriteLine("Connecting with pipe..."); 
     pipeStream.Connect(General.CONNECTIONTIMEOUT); 
     Console.WriteLine("Pipe connection established"); 
     //..do something.. 
    } 
    //... 
} 

服務器推出,LocalSystem下windows服務。客戶端 - 是一個簡單的控制檯應用程序。它由從LocalSystem服務啓動的另一個應用程序啓動。

回答

12

貌似問題是在這裏的安全設置:

System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null); 

應該是:

System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.WorldSid, null); 

感謝microsoft communnity

+9

鏈接斷開。我討厭微軟不斷重組他們的網站,並在整個互聯網上留下數以百萬計的破碎鏈接。 – RenniePet