处理安全和访问权限

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提供的信息子集的访问权限。