NamedPipeClientStream не может получить доступ к NamedPipeServerStream в сеансе 0

У меня есть NamedPipeClientStream, который подключается к NamedPipeServerStream. Они обмениваются несколькими сообщениями, а затем NamedPipeClientStream закрывается, в то время как NamedPipeServerStream воссоздается и продолжает прослушивание клиентских каналов. (Я не мог сделать рабочую асинхронную серверную трубу, так что это какой-то гвоздь)

взаимодействие клиент-сервер отлично работает во время потоков моего клиента, запущенных из обычных сеансов пользователя.

но есть ситуация, когда клиент канал запускается из сеанса 0 на Win7 и win2008 server. Когда это происходит, у меня была ошибка в потоке клиента:

"доступ к пути запрещен"

в чем проблема? Как этого избежать?

Извините, я не могу рассказать вам больше об исключении. Только у меня есть это сообщение в журнале. И я не могу отладить свою программу от нулевого сеанса, не так ли?

код потока сервера:

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

сервер запускается как служба windows в LocalSystem. Клиент - это простое консольное приложение. Он запущен другим приложением, запущенным из службы LocalSystem.

1 ответов


похоже, проблема была в настройках безопасности здесь:

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

спасибо Майкрософт communnity