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", и это должно работать.

Другие вопросы по тегам