【发布时间】:2022-08-08 22:03:31
【问题描述】:
我在用
WTSEnumerateSessionsEx(WTS_CURRENT_SERVER_HANDLE, &level, 0, &pSessionInfo, &count);
获取会话信息。它会告诉我所有登录的用户。如果我在其他用户登录的情况下在 Windows 11 上使用它,
WTS User: DESKTOP-VVVVVVV\\joew, session id: 1, state: 0, session name: Console
WTS User: AzureAD\\JoeWillcoxso_garbage, session id: 17, state: 4
从状态来看,joew 是活跃用户,JoeWillcoxso_garbage。不完全是这样,但我正在保护它……你明白了。
会话信息将为我提供域和用户名。当我使用非标准凭据提供程序登录到 AzureAD 的 Windows 时,我使用我的 AzureAD 电子邮件地址,并且 CP 足够聪明,可以使用 AzureAD 作为域名。但是,当机器加入 AzureAD 时,它为电子邮件地址创建了一个本地帐户,名为 JoeWillcoxso_garbage。 (我写了“创建了一个本地帐户”,但在 PowerShell 中,如果我写了get-localuser *,该用户不会出现在列表中。)
我可以使用LsaEnumerateLogonSessions() 和LsaGetLogonSessionData() 从本地安全机构获取会话数据。我可以使用会话 ID 和用户名匹配两个调用(LsaGetLogonSessionData 和 WTSEnumerateSessionsEx)之间的内容。但是,无法获取电子邮件地址。我可以在会话数据中获取 PSID,但不确定是否有办法将其转换为电子邮件地址。在我的本地机器上,我没有连接到 AD。只是作为 WORKGROUP 运行。
对于 AzureAD 用户,调用 NetUserGetInfo() 对于 AAD 用户总是会失败,即使在运行提升时也是如此。我还没有尝试作为 NT_AUTHORITY 帐户...
我正在寻找 API 或某种方式来查询 WMI 以将 AzureAD\\JoeWillcoxso_garbage 用户名转换为 joe@someaad.onmicrosoft.com 电子邮件地址。或者,可能需要一个 Web API 来访问 login.windows.net。注册表中有一些地方我可以找到电子邮件地址,但我不认为它们一定会一直存在。
由于用户可能已经登录(并且在具有快速切换功能的 Windows 10/11 上),有时解锁不是 CPUS_UNLOCK_WORKSTATION 而是 CPUS_LOGON。使用快速切换,如果我锁定,10 分钟后返回,然后解锁,这不是解锁而是登录 (CPUS_LOGON),尽管它的行为就像以前的解锁一样。
例如,在 HKEY_USERS\\THE_SID_OF_THE USER\\Software\\Microsoft\\Office\\Teams,HomeUserUpn 有电子邮件地址。我可以获得登录用户的 SID...所以我可以让电子邮件匹配...但是,假设密钥在那里。我想要一些更防弹的东西。
-
嗨@JosephWillcoxson,建议的解决方案对您有用吗?如果它解决了您的问题,请告诉我,否则请分享更多详细信息,以便我进行故障排除或接受它以帮助其他社区成员。
标签: winapi azure-active-directory credential-providers