进程安全和访问权限

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

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

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

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

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

含义
删除 (0x00010000L) 需要删除该对象。
阅读 _控制 (0x00020000L) 需要读取对象的安全描述符中的信息,不包括 SACL 中的信息。 若要读取或写入 SACL,你必须请求 访问 _ 系统 _ 安全 访问权限。 有关详细信息,请参阅 SACL 访问权限
同步 (0x00100000L) 将对象用于同步的权限。 这使线程可以等待,直到对象处于终止状态。
写入 _DAC (0x00040000L) 需要修改对象的安全描述符中的 DACL。
写入 _所有者 (0x00080000L) 需要更改对象的安全描述符中的所有者。

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

含义
处理 _所有 _ 访问 (STANDARD_RIGHTS_REQUIRED (0x000F0000L) | 同步 (0x00100000L) | 0xffff) 进程对象的所有可能的访问权限。Windows Server 2003 和 Windows XP: Windows Server 2008 和 Windows Vista 上的 进程的 _ 所有 _ 访问 标志的大小增加。 如果为 Windows server 2008 和 Windows Vista 编译的应用程序在 Windows Server 2003 或 Windows XP 上运行,则该 进程的 _ 所有 _ 访问 标志都将会太大,指定此标志的函数将失败,并 _ _ 拒绝错误访问。 若要避免此问题,请指定操作所需的最小访问权限集。 如果必须使用 " 处理 _ 所有 _ 访问 ",请将 _ WIN32 _ WINNT 设置为应用程序所面向的最低操作系统 (例如 #define _WIN32_WINNT _WIN32_WINNT_WINXP) 。 有关详细信息,请参阅使用 Windows 标头
处理 _创建 _ 进程 (0x0080) 需要创建进程。
处理 _创建 _ 线程 (0x0002) 需要创建线程。
处理 _ (0x0040) 的 DUP _ 句柄 需要使用 DuplicateHandle复制句柄。
处理 _查询 _ 信息 (0x0400) 需要检索有关进程的某些信息,如其令牌、退出代码和优先级类 (参阅 OpenProcessToken) 。
处理 _查询 _ 有限 _ 信息 (0x1000) 需要检索有关进程的某些信息 (参阅 GetExitCodeProcessGetPriorityClassIsProcessInJobQueryFullProcessImageName) 。 将自动向具有 "处理 _ 查询 _ 信息" 访问权限的句柄授予 进程 _ 查询 _ 有限 _ 信息Windows服务器2003和 Windows XP: 不支持此访问权限。
处理 _ (0x0200) 设置 _ 信息 若要设置有关进程的某些信息(例如其优先级类 (参阅 SetPriorityClass) 。
处理 _设置 _ 配额 (0x0100) 需要使用 SetProcessWorkingSetSize设置内存限制。
处理 _挂起 _ 恢复 (0x0800) 需要暂停或继续进程。
处理 _终止 (0x0001) 需要使用 TerminateProcess终止进程。
处理 _VM _ 操作 (0x0008) 需要在进程的地址空间上执行操作 (参阅 VirtualProtectEx and WriteProcessMemory) 。
处理 _VM _ 读取 (0x0010) 需要使用 ReadProcessMemory读取进程中的内存。
处理 _VM _ WRITE (0x0020) 需要使用 WriteProcessMemory写入进程中的内存。
同步 (0x00100000L) 需要等待进程使用 等待函数终止。

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

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

如果要读取或写入对象的 SACL,可以向进程对象请求 访问 _ 系统 _ 安全 访问权限。 有关详细信息,请参阅 访问控制列表 (acl) SACL 访问权限。

警告

具有此处所述的一些访问权限的过程可以使用它们来获得其他访问权限。 例如,如果进程 A 具有处理 B 的句柄,而 进程 _ DUP _ 句柄 访问,则它可以复制进程 b 的伪句柄。这将创建一个句柄,该句柄具有对进程 B 的最大访问权限。有关伪句柄的详细信息,请参阅 GetCurrentProcess

受保护进程

WindowsVista 引入 受保护的进程 来增强对数字 Rights Management 的支持。 系统限制对受保护进程和受保护进程的线程的访问。

不允许对受保护的进程执行以下标准访问权限:

  • DELETE
  • 读取 _ 控制
  • 写入 _ DAC
  • 写入 _ 所有者

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

  • 处理 _ 所有 _ 访问
  • 进程 _ 创建 _ 过程
  • 处理 _ 创建 _ 线程
  • 处理 _ DUP _ 句柄
  • 处理 _ 查询 _ 信息
  • 处理 _ 集 _ 信息
  • 进程 _ 集 _ 配额
  • 进程 _ VM _ 操作
  • 进程 _ VM _ 读取
  • 进程 _ VM _ 写入

引入了 " 处理 _ 查询 _ 限制 _ 信息 " 权限,以提供对通过 过程 _ 查询 _ 信息 提供的信息子集的访问权限。