1

我想做以下事情:创建一个使用全局命名空间注册的事件并修改它的 DACL 以便:

  • 普通用户可以读取事件状态(使用带有 0 超时值的 WaitForSingleObject)
  • 管理员可以更改事件状态(SetEventResetEvent

此外,大多数情况下,该事件最初由非管理员用户在应用程序初始化期间创建

这个想法是允许终端服务服务器上的系统管理员向属于我的应用程序的所有进程(有很多)发送信号,它们应该尽快终止并保持锁定。这必须适用于所有用户会话,但也必须提供某种安全层。

在创建期间,我正在努力为事件对象找到正确的 DACL:我似乎无法将更改对象状态的能力仅限于管理员。

我正在使用ConvertStringSecurityDescriptorToSecurityDescriptor从 SSDL 字符串创建 DACL。这是我最接近工作样本的情况:

Format('D:(A;OICI;GA;;;BA)(A;OICI;0x%.8xF;;;WD)',[(SYNCHRONIZE)])

这应该给ALL_ACCESS内置Administrators组的成员和SYNCHRONIZEEVERYONE.

不幸的是,生成的 ACL 并不能完全按照我想要的方式工作:如果我使用 ProcessExplorer 检查生成的对象状态,我会看到管理员拥有所有权限(根据需要),但每个人仍然拥有“修改状态”权限集。

万一这很重要,我使用的是 Delphi 6。生成的应用程序必须与 windows 2003 server/XP 及更高版本兼容。

提前致谢

4

1 回答 1

1

在第二个 ACE 中,您使用包含0x%.8xF(注意尾随的“F”)的格式字符串设置访问权限,因此值设置为(SYNCHRONIZE<<4) | 0xF.

EVENT_MODIFY_STATE所以0x0002这个权限被包括在内。

丢失尾随的“F”,它应该可以工作。

于 2012-08-08T07:32:21.047 回答