Я пытаюсь настроить разрешения для именованного канала «правильным» способом.
Кажется, что самый простой и правильный способ установить права доступа - через строку ACE, например:
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
if (ConvertStringSecurityDescriptorToSecurityDescriptor(aceStr,
SDDL_REVISION_1,
&(sa.lpSecurityDescriptor),
NULL))
{
pipe = CreateNamedPipe(..., &sa);
}
Я хочу, чтобы владелец канала имел полный контроль, а все остальные имели только права на чтение и запись.Я также хочу, чтобы канал имел низкий уровень целостности, чтобы клиенты с низким уровнем целостности могли подключаться.
В прошлом я всегда просто использовал NULL DACL, потому что это легко, но Microsoft четко заявляет, что это не так.хорошая идея, потому что это позволяет любому клиенту полностью владеть каналом.
Я знаю, что часть строки SADL должна быть
S:(ML;;NW;;;LW)
, что дает каналу уровень целостностиlow.
Часть DACL должна включать
D:(A;;FRFW;;;WD)
, которая дает доступ «чтение» и запись «Все».Мне нужно добавить еще одну строку ACE в конце этого, чтобы установить полный контроль для владельца.Но я не могу найти код, который идет в конечную позицию для Windows, чтобы заменить его на SID текущего процесса.
S:(ML;;NW;;;LW)D:(A;;FRFW;;;WD)(A;;FA;;;<current process?>)
Я нашел некоторый код, который получает SID текущего процесса, ноэто включает в себя последовательность около 4 или 5 вызовов API.Это должно быть тривиальной задачей, так что я уверен, что это неправильный способ делать то, что я хочу.
Наконец, я даже удаленно на правильном пути?Почему это так сложно?
Два дополнительных вопроса: должна ли структура атрибутов безопасности, передаваемая CreateNamedPipe (), иметь то же время жизни, что и канал, или вы можете удалить ее, как только вызов вернется?Можно ли использовать одну и ту же структуру для нескольких экземпляров канала, или CreateNamedPipe () изменила ее?