AccessCheckByTypeResultListAndAuditAlarmByHandleW 函数 (securitybaseapi.h)

AccessCheckByTypeResultListAndAuditAlarmByHandle 函数确定是否向调用线程正在模拟的客户端授予一组指定的访问权限。 此函数与 AccessCheckByTypeResultListAndAuditAlarm 的区别在于,此函数允许调用线程在模拟客户端之前执行访问检查。

函数可以检查对对象的层次结构的访问,例如对象、其属性集和属性。 函数报告向层次结构中的每个对象类型授予或拒绝的访问权限。 如果安全描述符具有 一个系统访问控制列表 (SACL) ,其中包含适用于客户端的 访问控制项 (ACE) ,则函数会在安全事件日志中生成任何必要的审核消息。 目前不支持警报。

语法

BOOL AccessCheckByTypeResultListAndAuditAlarmByHandleW(
  [in]                LPCWSTR              SubsystemName,
  [in]                LPVOID               HandleId,
  [in]                HANDLE               ClientToken,
  [in]                LPCWSTR              ObjectTypeName,
  [in, optional]      LPCWSTR              ObjectName,
  [in]                PSECURITY_DESCRIPTOR SecurityDescriptor,
  [in, optional]      PSID                 PrincipalSelfSid,
  [in]                DWORD                DesiredAccess,
  [in]                AUDIT_EVENT_TYPE     AuditType,
  [in]                DWORD                Flags,
  [in, out, optional] POBJECT_TYPE_LIST    ObjectTypeList,
  [in]                DWORD                ObjectTypeListLength,
  [in]                PGENERIC_MAPPING     GenericMapping,
  [in]                BOOL                 ObjectCreation,
                      LPDWORD              GrantedAccessList,
  [out]               LPDWORD              AccessStatusList,
  [out]               LPBOOL               pfGenerateOnClose
);

参数

[in] SubsystemName

指向以 null 结尾的字符串的指针,该字符串指定调用函数的子系统的名称。 此字符串显示在函数生成的任何审核消息中。

[in] HandleId

指向唯一值的指针,该值表示客户端对 对象的句柄。 如果拒绝访问,系统将忽略此值。

[in] ClientToken

表示请求操作的客户端的令牌对象的句柄。 必须通过通信会话层(例如本地命名管道)获取此句柄,以防止可能发生的安全策略冲突。 调用方必须对指定令牌具有TOKEN_QUERY访问权限。

[in] ObjectTypeName

指向以 null 结尾的字符串的指针,该字符串指定要创建或访问的对象的类型。 此字符串显示在函数生成的任何审核消息中。

[in, optional] ObjectName

指向以 null 结尾的字符串的指针,该字符串指定要创建或访问的对象的名称。 此字符串显示在函数生成的任何审核消息中。

[in] SecurityDescriptor

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

[in, optional] PrincipalSelfSid

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

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

[in] DesiredAccess

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

如果此参数MAXIMUM_ALLOWED,则函数在 GrantedAccess 中设置访问掩码,以指示安全描述符允许客户端的最大访问权限。

[in] AuditType

要生成的审核类型。 这可以是 AUDIT_EVENT_TYPE 枚举类型的值之一。

[in] Flags

一个标志,用于控制调用 进程 未启用SE_AUDIT_NAME特权时函数的行为。 如果设置了AUDIT_ALLOW_NO_PRIVILEGE标志,则函数在未启用权限时执行访问检查而不生成审核消息。 如果此参数为零,则如果未启用权限,则函数将失败。

[in, out, optional] ObjectTypeList

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

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

[in] ObjectTypeListLength

ObjectTypeList 数组中的元素数。

[in] GenericMapping

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

[in] ObjectCreation

一个标志,用于确定在授予访问权限时调用应用程序是否将创建新对象。 值为 TRUE 表示应用程序将创建新对象。 值为 FALSE 表示应用程序将打开现有对象。

GrantedAccessList

[out] AccessStatusList

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

[out] pfGenerateOnClose

指向函数返回时由审核生成例程设置的标志的指针。 关闭对象句柄时,将此标志传递给 ObjectCloseAuditAlarm 函数。

返回值

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

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

注解

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

AccessCheckByTypeResultListAndAuditAlarm 一样, AccessCheckByTypeResultListAndAuditAlarmByHandle 函数是 AccessCheckByTypeResultListAccessCheckAndAuditAlarm 函数的组合。 但是, AccessCheckByTypeResultListAndAuditAlarmByHandle 还需要客户端令牌句柄来提供客户端上的安全信息。

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

AccessCheckByTypeResultListAndAuditAlarmByHandle 函数计算应用于对象本身的 ACE,以及 ObjectTypeList 数组中列出的对象类型特定于对象的 ACE。 对于 ObjectTypeList 数组中未列出的对象类型,函数将忽略特定于对象的 ACE。

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

若要在安全事件日志中生成审核消息,调用进程必须启用SE_AUDIT_NAME特权。 系统会在调用进程 的主令牌 中检查此特权,而不是线程的 模拟令牌 。 如果 Flags 参数包含 AUDIT_ALLOW_NO_PRIVILEGE 标志,则函数在未启用权限时执行访问检查而不生成审核消息。

如果调用线程未模拟客户端, 则 AccessCheckByTypeResultListAndAuditAlarmByHandle 函数将失败。

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

要求

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

另请参阅

AUDIT_EVENT_TYPE
AccessCheck
AccessCheckAndAuditAlarm
AccessCheckByType
AccessCheckByTypeResultList
AccessCheckByTypeResultListAndAuditAlarm客户端/服务器访问控制
客户端/服务器访问控制函数
GENERIC_MAPPING
AccessCheck 的工作原理
MakeAbsoluteSD
MapGenericMask
OBJECT_TYPE_LIST
ObjectCloseAuditAlarm
PRIVILEGE_SET
SECURITY_DESCRIPTOR