离线域凭证下LookupAccountName/LsaLookupNames调用失败问题排查
Windows 10 Credential Provider离线域账户SID查询故障分析
故障场景
- 已加入域的Windows 10设备同时存在本地账户与域账户
- 设备处于离线或无法连接域控制器状态
- 目标域用户曾在此设备登录过,凭证已缓存
- 调用
LookupAccountName或LsaLookupNames2时返回ERROR_TRUSTED_RELATIONSHIP_FAILURE(0x6FD)错误
异常现象
本地账户登录后,通过「Run As」以域用户身份运行程序,后续即使在本地用户上下文调用上述API,也能成功查询该域用户SID,此状态持续至设备重启。
问题解答
1. 无需域用户预登录的离线域账户SID查询方法
方法一:读取本地注册表缓存
Windows会将已登录过的用户配置文件信息存储在注册表中,可直接读取:
- 访问注册表路径
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList,每个子项的名称即为用户SID; - 通过子项内的
ProfileImagePath值判断是否为目标域用户(路径通常包含域名\用户名格式)。
方法二:调用LsaLookupNames2并指定本地查询标志
调用LsaLookupNames2时,在LSA_LOOKUP_NAMES2结构体中设置LSA_LOOKUP_FLAGS_LOCAL_ONLY标志,强制系统仅从本地安全数据库查询,避免尝试连接域控制器。该标志适用于Windows Vista及以上版本,前提是目标域用户的凭证已被本地缓存。
方法三:WMI查询用户配置文件
使用WMI查询Win32_UserProfile类,筛选Special属性为False且LocalPath包含域名的条目,对应的SID属性即为目标域用户的SID。
2. 「Run As」操作使API恢复正常的原因
当执行「Run As」以域用户身份运行程序时,系统会触发本地缓存域账户的内存加载:
- 系统从本地SAM数据库和缓存的域凭证中读取该用户的完整身份信息(包括SID、组权限等),并将其存入内存级的安全上下文缓存;
- 后续在本地用户上下文调用
LookupAccountName或LsaLookupNames2时,系统会优先检查内存缓存,直接返回已加载的SID,无需尝试联系域控制器,因此不会出现信任关系失败错误; - 该内存缓存仅在系统运行期间有效,重启后缓存被清空,API调用会回到初始故障状态。
内容的提问来源于stack exchange,提问作者Greg D
相关产品推荐
相关产品推荐

