У меня такая же проблема, как и все остальные при подключении «write» к запущенной службе: UnauthorizedAccessException. Я пробовал каждое решение, и ничто не может заставить его успешно подключиться.NamedPipeClientStream выбрасывает UnauthorizedAccessException при подключении
В сценарии имеется приложение с низкой степенью целостности C#/WPF, работающее в системном трее, которое получает уведомления от службы Windows с использованием именованных каналов и может сообщить службе об отмене определенных операций или дождаться получения большего количества данных (поэтому канал записи в службу). Чтение из трубы службы отлично работает, и я использую два объекта pipe (один - от службы к клиенту, другой - от клиента к сервису).
Служба работает под учетной записью пользователя домена, но труба не может подключиться независимо от того, в чём она работает, включая локальную систему.
трубы сервера создаются следующим образом:
PipeSecurity ps = new PipeSecurity();
// Production service runs under current user credentials.
ps.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().User, PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));
// Test service runs under local system credentials.
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));
// Add world just for the hell of it, still won't work.
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.FullControl, AccessControlType.Allow));
this.readPipe = new NamedPipeServerStream(clientPipeName, PipeDirection.In);
this.writePipe = new NamedPipeServerStream(serverPipeName, PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.None, 1024, 1024, ps);
Клиентские трубы создаются следующим образом:
this.readPipe = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
this.writePipe = new NamedPipeClientStream(".", clientPipeName, PipeDirection.Out);
// This doesn't make a difference.
//this.writePipe = new NamedPipeClientStream(".", clientPipeName, PipeAccessRights.FullControl, PipeOptions.None, TokenImpersonationLevel.None, HandleInheritability.None);
Демонстрационный проект доступен здесь, если вы можете посмотреть на мой вопрос, так что вы не» т придется сделать его самостоятельно: