我写了一个自定义的CredentialProvider,用于监听通过蓝牙发送的事件。到目前为止一切正常。除了发送事件后登录屏幕发生变化并在用户名下方显示“登录”按钮这一事实。正如this SO-question的答案所述,我确实遵循以下方式实现自动登录:
HRESULT CMobileCredential2::SetSelected(_Out_ BOOL *pbAutoLogon)
{
LOG_FUNCTION;
*pbAutoLogon = true;
return S_OK;
}
并在事件处理代码我打电话:
HRESULT hr = _pcpe->CredentialsChanged(_upAdviseContext);
if (S_OK != hr)
{
LOG_ERROR("Could not login!");
}
我认为当我将自动登录设置为true时,LogonUI会自动登录我吗?为什么我要点击另一个按钮?有什么方法可以避免这种行为吗?
编辑:
以下内容可在Microsoft的“凭据提供程序技术参考”中找到:
在Windows 10中,如果凭据提供程序想要对我们认为可能不合适的用户进行自动登录,我们将绘制“登录”按钮作为减速带。
我认为这是我在这里打的点,但是什么是不合适的?使用的密码包括小写和大写字符以及一些数字。是否有任何可能来解决这个问题?
搜索了几天之后,我在微软论坛中偶然发现了this answer,其中包含了解决方案。
看起来,当pbAutoLogon
在SetSelected(_Out_ BOOL *pbAutoLogon)
中设置为true时,Windows不信任自定义凭证足以绕过这个“减速带”。但是它信任自定义提供程序,因此将pbAutoLogonWithDefault
设置为true
GetCredentialCount(
_Out_ DWORD *pdwCount,
_Out_ DWORD *pdwDefault,
_Out_ BOOL *pbAutoLogonWithDefault)
似乎可以解决问题,因为在调用之前总是调用GetCredentialCount
GetSerialization(_Out_ CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr,
_Out_ CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs,
_Outptr_result_maybenull_ PWSTR *ppwszOptionalStatusText,
_Out_ CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon)
自定义凭据。