线程安全性和访问权限
Microsoft Windows 使你能够控制对线程对象的访问。 有关安全性的详细信息,请参阅 Access-Control 模型。
调用 CreateProcess、CreateProcessAsUser、CreateProcessWithLogonW、CreateThread或 CreateRemoteThread 函数时,可以为线程指定 安全描述符。 如果指定 NULL,则线程将获取默认的安全描述符。 线程的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。
若要检索线程的安全描述符,请调用 GetSecurityInfo 函数。 若要更改线程的安全描述符,请调用 SetSecurityInfo 函数。
CreateThread 函数返回的句柄具有对线程对象的 THREAD_ALL_ACCESS 访问权限。 调用 GetCurrentThread 函数时,系统会返回一个伪处理器,该命令允许调用方访问线程的安全描述符的最大访问权限。
线程对象的有效访问权限包括 标准访问权限 和某些特定于线程的访问权。 下表列出了所有对象使用的标准访问权限。
价值 | 意义 |
---|---|
DELETE (0x00010000L) | 需要删除对象。 |
READ_CONTROL (0x00020000L) | 在对象的安全描述符中读取信息(不包括 SACL 中的信息)所必需的。 若要读取或写入 SACL,必须请求 ACCESS_SYSTEM_SECURITY 访问权限。 有关详细信息,请参阅 SACL 访问权限。 |
SYNCHRONIZE (0x001000000L) | 使用对象进行同步的权限。 这使线程可以等待对象处于信号状态。 |
WRITE_DAC (0x00040000L) | 在对象的安全描述符中修改 DACL 所必需的。 |
WRITE_OWNER (0x00080000L) | 在对象的安全描述符中更改所有者所必需的。 |
下表列出了线程特定的访问权限。
价值 | 意义 |
---|---|
SYNCHRONIZE (0x001000000L) | 允许在任何 等待函数中使用线程句柄。 |
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) | 需要暂停或恢复线程(请参阅 SuspendThread 和 ResumeThread)。 |
THREAD_TERMINATE(0x0001) | 需要使用 TerminateThread终止线程。 |
如果要读取或写入对象的 SACL,可以请求对线程对象的 ACCESS_SYSTEM_SECURITY 访问权限。 有关详细信息,请参阅 Access-Control 列表(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提供的信息子集的访问权限。