访问掩码

访问掩码的功能是以简洁形式描述访问权限。 为了简化访问管理,访问掩码包含一组四位(通用权限),这些权限通过使用函数RtlMapGenericMask 转换为一组更详细的权限。

下图阐释了访问掩码。

说明访问掩码的关系图。

通用权限包括:

  • GENERIC_READ—读取对象维护的信息的权限。

  • GENERIC_WRITE—编写由对象维护的信息的权限。

  • GENERIC_EXECUTE—执行或查看对象的权限。

  • GENERIC_ALL—读取、写入和执行对象的权限。

这些权利可以合并。 例如,可以同时请求 GENERIC_READ 和 GENERIC_WRITE。 由此产生的映射需要将每个通用权利所需的权利联合起来。 此范例模拟用于控制对 UNIX 资源的访问的 UNIX“rwx”访问位。 访问掩码中的通用权限简化了 Windows 上的应用程序开发,因为这些权限掩盖了各种对象类型的不同安全权限。

以下一组标准权限适用于所有对象类型:

  • DELETE—删除特定对象的权限。

  • READ_CONTROL—读取对象的控件(安全)信息的权限。

  • WRITE_DAC—修改对象的控件(安全)信息的权限。

  • WRITE_OWNER—修改对象的所有者 SID 的权限。 请记住,所有者始终有权修改对象。

  • SYNCHRONIZE—等待给定对象的权限(假设等待是对象的有效概念)。

访问掩码的低 16 位表示特定权限。 这些特定权限的含义对于有关对象是唯一的。 对于文件系统,主要利益是文件对象的特定权限。 对于文件对象,根据文件对象是代表文件还是代表目录,通常对特定的权限有不同的解释。 对于文件,通常的解释是:

  • FILE_READ_DATA—从给定文件读取数据的权利。

  • FILE_WRITE_DATA—将数据写入给定文件(在文件的现有范围内)的权利。

  • FILE_APPEND_DATA—扩展给定文件的权利。

  • FILE_READ_EA—读取文件的扩展属性的权利。

  • FILE_WRITE_EA—修改文件的扩展属性的权利。

  • FILE_EXECUTE—在本地执行给定文件的权利。 执行存储在远程共享上的文件需要读取权限,因为该文件是从服务器读取的,但在客户端上执行。

  • FILE_READ_ATTRIBUTES—读取文件的属性信息的权利。

  • FILE_WRITE_ATTRIBUTES—修改文件的属性信息的权利。

对于目录,使用了相同的位值;但在以下一些情况下,它们的解释不同:

  • FILE_LIST_DIRECTORY—列出目录内容的权利。

  • FILE_ADD_FILE—在目录中创建新文件的权限。

  • FILE_ADD_SUBDIRECTORY—在目录中创建新目录(子目录)的权限。

  • FILE_READ_EA—读取给定目录的扩展属性的权限。

  • FILE_WRITE_EA—编写给定目录的扩展属性的权限。

  • FILE_TRAVERSE—访问目录中的对象的权限。 FILE_TRAVERSE 访问权限不同于 FILE_LIST_DIRECTORY 访问权限。 保留 FILE_LIST_DIRECTORY 访问权限允许实体获取目录内容的列表,而 FILE_TRAVERSE 访问权限授予实体访问对象的权限。 没有 FILE_LIST_DIRECTORY 访问权限的调用者可以打开一个它知道已经存在的文件,但无法获取目录内容的列表。

  • FILE_DELETE_CHILD—删除当前目录中的文件或目录的权限。

  • FILE_READ_ATTRIBUTES—读取目录的属性信息的权限。

  • FILE_WRITE_ATTRIBUTES—修改目录的属性信息的权限。

I/O 管理器定义通用权限与文件对象的标准和特定权限的实际映射。 文件系统可以使用 IoGetFileObjectGenericMapping 检索此映射。 通常,I/O 管理器在调用文件系统之前,会在 IRP_MJ_CREATE 处理期间执行此映射。 但是,检查特定操作(例如专门的 FSCTL 操作)安全性的文件系统可能需要自己进行此映射。