我正在开发一个Windows 10凭据提供程序,该提供程序仅在解锁方案(当前已登录的用户)中起作用。如上所述here,从Windows 10开始,CPUS_LOGON和CPUS_UNLOCK_WORKSTATION用户方案已合并。需要枚举登录系统的当前用户的凭据提供程序可以跟踪当前用户或利用诸如WTSQuerySessionInformation之类的API来获取该信息。
使用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帐户上进行了测试。
答案 0 :(得分:1)
我通过比较SID而不是用户名和域来解决了这个问题。可以使用LookupAccountName使用当前锁定用户的用户名和域来检索SID(查询WTSUserName和带WTSQuerySessionInformation的WTSDomainName)。来自Microsoft的This example code非常有帮助。
然后在循环通过凭证提供者用户(在ICredentialProviderSetUserArray::SetUserArray函数中)时,我可以检测到哪个是当前锁定的用户。感谢@Swift指出我的解决方案。