同步对象安全性和访问权限

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

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

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

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

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

含义
DELETE (0x00010000L) 删除对象所必需的。
READ_CONTROL (0x00020000L) 需要读取对象的安全描述符中的信息,不包括 SACL 中的信息。 若要读取或写入 SACL,必须请求 ACCESS_SYSTEM_SECURITY 访问权限。 有关详细信息,请参阅 SACL 访问权限
同步 (0x00100000L) 将对象用于同步的权限。 这使线程能够等待对象处于信号状态。
WRITE_DAC (0x00040000L) 需要修改对象的安全描述符中的 DACL。
WRITE_OWNER (0x00080000L) 需要更改对象的安全描述符中的所有者。

 

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

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

 

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

含义
MUTEX_ALL_ACCESS (0x1F0001) 互斥对象的所有可能访问权限。 仅当应用程序需要超出标准访问权限授予的访问权限时,才使用此权限。 使用此访问权限会增加必须由管理员运行应用程序的可能性。
MUTEX_MODIFY_STATE (0x0001) 保留供将来使用。

 

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

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

 

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

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

 

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