凭据提供程序使用情况:从Windows 10中删除CPUS_UNLOCK_WORKSTATION

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

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

所以看起来,自从Windows 10上没有MSDN上报告的变化。

有没有其他的方法来检测使用场景是否locking会话?

我目前正在调查相同的问题,并可能有一个解决办法,直到微软可以更新文档。

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

更新(1/18/2016):看来微软终于在这个问题上更新了他们的文档。 请参阅以下摘自CREDENTIAL_PROVIDER_USAGE_SCENARIO文档的摘录:

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

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

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

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

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

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