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