Я пытаюсь создать именованный канал между двумя процессами 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
уже означают, что сервер защищен от переполнения буфера мошенническими клиентами.