我正在开发自定义凭据提供程序,并且需要在运行时知道该方案是登录还是解锁会话。为此,我检查ICredentialProvider接口的CREDENTIAL_PROVIDER_USAGE_SCENARIO返回的SetUsageScenario。
在Windows 10上,如果我在登录时或会话被锁定时独立,我总是将CPUS_LOGON作为使用场景,而在以前版本的Windows上,会话被锁定时CPUS_UNLOCK_WORKSTATION被返回,CPUS_LOGON在登录。
因此,似乎自Windows 10以来出现的更改未在MSDN上报告。
是否有其他方法可以检测使用方案是否已锁定会话?
答案 0 :(得分:6)
我目前正在调查相同的问题,可能需要解决,直到Microsoft可以更新文档。
虽然我仍然收到CPUS_LOGON,但我们仍然在与锁定用户相同的会话中。通过使用函数WTSQuerySessionInformationW,您可以验证当前是否有用户登录到当前会话。从那里,您可以像处于CPUS_UNLOCK_WORKSTATION使用场景一样继续。
更新(2016年1月18日):似乎Microsoft最终更新了有关此问题的文档。请参阅以下CREDENTIAL_PROVIDER_USAGE_SCENARIO文档中的摘录:
从Windows 10开始,
CPUS_LOGON
和CPUS_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