访问掩码和访问权

【勇芳软件工作室】汉化HomePreviousNext

访问权限定义了当尝试使用对象时可以向进程授予或拒绝的一组特定功能。例如,如果应用程序尝试在注册表中创建一个子项,但没有KEY_CREATE_SUB_KEY访问权限,则系统不执行该操作。应用程序通常在打开对象时请求一组访问权限,而在注册表项的情况下,它会在调用RegOpenKeyEx函数时发出该请求。

【访问掩码】访问控制条目(ACE)的组件,其中包含定义用户或组对对象的访问权限的特定权限,标准权限和通用权限。访问掩码也用于在打开对象时请求访问权限。例如,需要在注册表中设置值,创建子项和查询值的应用程序可以使用组合KEY_WRITE和KEY_QUERY_VALUE访问权限的访问掩码来打开密钥。

访问掩码是单个32位值。前16位是具体权限,仅适用于与访问掩码相关联的对象类型。位16到23是适用于所有对象的标准权限。位28到31是在请求访问对象时映射到特定和标准权限的通用权限。

通用访问权限是广泛的访问类型,其确切实现由定义对象的应用程序确定。保护对象时使用这些权限。例如,定义语音注释对象的应用程序可以通过使用VOICE_PLAY和VOICE_EDIT来播放和编辑对象来定义特定的访问权限。它可以设置一个GENERIC_MAPPING结构,其中GENERIC_EXECUTE映射到VOICE_PLAY,GENERIC_WRITE映射到VOICE_PLAY和VOICE_EDIT。

以下是已定义的通用权限。

不变含义
GENERIC_ALL读,写和执行访问
GENERIC_EXECUTE执行访问
GENERIC_READ阅读权限
GENERIC_WRITE写访问

例如,如果应用程序接收到对文件的GENERIC_WRITE访问,则它具有特定权限,允许它将文件写入和附加到文件中,写入文件属性和写入扩展属性。此外,该应用程序具有STANDARD_RIGHTS_WRITE和SYNCHRONIZE标准访问权限。

以下常量是标准访问权限的掩码。

不变含义
DELETE删除访问。
READ_CONTROL对不包括系统ACL的安全描述符的读访问。
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。
SYNCHRONIZE同步访问。允许线程等待对象。所有对象类型不支持此访问类型。
WRITE_DAC写入自由ACL的访问权限。
WRITE_OWNER写入对所有者的访问权限。

SPECIFIC_RIGHTS_ALL常量表示所有特定的权限,即使是不为对象定义的权限。

系统根据流程的访问令牌验证每个请求的访问权限,因此对广泛访问的请求可能需要大量的验证时间。因此,除了实际需要这种访问之外,应用程序通常更好地避免请求最广泛的访问对象。ACL中通常使用某些权限来拒绝对对象的访问,但是它们很少用于打开对象的请求。特别地,请求以下列表中的任何访问权限对系统性能有负面影响:

EVENT_ALL_ACCESSSECTION_ALL_ACCESS
FILE_MAP_ALL_ACCESSSEMAPHORE_ALL_ACCESS
GENERIC_ALLSERVICE_ALL_ACCESS
KEY_ALL_ACCESSSPECIFIC_RIGHTS_ALL
MUTEX_ALL_ACCESSSTANDARD_RIGHTS_ALL
PROCESS_ALL_ACCESSTHREAD_ALL_ACCESS
SC_MANAGER_ALL_ACCESSTOKEN_ALL_ACCESS

MAXIMUM_ALLOWED常量指定通过使用对给定用户有效的所有访问权限来打开对象。需要一个额外的访问类型ACCESS_SYSTEM_SECURITY来操纵对象的系统ACL。DACL中不能使用MAXIMUM_ALLOWED或ACCESS_SYSTEM_SECURITY。但是,您可以在SACL中使用ACCESS_SYSTEM_SECURITY在访问尝试中审核该位的使用。

MapGenericMask功能将GENERIC_MAPPING结构中指定的一系列通用权限映射到访问掩码中的特定和标准权限。应用程序可以使用GENERIC_MAPPING结构来指定对象创建时的访问权限。当客户端进程请求访问对象时,服务器可以使用MapGenericMask将客户端请求的访问权转换为该对象的标准和特定权限。

要发现客户端进程是否具有对对象的正确访问权限,服务器可以调用AccessCheckAccessCheckAndAuditAlarm功能。AreAllAccessesGrantedAreAnyAccessesGranted功能将请求的访问掩码与授权访问掩码进行比较。