AccessCheckByTypeAndAuditAlarmA 函数 (winbase.h)
AccessCheckByTypeAndAuditAlarm 函数确定安全描述符是否向调用线程模拟的客户端授予一组指定的访问权限。 函数可以检查客户端对对象层次结构(例如对象、其属性集和属性)的访问。 函数授予或拒绝对整个层次结构的访问权限。 如果安全描述符具有 一个系统访问控制列表 (SACL) ,其中包含适用于客户端的 访问控制项 (ACE) ,则函数会在安全事件日志中生成任何必要的审核消息。
目前不支持警报。
语法
BOOL AccessCheckByTypeAndAuditAlarmA(
[in] LPCSTR SubsystemName,
[in] LPVOID HandleId,
[in] LPCSTR ObjectTypeName,
[in, optional] LPCSTR 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,
[out] LPDWORD GrantedAccess,
[out] LPBOOL AccessStatus,
[out] LPBOOL pfGenerateOnClose
);
参数
[in] SubsystemName
指向以 null 结尾的字符串的指针,该字符串指定调用函数的子系统的名称。 此字符串显示在函数生成的任何审核消息中。
[in] HandleId
指向唯一值的指针,该值表示客户端对 对象的句柄。 如果拒绝访问,系统将忽略此值。
[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}。 如果对象类型列表无序, AccessCheckByTypeAndAuditAlarm 将失败, GetLastError 将返回ERROR_INVALID_PARAMETER。
[in] ObjectTypeListLength
ObjectTypeList 数组中的元素数。
[in] GenericMapping
指向与要检查其访问权限的对象关联的 GENERIC_MAPPING 结构的指针。
[in] ObjectCreation
一个标志,用于确定在授予访问权限时调用应用程序是否将创建新对象。 值为 TRUE 表示应用程序将创建新对象。 值为 FALSE 表示应用程序将打开现有对象。
[out] GrantedAccess
指向接收已授予访问权限的访问掩码的指针。 如果 AccessStatus 设置为 FALSE,则函数会将访问掩码设置为零。 如果函数失败,则不会设置访问掩码。
[out] AccessStatus
指向接收访问检查结果的变量的指针。 如果安全描述符允许对客户端的请求访问权限, 则 AccessStatus 设置为 TRUE。 否则, AccessStatus 设置为 FALSE ,你可以调用 GetLastError 以获取扩展的错误信息。
[out] pfGenerateOnClose
指向函数返回时由审核生成例程设置的标志的指针。 关闭对象句柄时,将此标志传递给 ObjectCloseAuditAlarm 函数。
返回值
如果函数成功,则函数返回非零值。
如果函数失败,则返回零。 要获得更多的错误信息,请调用 GetLastError。
注解
有关详细信息,请参阅 AccessCheck 的工作原理 概述。
如果 PrincipalSelfSid 和 ObjectTypeList 参数为 NULL, AuditType 参数为 AuditEventObjectAccess, Flags 参数为零, 则 AccessCheckByTypeAndAuditAlarm 的执行方式与 AccessCheckAndAuditAlarm 函数相同。
ObjectTypeList 数组不一定表示整个定义的对象。 相反,它表示要为其检查访问的对象子集。 例如,若要检查访问属性集中的两个属性,请指定具有四个元素的对象类型列表:对象本身位于级别 0、在级别 1 处设置的属性和级别 2 中的两个属性。
AccessCheckByTypeAndAuditAlarm 函数计算应用于对象本身的 ACE,以及 ObjectTypeList 数组中列出的对象类型特定于对象的 ACE。 对于 ObjectTypeList 数组中未列出的对象类型,函数将忽略特定于对象的 ACE。 因此, AccessStatus 参数中返回的结果指示允许访问 ObjectTypeList 参数定义的对象的子集,而不是整个对象。
有关 ACE 层次结构如何控制对对象及其子对象的访问的详细信息,请参阅 用于控制对对象属性的访问的 ACE。
若要在安全事件日志中生成审核消息,调用进程必须启用SE_AUDIT_NAME特权。 系统会在调用进程 的主令牌 中检查此特权,而不是线程的 模拟令牌 。 如果 Flags 参数包含 AUDIT_ALLOW_NO_PRIVILEGE 标志,则函数在未启用权限时执行访问检查而不生成审核消息。
如果调用线程未模拟客户端, 则 AccessCheckByTypeAndAuditAlarm 函数将失败。
如果安全描述符不包含所有者和组 SID, AccessCheckByTypeAndAuditAlarm 将失败并ERROR_INVALID_SECURITY_DESCR。
要求
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | winbase.h (包括 Windows.h) |
Library | Advapi32.lib |
DLL | Advapi32.dll |