同步对象安全和访问权限

利用 Windows 安全模型,可以控制对事件、mutex、信号灯和可等待计时器对象的访问。 计时器队列、互锁变量和临界区对象是不安全的。 有关详细信息,请参阅 访问控制模型

调用 CreateEventCreateMutexCreateSemaphoreCreateWaitableTimer函数时,可以为进程间同步对象指定 安全描述符。 如果指定 NULL,则对象将获取默认安全描述符。 "访问控制" 列出了同步对象的默认安全描述符中 (acl) 来自创建者的主要或模拟令牌。

若要获取或设置事件、mutex、信号灯或可等待计时器对象的安全描述符,请调用 GetNamedSecurityInfoSetNamedSecurityInfoGetSecurityInfoSetSecurityInfo 函数。

CreateEventCreateMutexCreateSemaphoreCreateWaitableTimer返回的句柄对新对象具有完全访问权限。 调用 OpenEventOpenMutexOpenSemaphoreOpenWaitableTimer 函数时,系统会对照对象的安全描述符检查请求的访问权限。

进程间同步对象的有效访问权限包括 标准访问权限 和某些特定于对象的访问权限。 下表列出了所有对象使用的标准访问权限。

含义
删除 (0x00010000L) 需要删除该对象。
阅读 _控制 (0x00020000L) 需要读取对象的安全描述符中的信息,不包括 SACL 中的信息。 若要读取或写入 SACL,你必须请求 访问 _ 系统 _ 安全 访问权限。 有关详细信息,请参阅 SACL 访问权限
同步 (0x00100000L) 将对象用于同步的权限。 这使线程可以等待,直到对象处于终止状态。
写入 _DAC (0x00040000L) 需要修改对象的安全描述符中的 DACL。
写入 _所有者 (0x00080000L) 需要更改对象的安全描述符中的所有者。

下表列出了事件对象的特定于对象的访问权限。 除了标准访问权限之外,还支持这些权限。

含义
事件 _所有 _ ACCESS (0x1F0003) 事件对象的所有可能的访问权限。 仅当你的应用程序需要超出标准访问权限和 事件 _ 修改 _ 状态 所授予的访问权限时,才使用此权限。 使用此访问权限会增加管理员必须运行应用程序的可能性。
事件 _修改 _ 状态 (0x0002) 修改 SetEventResetEventPulseEvent 函数所需的状态访问。

下表列出了 mutex 对象的特定于对象的访问权限。 除了标准访问权限之外,还支持这些权限。

含义
MUTEX _所有 _ ACCESS (0x1F0001) Mutex 对象的所有可能的访问权限。 仅当你的应用程序需要的访问权限超过标准访问权限所授予的访问权限时,才使用此权限。 使用此访问权限会增加管理员必须运行应用程序的可能性。
MUTEX _修改 _ 状态 (0x0001) 保留供将来使用。

下表列出了信号对象的特定于对象的访问权限。 除了标准访问权限之外,还支持这些权限。

含义
信号灯 _所有 _ ACCESS (0x1F0003) 信号灯对象的所有可能的访问权限。 仅当你的应用程序需要超出标准访问权限和 信号灯 _ 修改 _ 状态 所授予的访问权限时,才使用此权限。 使用此访问权限会增加管理员必须运行应用程序的可能性。
信号灯 _修改 _ 状态 (0x0002) 修改 ReleaseSemaphore 函数所需的状态访问。

下表列出了可等待 timer 对象的特定于对象的访问权限。 除了标准访问权限之外,还支持这些权限。

含义
计时器 _所有 _ ACCESS (0x1F0003) 可等待 timer 对象的所有可能的访问权限。 仅当你的应用程序需要超出标准访问权限和 计时器 _ 修改 _ 状态 所授予的访问权限时,才使用此权限。 使用此访问权限会增加管理员必须运行应用程序的可能性。
计时器 _修改 _ 状态 (0x0002) 修改状态访问,这是 SetWaitableTimerCancelWaitableTimer 函数所必需的。
计时器 _查询 _ 状态 (0x0001) 保留供将来使用。

若要读取或写入进程间同步对象的 SACL,必须请求 访问 _ 系统 _ 安全 访问权限。 有关详细信息,请参阅 访问控制列表 (acl) SACL 访问权限。