DACL для события, не позволяющего пользователям установить его
Я хотел бы сделать следующее: создать событие, зарегистрированное в глобальном пространстве имен, и изменить его DACL так, чтобы:
- Обычные пользователи могут читать состояние события (используя WaitForSingleObject со значением времени ожидания 0)
- Администраторы могут изменить статус события (
SetEvent
или жеResetEvent
)
Кроме того, в большинстве случаев это событие будет изначально создаваться пользователем без прав администратора во время инициализации приложения.
Идея состоит в том, чтобы позволить системным администраторам на сервере службы терминалов посылать сигнал всем процессам, принадлежащим моему приложению (их много), что они должны завершить работу как можно скорее и сохранить их заблокированными. Это должно работать во всех сеансах пользователя, но также обеспечивать определенный уровень безопасности.
Я изо всех сил пытаюсь найти правильные DACL для объекта события во время создания: я не могу ограничить возможность изменять состояние объекта только администраторами.
я использую ConvertStringSecurityDescriptorToSecurityDescriptor
создать DACL из строки SSDL. Вот ближе всего подошел к рабочему образцу:
Format('D:(A;OICI;GA;;;BA)(A;OICI;0x%.8xF;;;WD)',[(SYNCHRONIZE)])
Это должно дать ALL_ACCESS
членам встроенного Administrators
группа и SYNCHRONIZE
в EVERYONE
,
К сожалению, полученный ACL не работает так, как я хочу: если я проверяю результирующее состояние объекта с помощью ProcessExplorer, я вижу, что администраторы имеют все права (как хотелось бы), но у ВСЕХ по-прежнему есть право "Изменить состояние".
В случае, если это имеет значение, я использую Delphi 6. Полученное приложение должно быть совместимо с Windows 2003 Server/XP и выше.
заранее спасибо
1 ответ
Во втором ACE вы устанавливаете права доступа, используя строку формата, содержащую 0x%.8xF
(обратите внимание на завершающий 'F'), поэтому значение установлено на (SYNCHRONIZE<<4) | 0xF
,
EVENT_MODIFY_STATE
является 0x0002
так что это разрешение включено.
Потерять завершающий "F", и это должно работать.