线程安全和访问权限

Microsoft Windows 使你能够控制对线程对象的访问。 有关安全性的详细信息,请参阅 访问控制模型

在调用 CreateProcess、CreateProcessAsUserCreateProcessWithLogonWCreateThreadCreateRemoteThread 函数时,可以为线程指定安全描述符 如果指定 NULL,线程将获取默认的安全描述符。 线程的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。

若要检索线程的安全描述符,请调用 GetSecurityInfo 函数。 若要更改线程的安全描述符,请调用 SetSecurityInfo 函数。

CreateThread 函数返回的句柄THREAD_ALL_ACCESS线程对象的访问权限。 调用 GetCurrentThread 函数时,系统将返回具有线程安全描述符允许调用方的最大访问权限的伪处理器。

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

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

 

下表列出了特定于线程的访问权限。

含义
同步 (0x00100000L) 允许在任何 等待函数中使用线程句柄。
THREAD_ALL_ACCESS 线程对象的所有可能的访问权限。Windows Server 2003 和 Windows XP: Windows Server 2008 和 Windows Vista 上 THREAD_ALL_ACCESS 标志的值增加。 如果为 Windows Server 2008 和 Windows Vista 编译的应用程序在 Windows Server 2003 或 Windows XP 上运行, 则THREAD_ALL_ACCESS 标志包含不支持的访问位,并且指定此标志的函数将失败并 ERROR_ACCESS_DENIED。 若要避免此问题,请指定操作所需的最小访问权限集。 如果必须使用 THREAD_ALL_ACCESS请将 _WIN32_WINNT 设置为应用程序 (目标的最低操作系统, #define _WIN32_WINNT _WIN32_WINNT_WINXP 例如,) 。 有关详细信息,请参阅 使用 Windows 标头
THREAD_DIRECT_IMPERSONATION (0x0200) 模拟客户端的服务器线程是必需的。
THREAD_GET_CONTEXT (0x0008) 需要使用 GetThreadContext 读取线程的上下文。
THREAD_IMPERSONATE (0x0100) 需要使用提供模拟服务的通信机制直接使用线程的安全信息,而无需调用它。
THREAD_QUERY_INFORMATION (0x0040) 需要从线程对象读取某些信息,例如退出代码 (请参阅 GetExitCodeThread) 。
THREAD_QUERY_LIMITED_INFORMATION (0x0800) 需要从线程对象中读取某些信息 (请参阅 GetProcessIdOfThread) 。 THREAD_QUERY_LIMITED_INFORMATION自动授予具有 THREAD_QUERY_INFORMATION 访问权限 的句柄Windows Server 2003 和 Windows XP: 不支持此访问权限。
THREAD_SET_CONTEXT (0x0010) 使用 SetThreadContext 写入线程的上下文所必需的。
THREAD_SET_INFORMATION (0x0020) 在线程对象中设置某些信息所必需的。
THREAD_SET_LIMITED_INFORMATION (0x0400) 在线程对象中设置某些信息所必需的。 THREAD_SET_LIMITED_INFORMATION自动授予具有 THREAD_SET_INFORMATION 访问权限 的句柄Windows Server 2003 和 Windows XP: 不支持此访问权限。
THREAD_SET_THREAD_TOKEN (0x0080) 需要使用 SetThreadToken 为线程设置模拟令牌。
THREAD_SUSPEND_RESUME (0x0002) 需要暂停或恢复线程 (请参阅 SuspendThreadResumeThread) 。
THREAD_TERMINATE (0x0001) 使用 TerminateThread 终止线程所必需的。

 

如果要读取或写入对象的 SACL,可以请求 ACCESS_SYSTEM_SECURITY 线程对象的访问权限。 有关详细信息,请参阅 访问控制列表 (ACL) SACL 访问权限

受保护进程

受保护的进程 增强了对数字版权管理的支持。 系统限制对受保护进程和受保护进程的线程的访问。

Windows Server 2003 和 Windows XP: 从 Windows Vista 开始添加受保护的进程。

不允许以下特定访问权限从进程访问受保护进程的线程:

THREAD_ALL_ACCESS
THREAD_DIRECT_IMPERSONATION
THREAD_GET_CONTEXT
THREAD_IMPERSONATE
THREAD_QUERY_INFORMATION
THREAD_SET_CONTEXT
THREAD_SET_INFORMATION
THREAD_SET_TOKEN
THREAD_TERMINATE

引入了 THREAD_QUERY_LIMITED_INFORMATION 权限,以提供对通过 THREAD_QUERY_INFORMATION提供的信息子集的访问权限。