我正在开发一个 Windows 10 凭据提供程序,它仅在(当前登录用户的)解锁场景中起作用。如所述here ,从Windows 10开始,合并了CPUS_LOGON和CPUS_UNLOCK_WORKSTATION用户场景。需要枚举当前登录系统的用户的凭据提供程序可以跟踪当前用户或利用 WTSQuerySessionInformation 等 API 来获取该信息。
使用 WTSQuerySessionInformation ,我可以获得当前登录用户的用户名 (WTSUserName)。登录时,系统调用 ICredentialProviderSetUserArray::SetUserArray在登录 UI 的初始化期间检索要在 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 帐户上进行测试。
最佳答案
我通过比较 SID 而不是用户名和域来解决这个问题。可以使用 LookupAccountName 检索 SID使用当前锁定用户的用户名和域(使用 WTSQuerySessionInformation 查询 WTSUserName 和 WTSDomainName)。 This example code来自 Microsoft 的帮助非常大。
然后在遍历凭据提供程序用户时(在 ICredentialProviderSetUserArray::SetUserArray 函数中),我可以检测到哪个是当前锁定的用户。感谢@Swift 指出解决方案。
关于c++ - 在 Windows 10 凭据提供程序中获取当前锁定 session 的用户名(Microsoft 帐户与本地)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41482189/