6

我正在开发一个自定义凭据提供程序,并且需要在运行时知道场景是登录还是解锁会话。为此,我检查了ICredentialProvider 接口的SetUsageScenario返回的CREDENTIAL_PROVIDER_USAGE_SCENARIO 。

在 Windows 10 上,如果我正在登录或会​​话被锁定,我总是将 CPUS_LOGON 作为使用场景,而在以前的 Windows 版本上,当会话被锁定时返回 CPUS_UNLOCK_WORKSTATION 并在登录时返回 CPUS_LOGON。

因此,似乎自 Windows 10 以来出现了 MSDN 上未报告的更改。

有没有其他方法可以检测使用场景是否是会话锁定?

4

4 回答 4

7

我目前正在调查相同的问题,并且可能会在 Microsoft 可以更新文档之前解决。

虽然我仍然收到 CPUS_LOGON,但我们仍然与锁定用户在同一个会话中。通过使用函数WTSQuerySessionInformationW,您可以验证当前是否有用户登录到当前会话。从那里,您可以像在 CPUS_UNLOCK_WORKSTATION 使用场景中一样继续操作。

更新(2016 年 1 月 18 日):微软似乎终于更新了他们关于这个问题的文档。请参阅CREDENTIAL_PROVIDER_USAGE_SCENARIO文档的以下摘录:

从 Windows 10 开始, 已将用户方案CPUS_LOGON和用户方案相结合。CPUS_UNLOCK_WORKSTATION这使系统能够支持多个用户登录到一台机器,而无需创建和切换会话。机器上的任何用户都可以在锁定后登录,而无需退出当前会话并创建新会话。因此,它CPUS_LOGON既可用于登录系统,也可用于解锁工作站。但是, CPUS_LOGON不能在所有情况下都使用。由于各种系统的政策限制,有时需要对用户场景进行CPUS_UNLOCK_WORKSTATION. 您的凭据提供程序应该足够健壮,可以根据给定的场景创建适当的凭据结构。Windows 将根据情况请求适当的用户方案。影响是否CPUS_UNLOCK_WORKSTATION必须使用方案的一些因素包括以下内容。请注意,这只是可能性的一个子集。

  • 设备的操作系统。
  • 这是控制台还是远程会话。
  • 组策略,例如隐藏快速用户切换的入口点,或不显示用户姓氏的交互式登录。

需要枚举当前登录到系统的用户作为默认磁贴的凭据提供程序可以跟踪当前用户或利用 API WTSQuerySessionInformation来获取该信息

于 2015-11-10T16:23:45.323 回答
1

如果您关闭快速用户切换,您将在锁定时收到 CPUS_UNLOCK_WORKSTATION 消息。否则你只会收到 CPUS_LOGON。如果您使用代码中的 Windows API 调用手动锁定 PC,以在打开快速用户开关的情况下锁定,它将锁定发送 CPUS_UNLOCK_WORKSTATION,然后立即注销发送 CPUS_LOGON。我希望这会有所帮助,我没有要发布的声誉分数我自己的答案,所以我编辑了这个评论。

于 2019-01-24T17:52:30.147 回答
0

您可以尝试 SENS(系统事件通知服务)。这是 Microsoft 提供的通知服务。

https://msdn.microsoft.com/en-us/library/windows/desktop/cc185680(v=vs.85).aspx

它具有用于登录/注销和屏幕锁定/解锁通知的不同事件。它使用 COM+ 接口。我不熟悉凭证提供者的要求,因此我不知道该服务是否会在您需要的上下文中运行,或者事件到达的时间是否会满足您的需求,但您可能会对此进行调查。

于 2015-09-11T12:13:48.530 回答
0

在所有答案中,贾斯汀的答案信息量更大,但没有人提供解决方法来正确恢复 Windows7 的行为。斯科特的回答提到关闭快速用户切换,但这会关闭 Windows7 中可用的功能,使其不是一个合适的解决方法。在仔细阅读了所有可用信息并多次尝试后,我发现以下策略只允许以前登录的用户解锁机器,从而强制 LogonUI 框架发出CPUS_UNLOCK_WORKSTATION场景,但仍然允许快速用户切换:

Windows Registry Editor Version 5.00

; Computer Configuration -> Windows Settings -> Security Settings ->
; Local Policies -> Security Options "Interactive logon: Do not display last user name"
; Set to "Enabled": asks to unlock the machine only to currently logged user
; https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/interactive-logon-do-not-display-last-user-name
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"dontdisplaylastusername"=dword:00000001

; Computer Configuration -> Administrative Templates -> Windows Components ->
; Windows Logon Options -> "Sign-in last interactive user automatically after a system-initiated restart"
; Set to "Enabled": Prevents last signed user to log in and lock automatically
; after a restart
; https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/manage/component-updates/winlogon-automatic-restart-sign-on--arso-
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableAutomaticRestartSignOn"=dword:00000001

; Similar in bevahior to "dontdisplaylastusername" but also disables Fast User
; Switching, which was available in Windows7
; https://docs.microsoft.com/en-us/windows/client-management/mdm/policy-csp-windowslogon#windowslogon-hidefastuserswitching
;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
;"HideFastUserSwitching"=dword:00000001
于 2020-09-18T17:45:00.140 回答