我正在开发一个 Windows 10 凭据提供程序,它仅在解锁场景(当前登录的用户)中起作用。如此处所述,从 Windows 10 开始,CPUS_LOGON 和 CPUS_UNLOCK_WORKSTATION 用户方案已合并。需要枚举当前登录到系统的用户的凭据提供程序可以跟踪当前用户或利用 API(如 WTSQuerySessionInformation)来获取该信息。
使用WTSQuerySessionInformation,我可以获得当前登录用户的用户名(WTSUserName)。在登录时,系统在登录 UI 的初始化期间调用ICredentialProviderSetUserArray::SetUserArray以检索要在 UI 中显示的用户集。凭证提供者用户 ( ICredentialProviderUser ) 可以从ICredentialProviderUserArray接口检索,我们可以查询每个用户的用户名(通过查询字符串值PKEY_Identity_UserName)。通过比较 WTSQuerySessionInformation 中的用户名和 PKEY_Identity_UserName 返回的用户名,我可以知道哪个用户是最后一个当前锁定的用户。(可能有多个帐户PKEY_Identity_LogonStatusString设置为“锁定”)。
这适用于未使用 Microsoft 帐户登录的本地帐户。对于以 Microsoft 帐户登录的用户,WTSQuerySessionInformation 返回的用户名与 PKEY_Identity_UserName 给出的用户名不同。
对于以“my_user_microsoft@myemail.com”身份登录的用户,我得到以下不匹配。
使用 WTSQuerySessionInformation,我得到当前锁定用户的用户名:
用户名:my_us
PKEY_Identity_UserName 返回的那个很好:
用户名:my_user_microsoft@myemail.com
合格用户名:MicrosoftAccount\my_user_microsoft@myemail.com
WTSQuerySessionInformation 返回的用户名被截断并且不报告完整的电子邮件地址,因此在枚举用户时不允许我与其他用户名进行比较。
知道为什么以这种方式裁剪用户名吗?有没有办法使用 WTSQuerySessionInformation 获取完整的用户名?此行为已在新创建的 Microsoft 帐户上进行了测试。