Я пытаюсь написать (повышенную привилегию) службу, которая будет разговаривать с не-привилегированным приложением 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 несколько раз. Когда я помещаю два new NamedPipeServerStream
в один и тот же исполняемый файл, я получаю ту же ошибку... Так почему это нормально, если у вас есть отдельный 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
или два экземпляра с теми же настройками, которые он по-прежнему вызывает исключение.