处理安全性和访问权限

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

当用户登录时,系统会收集一组在身份验证过程中唯一标识用户的数据,并将其存储在 访问令牌中。 此访问令牌描述与用户关联的所有进程的安全上下文。 进程的安全上下文是提供给进程或创建进程的用户帐户的凭据集。

可以使用令牌通过 CreateProcessWithTokenW 函数指定进程的当前安全上下文。 调用 CreateProcess、CreateProcessAsUserCreateProcessWithLogonW 函数时,可以为进程指定安全描述符 如果指定 NULL,则进程将获取默认的安全描述符。 进程的默认安全描述符中的 ACL 来自创建者的主要令牌或模拟令牌。

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

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

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

 

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

含义
PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED (0x000F0000L) |同步 (0x00100000L) |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) 若要检索有关进程的某些信息, (请参阅 GetExitCodeProcessGetPriorityClassIsProcessInJobQueryFullProcessImageName) 。 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) 需要对进程的地址空间执行操作 (请参阅 VirtualProtectExWriteProcessMemory) 。
PROCESS_VM_READ (0x0010) 使用 ReadProcessMemory 读取进程中的内存所必需的。
PROCESS_VM_WRITE (0x0020) 需要使用 WriteProcessMemory 写入进程中的内存。
同步 (0x00100000L) 需要使用等待 函数等待进程终止。

 

若要打开另一个进程的句柄并获取完全访问权限,必须启用 SeDebugPrivilege 特权。 有关详细信息,请参阅 更改令牌中的特权

CreateProcess 函数返回的句柄具有对进程对象的PROCESS_ALL_ACCESS访问权限。 调用 OpenProcess 函数时,系统会根据进程的安全描述符中的 DACL 检查请求 的访问权限 。 调用 GetCurrentProcess 函数时,系统将返回具有 DACL 允许调用方的最大访问权限的伪处理器。

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

警告

具有此处记录的一些访问权限的进程可以使用它们来获取其他访问权限。 例如,如果进程 A 具有具有 PROCESS_DUP_HANDLE 访问权限的处理 B 的句柄,则它可以复制进程 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提供的信息子集的访问权限。