Задать вопрос
@LVasiliy
Студент МНТУ

Как подключиться к именованному каналу без прав администратора?

Привет. Есть два приложения на C# - служба (windows service) и клиентское приложение, которые обмениваются информацией по именованным каналам (Named Pipes). Проблема в том, что клиентское приложение может подключиться к службе по именованному каналу только с правами администратора. Нашёл в сети решение, в котором предлагается назначить серверному именованному каналу PipeSecurity, содержащий один или более PipeAccessRule. После применения этого подхода серверное приложение падает с исключением System.UnauthorizedAccessException. Подскажите, как по именованному каналу осуществить подключение к службе клиентского приложения, которое запущено без прав админа? Делаю так:
Windows Service
protected override void OnStart(string[] args)
        {
            new Thread(() =>
            {
                while (true)
                {
                    using (var pipe = new NamedPipeServerStream("test", PipeDirection.InOut, 1, PipeTransmissionMode.Byte))
                    {
                        var ps = new PipeSecurity();
                        ps.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().Name, PipeAccessRights.FullControl, AccessControlType.Allow));
                        pipe.SetAccessControl(ps);

                        pipe.WaitForConnection();
                        int x = pipe.ReadByte();
                        pipe.WriteByte((byte)(x + 1));
                    }
                }
            })
            { IsBackground = true }.Start();
        }

Клиент:
using (var pipe = new NamedPipeClientStream(".", "test", PipeDirection.InOut))
            {
                pipe.Connect();
                pipe.WriteByte(100);
                int x = pipe.ReadByte();
                Console.WriteLine(x);
            }


Пробовал также в коде службы WindowsIdentity.GetCurrent().Name менять на "Everyone", но в этом случае исключение System.Security.Principal.IdentityNotMappedException.
  • Вопрос задан
  • 1393 просмотра
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@Sing303
Серверному нужны такие настройки
var pipeSecurity = new PipeSecurity();
pipeSecurity.SetAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));


WindowsIdentity.GetCurrent().Name - это имя пользователя службы, т.к. в службе от системы выполняется
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы