处理安全和访问权限
Microsoft Windows 安全模型使你能够控制对处理对象的访问。 有关安全性的详细信息,请参阅 Access-Control 模型。
当用户登录时,系统会收集一组在身份验证过程中唯一标识用户的数据,并将其存储在 访问令牌中。 此访问令牌描述与用户关联的所有进程的安全上下文。 进程的安全上下文是提供给进程或创建进程的用户帐户的凭据集。
可以使用令牌通过 CreateProcessWithTokenW 函数指定进程的当前安全上下文。 调用 CreateProcess、CreateProcessAsUser或 CreateProcessWithLogonW 函数时,可以为进程指定 安全描述符。 如果指定 NULL,则进程将获取默认的安全描述符。 进程的默认安全描述符中的 ACL 来自创建者的主要或模拟令牌。
若要检索进程的安全描述符,请调用 GetSecurityInfo 函数。 若要更改进程的安全描述符,请调用 SetSecurityInfo 函数。
进程对象的有效访问权限包括 标准访问权限 和某些特定于进程的访问权限。 下表列出了所有对象使用的标准访问权限。
价值 | 意义 |
---|---|
DELETE (0x00010000L) | 需要删除对象。 |
READ_CONTROL (0x00020000L) | 在对象的安全描述符中读取信息(不包括 SACL 中的信息)所必需的。 若要读取或写入 SACL,必须请求 ACCESS_SYSTEM_SECURITY 访问权限。 有关详细信息,请参阅 SACL 访问权限。 |
SYNCHRONIZE (0x001000000L) | 使用对象进行同步的权限。 这使线程可以等待对象处于信号状态。 |
WRITE_DAC (0x00040000L) | 在对象的安全描述符中修改 DACL 所必需的。 |
WRITE_OWNER (0x00080000L) | 在对象的安全描述符中更改所有者所必需的。 |
下表列出了特定于进程的访问权限。
价值 | 意义 |
---|---|
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) |SYNCHRONIZE (0x001000000L) |0xFFFF) | 进程对象的所有可能访问权限。Windows Server 2003 和 Windows XP: Windows Server 2008 和 Windows Vista 上 PROCESS_ALL_ACCESS 标志的大小增加。 如果为 Windows Server 2008 和 Windows Vista 编译的应用程序在 Windows Server 2003 或 Windows XP 上运行,则 PROCESS_ALL_ACCESS 标志太大,并且指定此标志的函数失败并 ERROR_ACCESS_DENIED。 若要避免此问题,请指定作所需的最低访问权限集。 如果必须使用 PROCESS_ALL_ACCESS,请将_WIN32_WINNT设置为应用程序目标的最低作系统(例如,#define _WIN32_WINNT _WIN32_WINNT_WINXP )。 有关详细信息,请参阅 使用 Windows 标头。 |
PROCESS_CREATE_PROCESS(0x0080) | 需要将此进程用作父进程和 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS。 |
PROCESS_CREATE_THREAD(0x0002) | 在进程中创建线程所必需的。 |
PROCESS_DUP_HANDLE(0x0040) | 需要使用 DuplicateHandle复制句柄。 |
PROCESS_QUERY_INFORMATION(0x0400) | 检索有关进程的某些信息(例如其令牌、退出代码和优先级类)所必需的(请参阅 OpenProcessToken)。 |
PROCESS_QUERY_LIMITED_INFORMATION(0x1000) | 检索有关进程的某些信息是必需的(请参阅 GetExitCodeProcess、GetPriorityClass、IsProcessInJob、QueryFullProcessImageName)。
PROCESS_QUERY_LIMITED_INFORMATION自动授予具有 PROCESS_QUERY_INFORMATION 访问权限的句柄。Windows Server 2003 和 Windows XP:不支持此访问权限。 |
PROCESS_SET_INFORMATION(0x0200) | 设置有关进程的某些信息(如其优先级类)所必需的(请参阅 SetPriorityClass)。 |
PROCESS_SET_QUOTA(0x0100) | 需要使用 SetProcessWorkingSetSize设置内存限制。 |
PROCESS_SUSPEND_RESUME(0x0800) | 挂起或恢复进程所必需的。 |
PROCESS_TERMINATE(0x0001) | 需要使用 TerminateProcess终止进程。 |
PROCESS_VM_OPERATION(0x0008) | 需要对进程的地址空间执行作(请参阅 VirtualProtectEx 和 WriteProcessMemory)。 |
PROCESS_VM_READ(0x0010) | 需要使用 ReadProcessMemory读取进程中的内存。 |
PROCESS_VM_WRITE(0x0020) | 需要使用 WriteProcessMemory写入进程中的内存。 |
SYNCHRONIZE (0x001000000L) | 需要等待进程使用 等待函数终止。 |
若要打开另一个进程的句柄并获取完全访问权限,必须启用 SeDebugPrivilege 特权。 有关详细信息,请参阅 更改令牌中的特权。
CreateProcess 函数返回的句柄具有对进程对象的 PROCESS_ALL_ACCESS 访问权限。 调用 OpenProcess 函数时,系统会根据进程的安全描述符中的 DACL 检查请求的 访问权限。 调用 GetCurrentProcess 函数时,系统会返回一个伪手法,其访问 DACL 允许调用方的最大访问权限。
如果要读取或写入对象的 SACL,可以请求对进程对象的 ACCESS_SYSTEM_SECURITY 访问权限。 有关详细信息,请参阅 Access-Control 列表(ACL) 和 SACL 访问权限。
警告
此处记录的一些访问权限的进程可以使用它们来获取其他访问权限。 例如,如果进程 A 具有处理 B 的句柄并具有 PROCESS_DUP_HANDLE 访问权限,则它可以复制进程 B 的伪句柄。这会创建一个对进程 B 具有最大访问权限的句柄。有关伪句柄的详细信息,请参阅 GetCurrentProcess。
受保护的进程
Windows Vista 引入了 受保护的进程,以增强对数字权限管理的支持。 系统限制对受保护进程和受保护进程的线程的访问。
不允许将以下标准访问权限从进程进入受保护的进程:
- DELETE
- READ_CONTROL
- WRITE_DAC
- WRITE_OWNER
不允许将以下特定访问权限从进程进入受保护的进程:
- PROCESS_ALL_ACCESS
- PROCESS_CREATE_PROCESS
- PROCESS_CREATE_THREAD
- PROCESS_DUP_HANDLE
- PROCESS_QUERY_INFORMATION
- PROCESS_SET_INFORMATION
- PROCESS_SET_QUOTA
- PROCESS_VM_OPERATION
- PROCESS_VM_READ
- PROCESS_VM_WRITE
引入了 PROCESS_QUERY_LIMITED_INFORMATION 权限,用于提供对通过 PROCESS_QUERY_INFORMATION提供的信息子集的访问权限。