В настоящее время я реализую инфраструктуру ведения журналов, в которой несколько клиентских процессов взаимодействуют со службой Windows (все работают на одном компьютере) с использованием именованных каналов.
Внутри моей службы Windows я нахожусь создание экземпляра NamedPipeServerStream
со специально настроенным объектом PipeSecurity
для обработки доступа к используемому каналу. Я хочу добавить три правила доступа:
- Запретить доступ для всех пользователей сети (как предложено в этом ответе)
- Разрешить чтение / запись для доступа ВСЕ ЛОКАЛЬНЫЕ ПОЛЬЗОВАТЕЛИ НА ТЕКУЩЕМ МАШИНЕ (как указано в this answer)
- Разрешить полный доступ владельцу, который запускает службу (как предложено в 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-имя неверно?
Любые ответы были бы очень полезны.