Msv1_0SubAuthenticationFilter 函数 (subauth.h)

Msv1_0SubAuthenticationFilter 函数执行特定于域控制器的用户登录身份验证。

函数接收用户的登录数据和在域控制器 的安全帐户管理器 (SAM) 数据库中为用户找到的所有信息。

此函数由自定义子身份验证包 DLL 实现,用于 Kerberos 和MSV1_0身份验证包。

语法

NTSTATUS Msv1_0SubAuthenticationFilter(
  [in]  NETLOGON_LOGON_INFO_CLASS LogonLevel,
  [in]  PVOID                     LogonInformation,
  [in]  ULONG                     Flags,
  [in]  PUSER_ALL_INFORMATION     UserAll,
  [out] PULONG                    WhichFields,
  [out] PULONG                    UserFlags,
  [out] PBOOLEAN                  Authoritative,
  [out] PLARGE_INTEGER            LogoffTime,
  [out] PLARGE_INTEGER            KickoffTime
);

参数

[in] LogonLevel

指定 LogonInformation 中给定的信息级别。 此参数通常设置为 NetlogonInteractiveInformation。

[in] LogonInformation

指向 NETLOGON_LOGON_IDENTITY_INFO 结构的指针。 此结构的成员包含有关登录用户的信息。 LogonDomainName 成员将被忽略。

[in] Flags

可选。 包含描述登录情况的标志。 此参数的取值可为下列值之一:

含义
MSV1_0_PASSTHRU
直通身份验证。 用户未连接到此计算机。
MSV1_0_GUEST_LOGON
这是使用来宾帐户进行登录的重试。

[in] UserAll

指向 USER_ALL_INFORMATION 结构的指针,该结构包含从 SAM 数据库返回的用户说明。

[out] WhichFields

返回需要写回到 SAM 数据库的 USER_ALL_INFORMATION 结构的成员。 仅当 Msv1_0SubAuthenticationFilter 返回成功时,才会写入这些成员。 只有以下值有效。

含义
USER_ALL_PARAMETERS
UserAll 结构的 Parameters 成员中包含的数据写回到 SAM 数据库。

如果 Parameters 成员 UNICODE_STRING 缓冲区的大小发生更改, Msv1_0SubAuthenticationFilter 必须使用 MIDL_user_free 函数删除缓冲区,并使用 MIDL_user_allocate 函数重新分配该 缓冲区

[out] UserFlags

要从该函数的 ProfileBuffer 参数中的 LsaLogonUser 函数返回的值。 此参数的取值可为下列值之一:

含义
LOGON_GUEST
这是来宾登录。
LOGON_NOENCRYPTION
调用方未指定加密凭据。
 
注意 按照约定,子身份验证包仅返回 UserFlags 参数的高阶字节中的位。
 

[out] Authoritative

指向布尔值的指针,该值指示返回的状态是否为应返回给原始调用方的权威状态。 如果返回的值为 FALSE,则可以在另一个域控制器上再次尝试登录请求。 无论函数调用的返回值如何,此参数都应返回有效信息。 此参数不与 Kerberos 身份验证包一起使用。

[out] LogoffTime

指向一个值的指针,该值接收用户应注销系统的时间。 此时间用于控制登录生存期,并指定为相对于 GMT 的 Windows 系统时间。

[out] KickoffTime

指向值的指针,该值接收用户应从系统注销的时间。 此时间用于控制登录生存期,并指定为相对于 GMT 的系统时间。 如果用户不自动注销,请指定较大的正值,如下所示:

KickoffTime->HighPart = 0x7FFFFFFF;
KickoffTime->LowPart = 0xFFFFFFFF;

返回值

此函数必须返回以下值之一。

返回代码 说明
STATUS_SUCCESS
没有错误。
STATUS_ACCOUNT_DISABLED
帐户已禁用。
STATUS_ACCOUNT_EXPIRED
帐户已过期。
STATUS_ACCOUNT_LOCKED_OUT
帐户已锁定。
STATUS_INVALID_INFO_CLASS
LogonLevel 无效。
STATUS_INVALID_LOGON_HOURS
用户目前无权登录。
STATUS_INVALID_WORKSTATION
用户无权登录到指定的工作站。
STATUS_NO_SUCH_USER
指定的用户没有帐户。
STATUS_PASSWORD_EXPIRED
密码已过期。
STATUS_PASSWORD_MUST_CHANGE
密码必须在下次登录时更改。
STATUS_WRONG_PASSWORD
密码无效。
 

Msv1_0SubAuthenticationFilter 函数与 Kerberos 身份验证包一起使用时,如果函数调用返回STATUS_SUCCESS并且两个参数之一 LogoffTimeKickoffTime 具有非零值,则此值将用作票证生存期。 另一方面,如果两个参数的值为非零值,则使用这两个值中的较小值。

如果用于票证生存期的值 (LogoffTimeKickoffTime) 的最快时间大于默认票证生存期,则该值将用作票证的最长续订时间。 相反,如果两个值中的较大值 (LogoffTimeKickoffTime) 的后期小于默认票证生存期,则此值将用作票证生存期。 有关详细信息,请参阅 Microsoft Kerberos

与 Kerberos 身份验证包一起使用时,如果此函数返回错误, 密钥分发中心 (KDC) 将返回 Kerberos 错误KDC_ERR_POLICY,状态值作为扩展错误代码。

注解

此函数的实现不应执行导致 轻型目录访问协议 (LDAP) 流量的任何操作。 例如,不要连接到 Active Directory 数据库并对其进行查询。

MSV1_0或 Kerberos 身份验证包验证登录后, Msv1_0SubAuthenticationFilter 函数可以执行其他验证,以确定用户是否可以登录到网络帐户。 如果在域控制器的注册表中将子身份验证包 DLL 正确注册为“Auth0”,则调用此函数。 注册表路径会有所不同,具体取决于函数是位于 MSV1_0 还是 Kerberos 子身份验证包 DLL 中。

此筛选器例程可能会返回STATUS_SUCCESS(指示应继续登录)或失败代码(指示其他验证失败)。

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 subauth.h