Почему создание экземпляра объекта NamedPipeServerStream вызывает исключение IdentityNotMappedException? - PullRequest
0 голосов
/ 27 апреля 2020

В настоящее время я реализую инфраструктуру ведения журналов, в которой несколько клиентских процессов взаимодействуют со службой Windows (все работают на одном компьютере) с использованием именованных каналов.

Внутри моей службы Windows я нахожусь создание экземпляра NamedPipeServerStream со специально настроенным объектом PipeSecurity для обработки доступа к используемому каналу. Я хочу добавить три правила доступа:

  1. Запретить доступ для всех пользователей сети (как предложено в этом ответе)
  2. Разрешить чтение / запись для доступа ВСЕ ЛОКАЛЬНЫЕ ПОЛЬЗОВАТЕЛИ НА ТЕКУЩЕМ МАШИНЕ (как указано в this answer)
  3. Разрешить полный доступ владельцу, который запускает службу (как предложено в this ответ)

При объединении всех этих предложений я получаю следующее:

string m_pipeName = "testPipe";

// Create access rules for pipe server.
PipeSecurity ps = new PipeSecurity();

// Deny access for all network users.            
ps.AddAccessRule(new PipeAccessRule(@"NT AUTHORITY\NETWORK", PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Deny));

// Get the identifier for all authenticated users.
var id = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);

// Add read/write access for all local users.
ps.AddAccessRule(new PipeAccessRule(id, PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));

// Add full access for service process. (to be able to create new pipe server instances)
ps.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().Owner, PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));

// Instantiate server with access rights.
var serverPipe = new NamedPipeServerStream(m_pipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 0, 0, ps);

К сожалению, я получаю System.Security.Principal.IdentityNotMappedException при попытке добавить второе правило доступа , Это означает (насколько я понял) перевод для данного SID не может быть найден. Но почему это так? Значение перечисления, которое я передаю в конструктор SecurityIdentifier, является допустимым значением и поэтому должно распознаваться API. Или не должно? Что я сделал не так? Возможно ли, что внутреннее сопоставление SID-имя неверно?

Любые ответы были бы очень полезны.

...