凭据提供程序使用方案:从Windows 10中删除了CPUS_UNLOCK_WORKSTATION

时间:2015-08-24 17:45:11

标签: c++ windows winapi credentials credential-providers

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

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

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

是否有其他方法可以检测使用方案是否已锁定会话?

4 个答案:

答案 0 :(得分:6)

我目前正在调查相同的问题,可能需要解决,直到Microsoft可以更新文档。

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

更新(2016年1月18日):似乎Microsoft最终更新了有关此问题的文档。请参阅以下CREDENTIAL_PROVIDER_USAGE_SCENARIO文档中的摘录:

  

从Windows 10开始,CPUS_LOGONCPUS_UNLOCK_WORKSTATION   用户场景已合并。这使系统能够支持   多个用户登录到计算机而无需创建和切换   会话不必要。机器上的任何用户都可以登录一次   它已被锁定,无需退出当前会话   并创建一个新的。因此,CPUS_LOGON可以同时使用   登录系统或工作站解锁时。然而,   CPUS_LOGON不能在所有情况下使用。由于政策限制   由各种系统强加的,有时对用户来说是必要的   方案为CPUS_UNLOCK_WORKSTATION。您的凭证提供商   应该足够强大,以创建适当的凭据结构   根据给出的情景。 Windows会请求   基于情况的适当用户场景。一些因素   这会影响CPUS_UNLOCK_WORKSTATION方案是否必须如此   使用包括以下内容。请注意,这只是其中的一个子集   可能性。

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

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

答案 1 :(得分:1)

如果关闭快速用户关闭功能,则锁定后将收到CPUS_UNLOCK_WORKSTATION消息。否则,您只会收到CPUS_LOGON。如果您使用Windows API调用从代码手动锁定PC并在打开快速用户开关的情况下进行锁定,它将锁定发送CPUS_UNLOCK_WORKSTATION的发送,然后立即注销发送CPUS_LOGON的发送。希望这对我没有帮助,我没有信誉评分我自己的答案,所以我编辑了此评论。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

在所有答案中,贾斯汀的答案是信息更丰富的答案,但是没有人提供适当恢复Windows7行为的解决方法。 Scott的答案提到关闭“快速用户切换”,但是这会关闭Windows7中可用的功能,因此这不是一个适当的解决方法。仔细阅读所有可用信息并进行几次尝试后,我发现以下策略仅允许先前登录的用户解锁计算机,从而迫使LogonUI框架发出CPUS_UNLOCK_WORKSTATION方案,但仍允许快速用户切换: / p>

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