如何在混合域计算机上获取 SAM 兼容域名?

问题描述

编辑: 感谢@RbMm 的澄清问题!

我正在凭证提供程序(不是包装提供程序)中实施 MFA。我必须支持的选项之一是验证用于登录计算机并与 MFA 提供程序验证相同的 UPN。我使用 LsalogonUser、ImpersonateLoggedOnUser 和 GetUserNameEx(UserNamePrincipal) 来获取此信息。这适用于大多数环境;但是,在连接到混合 Azure AD 域的计算机上,LsalogonUser 失败。这导致了一项调查,其结果详述如下:

我有一台计算机属于 AzureAD 混合域,但是我无法从 AzureAD 域名中获取与 SAM 兼容的域名。 例如, 我可以使用 AzureAD upn 为例如 user@domain.com 的用户登录。 SAM 兼容名称是 localdomain\localuser。 GetUserNameEx(NameUserPrincipal) 返回 user@domain.com GetUserNameEx(NameSamCompatible) 返回 localdomain\localuser 但是,在以下代码中,TranslateName 失败,GetLastError() 返回 ERROR_NO_SUCH_DOMAIN。

TCHAR validBuffer[MAX_PATH+1];
ULONG nValidSize = MAX_PATH;
TranslateName("user@domain.com",NameUserPrincipal,NameSamCompatible,validBuffer,&nValidSize);

我也尝试了以下 API 没有成功,它们都失败并返回不同的值:

  • GetComputerObjectName 因传递给 NameFormat 的任何值而失败

  • GetCompterNameEx 失败并显示 ERROR_CANT_ACCESS_DOMAIN_INFO 对于 NameType 的任何相关值

  • NetWkstaGetInfo 不会在任何字段中返回任何有用的信息

  • 此外,如果您在此电脑 > 属性 > 高级系统属性中查看计算机的加入信息,您会将其视为工作组的一部分,而不是域的一部分。 - 如果您运行 dsregcmd /status 命令:

    • 在上述用户登录会话中执行:“诊断”部分在输出中列出了本地域
    • 从使用 LocalSystem 帐户运行的命令提示符执行,输出不会在任何地方列出本地域。

重点(感谢@RbMm)- 使用“其他用户”磁贴时,代码为 Windows 凭据提供程序提供服务。我正在尝试使用 LsalogonUser 预先验证输入的凭据,然后在我的 ICredentialProviderCredential2::GetSerialization 实现中成功序列化它们。使用 'user@domain.com' 失败,而使用 'localdomain\user@domain.com' 或 'localdomain\localuser' 成功。使用 Windows 的内置密码提供程序登录时,当然可以使用“user@domain.com”。也许我应该为 LsalogonUser 使用不同的身份验证包?

我被难住了。

感谢任何人的帮助..

  • 乌里尔

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)