Здравствуйте, Desert_Sun, Вы писали:
D_S>Задача стоит такая — защита ключа реестра. D_S>системе нужно предоставить полный доступ (точнее читать, писать, удалять), D_S>остальным — закрыть полностью доступ.
D_S>Вопрос 1: достаточно ли будет для SID'а SECURITY_NT_AUTHORITY — SECURITY_LOCAL_SYSTEM_RID установить в ACE в поле grfAccessMode значение SET_ACCESS (или GRANT_ACCESS — тоже вопрос), D_S>для SECURITY_WORLD_SID_AUTHORITY — SECURITY_WORLD_RID — DENY_ACESS
Видимо речь идет о использовании ф. SetEntriesInAcl?
GRANT_ACCESS — добавит права к существующим уже, SET_ACCESS — заменит. Т.е, допустим для группы стояло разрешение на чтение. Нужно добавить разрешение на запись — тогда GRANT_ACCESS. Если нужно заменить права чтение/запись на только чтение — нужно SET_ACCESS.
Я думаю, будет недостаточно двух вызовов SetEntriesInAcl для SECURITY_NT_AUTHORITY и SECURITY_WORLD_SID_AUTHORITY — они не изменят права пользоватей других групп ( допустим, power user ). См п.2
D_S>Вопрос 2: какая логика (и/или) при применении нескольких ACE (в том числе если один разрешающий а другой запрещающий)
ACE просматриваются последовательно. Допустим в списке для юзера 1 последовательно находится два ACE — первый разрешает запись, второй — запрещает. В этом случае просмотр ACE будет заканчиваться на первом элементе и запись будет всегда разрешена.
D_S>Вопрос 3: в группу everyone (представленной как я понимаю SECURITY_WORLD_SID_AUTHORITY — SECURITY_WORLD_RID) входит группа system SECURITY_NT_AUTHORITY — SECURITY_LOCAL_SYSTEM_RID)? Как я понимаю нет, но хотелось бы подтверждения.
В группу everyone входят все пользователи, в том числе и относящиеся к группе System. Иначе получился бы парадокс: к объекту разрешен доступ всем, но система не может получить к нему доступа.
Я думаю Вам нужно сделать следующее.
1)Создать новый ACL: InitializeAcl
2)Добавить туда разрешающий ACE для NT_AUTHORITY: AddAccessAllowedAce
3)Присвоить ACL нужной ветви реестра: RegSetKeySecurity