离线时使用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
相关产品推荐
相关产品推荐

