Я пытаюсь создать именованный канал между двумя процессами Windows. Процесс сервера выполняется под обычной учетной записью в сеансе пользовательского интерфейса. Клиентский процесс работает в неизвестном контексте безопасности, видимо, довольно ограниченном.Как отключить защиту именных труб?
Первоначально я назвал
pipe = CreateNamedPipeA(MY_PIPE_NAME, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, maxClients,
pipeChunkSize, pipeChunkSize, 0, nullptr);
И.Э. оставить проход № SECURITY_ATTRIBUTES
. Обычно это работает - никакая безопасность не означает никакой безопасности. По-видимому, это уже не так для названных пипсов. Вызывающий попытался
CreateFileA(MY_PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
и получил обратно GetLastError=5
, доступ запрещен. Тестирование показало, что это произошло из-за сбоя безопасности; точно такая же строка будет успешной, если исполняемый файл клиента был запущен из тестовой среды в том же сеансе пользовательского интерфейса, что и сервер.
Логическим решением было бы установить DACL в SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS
(S-1-1-0) в SECURITY_ATTRIBUTES
, используемом для CreateNamedPipeA
. Это не устранило проблему.
Единственное снижение безопасности, оставшееся от «все может сделать все», будет «без какой-либо безопасности». Что мне нужно сделать в CreateNamedPipe
, так что CreateFileA
никогда не удается получить доступ с доступом?
Охрана здесь довольно неактуальна. PIPE_TYPE_MESSAGE
и pipeChunkSize
уже означают, что сервер защищен от переполнения буфера клиентами-изгоями.