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

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

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

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

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

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

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

 

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

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

 

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

价值 意义
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 访问权限。 有关详细信息,请参阅 Access-Control 列表(ACL)SACL 访问权限