You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

离线时使用LsaLogonUser预验证用户的问题排查

解决AzureAD账户离线预验证失败的问题

核心问题定位

你当前的问题根源在于认证包选型错误和LSA连接权限不足:

  • MSV1_0_PACKAGE_NAME仅负责本地账户/域账户的验证逻辑,不支持AzureAD离线缓存凭据的校验;
  • LsaConnectUntrusted建立的是非信任连接,无法访问CloudAP所需的本地AAD缓存数据。

具体解决步骤

1. 切换到CloudAP认证包

AzureAD账户的在线/离线验证依赖CloudAP认证包,替换原有的MSV1_0_PACKAGE_NAME为CLOUDAP_PACKAGE_NAME。

2. 使用LsaConnectLocal建立信任连接

替换LsaConnectUntrusted为LsaConnectLocal,该函数会建立本地信任的LSA连接,System权限下可正常调用,能访问本地缓存的AAD凭据数据:

NTSTATUS status = LsaConnectLocal(&hLsa, 0, 0);
if (!NT_SUCCESS(status)) {
    // 处理连接失败逻辑
}

3. 构造CloudAP专属登录结构体

使用CLOUDAP_INTERACTIVE_LOGON结构体,指定离线验证标志,填充完整UPN格式的用户名:

CLOUDAP_INTERACTIVE_LOGON logonData = {0};
logonData.MessageType = CloudAPInteractiveLogon;
wcscpy_s(logonData.UserName, L"user@your-tenant.onmicrosoft.com"); // 必须是完整UPN
wcscpy_s(logonData.Password, L"user-password");
logonData.LogonFlags = CLOUDAP_LOGON_FLAG_OFFLINE; // 强制触发离线验证逻辑

4. 调用LsaLogonUser时配置正确参数

登录类型使用SECURITY_LOGON_TYPE::Interactive或CachedInteractive,传入CloudAP的认证包ID和构造好的结构体:

status = LsaLogonUser(
    hLsa,
    &logonId,
    (PLSA_STRING)&logonData,
    Interactive, // 或CachedInteractive
    cloudApPackageId, // 通过LsaLookupAuthenticationPackage获取CloudAP的包ID
    &profileBuffer,
    &profileLength,
    &sid,
    &attributes,
    &token
);

5. 验证前提条件

确保目标AzureAD用户至少成功在线登录过一次——系统仅会缓存已成功在线登录用户的凭据,无缓存时离线验证必然失败。

常见错误排查

  • 返回1326(用户名/密码错误):检查UPN格式是否正确、离线标志是否设置、用户是否存在本地缓存凭据;
  • 返回登录类型不支持:确认使用的是CloudAP包而非MSV1_0,且登录类型为Interactive/CachedInteractive;
  • LsaConnectLocal调用失败:System权限下不应出现此问题,排查是否有额外安全策略限制。

内容的提问来源于stack exchange,提问作者Joseph Willcoxson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:03:18