Windows Access Control
搜索文档…
⌃K

(五)访问权限与权限码

访问权限和访问掩码

访问权限是一个位标志,它对应于线程可以在可保护对象上执行的一组特定操作。例如,注册表项具有KEY_SET_VALUE访问权限,这对应于线程在项下设置值的能力。如果线程尝试对某个对象执行操作,但没有对该对象的必要访问权限,则系统不会执行该操作。
访问掩码是一个32位的值,其位与对象支持的访问权限相对应。所有Windows安全对象均使用访问掩码格式,该格式包含用于以下类型的访问权限的位:
  • 通用访问权限
  • 标准访问权限
  • SACL访问权限
  • 目录服务(域)访问权限
当线程尝试打开对象的句柄时,该线程通常会指定访问掩码以请求一组访问权限。例如,需要设置和查询注册表项的值的应用程序可以通过使用访问掩码来请求KEY_SET_VALUEKEY_QUERY_VALUE访问权限来打开注册表项。
下表显示了用于处理每种安全对象类型的安全信息的功能。这就是前两节ACL修改中会使用到的对象,以及其安全信息的资料。

访问掩码格式

所有安全对象都使用下图所示的访问掩码格式来安排其访问权限。
access mask format
在这种格式中,低16位用于特定对象的访问权限,后8位用于标准访问权限,这些权限适用于大多数类型的对象,而4个高位用于指定通用访问权限每种对象类型可以映射到一组标准和特定于对象的权限。 ACCESS_SYSTEM_SECURITY位对应于访问对象的SACL的权限。

通用访问权限

全对象使用访问掩码格式,其中四个高位指定通用访问权限。每种可保护对象的类型都将这些位映射到一组其标准和特定于对象的访问权限。(也就是说通用权限是由标准位和特殊位映射出来的)例如,Windows文件对象将GENERIC_READ位映射到READ_CONTROLSYNCHRONIZE标准访问权限以及FILE_READ_DATAFILE_READ_EAFILE_READ_ATTRIBUTES这三个对象特定的访问权限。其他类型的对象将GENERIC_READ位映射到适合该类型对象的任何访问权限集。
可以使用通用访问权限来指定打开对象的句柄时所需的访问类型。会比指定所有相应的标准和特定权限要简单。
下表显示了为通用访问权限定义的常量。
常量
通用含义
GENERIC_ALL
All possible access rights
GENERIC_EXECUTE
Execute access
GENERIC_READ
Read access
GENERIC_WRITE
Write access

标准访问权限

每种类型的可保护对象都有一组访问权限,这些访问权限对应于特定于该类型对象的操作。除了这些特定于对象的访问权限之外,还有一组标准访问权限,它们对应于大多数类型的可保护对象的通用操作。
访问掩码格式包括一组用于标准访问权限的位。 Winnt.h中定义了以下Windows标准访问权限常量。
常量
含义
DELETE
删除对象的权利
READ_CONTROL
有权读取对象的安全描述符中的信息,但不包括系统访问控制列表(SACL)中的信息。
SYNCHRONIZE
使用对象进行同步的权利。这使线程可以等待,直到对象处于信号状态。某些对象类型不支持此访问权限。
WRITE_DAC
修改对象的安全描述符中的任意访问控制列表(DACL)的权限。
WRITE_OWNER
在对象的安全描述符中更改所有者的权利。
Winnt.h还定义了标准访问权限常量的以下组合
常量
含义
STANDARD_RIGHTS_ALL
合并DELETE,READ_CONTROL,WRITE_DAC,WRITE_OWNER和SYNCHRONIZE访问
STANDARD_RIGHTS_EXECUTE
当前定义为等于READ_CONTROL。
STANDARD_RIGHTS_READ
当前定义为等于READ_CONTROL。
STANDARD_RIGHTS_REQUIRED
合并DELETE,READ_CONTROL,WRITE_DAC和WRITE_OWNER访问。
STANDARD_RIGHTS_WRITE
当前定义为等于READ_CONTROL

SACL访问权限

ACCESS_SYSTEM_SECURITY访问权限控制在对象的安全描述符中获取或设置SACL的能力。仅当在请求线程的访问令牌中启用SE_SECURITY_NAME特权时,系统才会授予此访问权限。
访问对象的SACL :
  1. 1.
    调用AdjustTokenPrivileges函数以启用SE_SECURITY_NAME特权。
  2. 2.
    打开对象的句柄时,请求ACCESS_SYSTEM_SECURITY访问权限。
  3. 3.
    通过使用诸如GetSecurityInfoSetSecurityInfo之类的函数来获取或设置对象的SACL。
  4. 4.
    调用AdjustTokenPrivileges以禁用SE_SECURITY_NAME特权
要使用GetNamedSecurityInfoSetNamedSecurityInfo函数访问SACL,请启用SE_SECURITY_NAME特权。该函数在内部请求访问权限。
ACCESS_SYSTEM_SECURITY访问权限在DACL中无效,因为DACL不控制对SACL的访问。但是,您可以在SACL中使用ACCESS_SYSTEM_SECURITY访问权限来审核使用该访问权限的尝试。

域服务访问权限

每个Active Directory对象都有一个分配给它的安全描述符。可以在这些安全描述符中设置特定于目录服务对象的一组受托者权限。下表列出了这些权利也对应域服务ACE的权限图。
域服务ACE编辑器
权限
Meaning
ACTRL_DS_OPEN
打开DS对象
ACTRL_DS_CREATE_CHILD
创建子DS对象
ACTRL_DS_DELETE_CHILD
删除子DS对象
ACTRL_DS_LIST
枚举DS对象
ACTRL_DS_READ_PROP
读取DS对象的属性
ACTRL_DS_WRITE_PROP
写入DS对象的属性
ACTRL_DS_SELF
仅在执行对象支持的经过验证的权限检查后才允许访问。该标志可以单独用于执行对象的所有已验证权限检查,也可以与特定已验证权限的标识符组合以仅执行该检查。
ACTRL_DS_DELETE_TREE
删除DS对象树
ACTRL_DS_LIST_OBJECT
列出DS对象树
ACTRL_DS_CONTROL_ACCESS
仅在执行对象支持的扩展权限检查之后才允许访问。该标志可以单独用于对对象执行所有扩展权限检查,也可以与特定扩展权限的标识符组合以仅执行该检查。

请求对对象的访问权限

当您打开对象的句柄时,返回的句柄具有对该对象的访问权限的某种组合。某些功能(例如CreateSemaphore)不需要特定的请求访问权限集。这些功能总是尝试打开手柄以进行完全访问。其他功能,例如CreateFileOpenProcess,允许您指定所需的访问权限集。您应该仅请求所需的访问权限,而不是为完全访问打开句柄。这样可以防止意外使用该句柄,并增加了如果对象的DACL仅允许有限的访问,则访问请求成功的机会。
使用通用访问权限来指定打开对象的句柄时所需的访问类型。这通常比指定所有相应的标准和特定权限要简单。或者,使用MAXIMUM_ALLOWED常量请求以对调用者有效的所有访问权限打开对象。