Сервер именованных каналов генерирует исключение UnauthorizedAccessException при создании второго экземпляра, если PipeSecurity установлено

Я пытаюсь написать службу (с повышенными привилегиями), которая будет взаимодействовать с непривилегированным приложением winforms. Мне удалось заставить два консольных приложения (одно с повышенными правами, одно не повышать) без проблем общаться друг с другом, но у меня возникла проблема с обслуживанием и приложением winforms.

Первый экземпляр конвейера работает отлично. Однако после того, как мой клиент подключается, и я пытаюсь создать новый экземпляр, чтобы он был готов, если подключится второй клиент, но конструктор для NamedPipeServerStream выдает исключение

System.UnauthorizedAccessException was unhandled
  Message=Access to the path is denied.
  Source=System.Core
  StackTrace:
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.Pipes.NamedPipeServerStream.Create(String fullPipeName, PipeDirection direction, Int32 maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, Int32 inBufferSize, Int32 outBufferSize, PipeAccessRights rights, SECURITY_ATTRIBUTES secAttrs)
       at System.IO.Pipes.NamedPipeServerStream..ctor(String pipeName, PipeDirection direction, Int32 maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, Int32 inBufferSize, Int32 outBufferSize, PipeSecurity pipeSecurity, HandleInheritability inheritability, PipeAccessRights additionalAccessRights)
       at System.IO.Pipes.NamedPipeServerStream..ctor(String pipeName, PipeDirection direction, Int32 maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, Int32 inBufferSize, Int32 outBufferSize, PipeSecurity pipeSecurity)
       at PipeServer.Server.Client..ctor(String pipeName, List`1 container) in E:\Visual Studio 2010\Projects\Sandbox Service\PipeServer.cs:line 27
       at PipeServer.Server.ListenForClients() in E:\Visual Studio 2010\Projects\Sandbox Service\PipeServer.cs:line 148
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Пример удален, см. Пример внизу для более простого теста

Первая итерация работает отлично. это когда клиент подключается, и client = new Client вызывается второй раз, что, в свою очередь, вызывает Pipe = new NamedPipeServerStream , и это вызывает исключение.

Может кто-нибудь увидеть какую ошибку я совершаю?


Немного больше информации. Из любопытства я вернулся к своему консольному приложению. Чтобы протестировать несколько экземпляров, я просто запускал exe несколько раз. Когда я помещаю два новых NamedPipeServerStream в один и тот же исполняемый файл, я получаю ту же ошибку ... Так почему это нормально, если у вас есть отдельный exe ' действует как сервер, указывающий на тот же именованный адрес канала, но запрещено делать это внутри того же exe-файла?

static void Main()
{
    PipeAccessRule pr = new PipeAccessRule("Users", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
    PipeSecurity ps = new PipeSecurity();
    ps.AddAccessRule(pr);
    using (NamedPipeServerStream pipeServer =
        new NamedPipeServerStream("testpipe",PipeDirection.InOut,10, 
                                    PipeTransmissionMode.Message, 
                                    PipeOptions.WriteThrough,4028,4028,ps))
    using (NamedPipeServerStream pipeServer2 = //v-- Throws the execption, but if you comment this out and run the EXE twice it works fine. creating a new instance of ps and pr does not change anything.
        new NamedPipeServerStream("testpipe", PipeDirection.InOut, 10, 
                                    PipeTransmissionMode.Message,
                                    PipeOptions.WriteThrough, 4028, 4028, ps))
    {

Дополнительная информация:

Если я не установлю PipeSecurity , он не выбрасывает исключение, но когда я установлю безопасность, это будет. Не имеет значения, если я передам оба экземпляра одного и того же PipeSecurity или двух экземпляров с одинаковыми настройками, он все равно выдает исключение.

21
задан rachana gandhi 28 November 2019 в 07:13
поделиться