Автоматический вход в Windows CredentialProvider через событие по-прежнему показывает кнопку входа

Я написал собственный CredentialProvider, прослушивающий события, отправленные через Bluetooth. Пока все работает нормально. За исключением того факта, что после отправки события экран входа в систему меняется и показывает единственную кнопку «Войти» под именем пользователя. Как указано в ответах на этот SO-вопрос, я сделал следующее для автоматического входа в систему:

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!");
}

Я думал, что LogonUI автоматически войдет в систему, если я установлю для автоматического входа значение true? Почему я должен нажимать на другую кнопку? Есть ли способ избежать такого поведения?

ИЗМЕНИТЬ:

Следующее можно найти в «Техническом справочнике поставщика учетных данных» от Microsoft:

В Windows 10, если поставщик учетных данных хочет выполнить автоматический вход пользователя в систему там, где мы считаем это неуместным, мы нарисуем кнопку «Войти» в виде «лежачего полицейского».

Я думаю, что это точка, которую я здесь затронул, но что неуместно? Используемый пароль состоит из символов нижнего и верхнего регистра, а также некоторых цифр. Есть ли возможность это обойти?


person Frank    schedule 23.01.2017    source источник


Ответы (1)


После нескольких дней поиска я наткнулся на этот ответ на форумах Microsoft, где содержится решение.

Похоже, Windows недостаточно доверяет пользовательским учетным данным, чтобы обойти этот «лежачий полицейский», когда для pbAutoLogon установлено значение true в SetSelected(_Out_ BOOL *pbAutoLogon). Однако он доверяет пользовательскому поставщику, поэтому установка 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)

пользовательских учетных данных.

person Frank    schedule 03.02.2017