2012-11-01 4 views
9

Ich habe NamedPipeClientStream, die mit NamedPipeServerStream verbindet. Sie tauschen ein paar Nachrichten aus, und dann wird NamedPipeClientStream geschlossen, während NamedPipeServerStream neu erstellt wird und weiterhin auf die Client-Pipes wartet. (Ich konnte keine funktionierende asynchrone Server Pipe erstellen, also ist dies eine Art Hundemarke)NamedPipeClientStream kann nicht auf NamedPipeServerStream unter Sitzung 0 zugreifen 0

Die Client-Server-Interaktion funktioniert gut während der Streams meines Clients, die von normalen Benutzersitzungen gestartet werden.

Aber es gibt eine Situation, wenn Client-Pipe von Sitzung 0 auf Win7 und win2008 Server gestartet wird. Wenn dies geschieht ich einen Fehler in Client-Stream hatte:

"Zugriff auf den Pfad verweigert"

Was ist das Problem? Wie man es vermeidet?

Leider kann ich Ihnen keine weiteren Informationen über Ausnahmen geben. Nur ich habe diese Nachricht im Protokoll. Und ich kann mein Programm nicht von Null Session debuggen, kann ich?

Der Server-Stream-Code:

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); 

Vielleicht mit Sicherheitseinstellungen etwas falsch?

Und der Client-Code:

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.. 
    } 
    //... 
} 

Der Server als Windows-Dienst unter Localsystem gestartet wird. Der Client - ist eine einfache Konsolenanwendung. Es wird von einer anderen Anwendung gestartet, die vom LocalSystem-Dienst gestartet wurde.

Antwort

12

Sieht aus wie das Problem hier in Sicherheitseinstellungen war:

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

Sollte sein:

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

Dank microsoft communnity

+9

Verbindung unterbrochen ist. Ich hasse es, dass Microsoft ihre Websites immer wieder neu organisiert und Millionen von kaputten Links über das Internet zurücklässt. – RenniePet