通过事件的Windows CredentialProvider自动登录仍显示登录按钮

时间:2017-01-23 13:31:33

标签: c++ windows credential-providers

我写了一个自定义的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中,如果凭据提供程序想要自动登录用户   在我们认为可能不合适的地方,我们会画一个“登录”按钮   作为减速带。

我认为这就是我要点击的地方,但是什么是不合适的?使用的密码包括小写和大写字符以及一些数字。是否有可能对此进行解决?

1 个答案:

答案 0 :(得分:1)

搜索了几天之后,我偶然发现了包含解决方案的微软论坛中的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)

自定义凭证。