AccessCheckByTypeResultList 函数 (securitybaseapi.h)

AccessCheckByTypeResultList 函数确定安全描述符是否向由访问令牌标识的客户端授予一组指定的访问权限。 函数可以检查客户端对对象层次结构(例如对象、其属性集和属性)的访问。 函数报告向层次结构中的每个对象类型授予或拒绝的访问权限。 通常,服务器应用程序使用此函数来检查对私有对象的访问。

语法

BOOL AccessCheckByTypeResultList(
  [in]                PSECURITY_DESCRIPTOR pSecurityDescriptor,
  [in, optional]      PSID                 PrincipalSelfSid,
  [in]                HANDLE               ClientToken,
  [in]                DWORD                DesiredAccess,
  [in, out, optional] POBJECT_TYPE_LIST    ObjectTypeList,
  [in]                DWORD                ObjectTypeListLength,
  [out]               PGENERIC_MAPPING     GenericMapping,
  [out, optional]     PPRIVILEGE_SET       PrivilegeSet,
  [in, out]           LPDWORD              PrivilegeSetLength,
  [out]               LPDWORD              GrantedAccessList,
  [out]               LPDWORD              AccessStatusList
);

参数

[in] pSecurityDescriptor

指向 SECURITY_DESCRIPTOR 结构的指针,针对该结构检查访问权限。

[in, optional] PrincipalSelfSid

指向 SID) (安全标识符 的指针。 如果安全描述符与表示主体 (例如用户对象) 的对象相关联, 则 PrincipalSelfSid 参数应为对象的 SID。 评估访问权限时,此 SID 以逻辑方式替换包含 PRINCIPAL_SELF已知 SID (S-1-5-10) 的 ACE) (任何 访问控制项 中的 SID。 有关已知 SID 的信息,请参阅 已知 SID

如果受保护的对象不表示主体,请将此参数设置为 NULL

[in] ClientToken

表示尝试获取访问权限的客户端的 模拟令牌 的句柄。 句柄必须具有对令牌TOKEN_QUERY访问权限;否则,函数将失败并出现ERROR_ACCESS_DENIED。

[in] DesiredAccess

一个访问掩码,指定检查的访问权限。 此掩码必须由 MapGenericMask 函数映射,才能不包含泛型访问权限。

如果此参数MAXIMUM_ALLOWED,则函数设置 GrantedAccess 数组中的访问掩码,以指示客户端对对象类型列表中每个元素的最大访问权限。

[in, out, optional] ObjectTypeList

指向OBJECT_TYPE_LIST结构的数组的指针,这些结构标识要为其检查访问的对象类型的层次结构。 数组中的每个元素指定一个标识对象类型的 GUID 和一个指示对象类型层次结构中对象类型的级别的值。 数组不应有两个具有相同 GUID 的元素。

数组必须至少有一个元素。 数组中的第一个元素必须位于零级,并标识对象本身。 数组只能有一个零级元素。 第二个元素是级别 1 的子对象,例如属性集。 每个级别 1 条目后面的是级别 2 到 4 子对象的从属条目。 因此,数组中元素的级别可能是 {0, 1, 2, 2, 1, 2, 3}。 如果对象类型列表无序, AccessCheckByTypeResultList 将失败, GetLastError 将返回ERROR_INVALID_PARAMETER。

[in] ObjectTypeListLength

ObjectTypeList 数组中的元素数。 这也是 GrantedAccessListAccessStatusList 参数指向的数组中的元素数。

[out] GenericMapping

指向与要检查其访问权限的对象关联的 GENERIC_MAPPING 结构的指针。

[out, optional] PrivilegeSet

指向 PRIVILEGE_SET 结构的指针,该结构 接收用于执行 访问验证的权限。 如果未使用任何特权,该函数会将 PrivilegeCount 成员设置为零。

[in, out] PrivilegeSetLength

PrivilegeSet 参数指向的缓冲区的大小(以字节为单位)。

[out] GrantedAccessList

指向访问掩码数组的指针。 函数设置每个访问掩码以指示授予对象类型列表中的相应元素的访问权限。 如果函数失败,则不会设置访问掩码。

[out] AccessStatusList

指向对象类型列表中相应元素的状态代码数组的指针。 函数将元素设置为零以指示成功,将非零值设置为指示访问检查期间的特定错误。 如果函数失败,则它不会设置数组中的任何元素。

返回值

如果函数成功,则函数返回非零值。

如果函数失败,则返回零。 要获得更多的错误信息,请调用 GetLastError。

注解

有关详细信息,请参阅 AccessCheck 的工作原理 概述。

AccessCheckByTypeResultList 函数将指定的安全描述符与指定的访问令牌进行比较,并在 AccessStatusList 参数中指示对象类型列表中的每个元素是授予访问权限还是拒绝访问。

ObjectTypeList 数组不一定表示整个定义的对象。 相反,它表示要为其检查访问的对象子集。 例如,若要检查访问属性集中的两个属性,请指定具有四个元素的对象类型列表:对象本身位于级别 0、在级别 1 处设置的属性和级别 2 中的两个属性。

AccessCheckByTypeResultList 函数计算应用于对象本身的 ACE,以及 ObjectTypeList 数组中列出的对象类型特定于对象的 ACE。 对于 ObjectTypeList 数组中未列出的对象类型,函数将忽略特定于对象的 ACE。 因此, AccessStatusList 参数中为元素零返回的结果指示允许访问 ObjectTypeList 参数定义的对象的子集,而不是整个对象。

有关 ACE 层次结构如何控制对对象及其子对象的访问的详细信息,请参阅 用于控制对对象属性的访问的 ACE

如果安全描述符的 任意访问控制列表 (DACL) 为 NULL,则该函数将授予对对象类型列表中所有元素的请求访问权限。

如果安全描述符不包含所有者和组 SID, 则 AccessCheckByTypeResultList 将失败并ERROR_INVALID_SECURITY_DESCR。

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 securitybaseapi.h (包括 Windows.h)
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

AccessCheck

AccessCheckAndAuditAlarm

AccessCheckByType

AccessCheckByTypeAndAuditAlarm

AccessCheckByTypeResultListAndAuditAlarm

客户端/服务器访问控制

客户端/服务器访问控制函数

GENERIC_MAPPING

AccessCheck 的工作原理

MakeAbsoluteSD

MapGenericMask

OBJECT_TYPE_LIST

PRIVILEGE_SET

SECURITY_DESCRIPTOR