Я пытаюсь написать собственный поставщик учетных данных Windows. Я скачал Образец провайдера учетных данных V2 и я могу построить, зарегистрировать и использовать его.
Для тестирования я установил экземпляр Windows 8.1 hyper-v и присоединился к Windows.
тестовый домен.
Однако пользовательский поставщик учетных данных отображается только на плитках пользователя, а не на плитке «Другой пользователь».
Документация (Изменения в структуре провайдера учетных данных в Windows 8.docx)
предоставляет небольшой фрагмент:
// Gets the SID of the user corresponding to the credential. HRESULT CSampleCredential::GetUserSid(__deref_out PWSTR *ppszSid)
{
*ppszSid = nullptr;
HRESULT hr = E_UNEXPECTED;
// _pszUserSid is a private member of CSampleCredential
if (_pszUserSid != nullptr)
{
// ppszSid will be freed by Logon UI
hr = SHStrDupW(_pszUserSid, ppszSid);
}
// Return S_FALSE with a null SID in ppszSid for the
// credential to be associated with an anonymous user tile.
else if (_fIsOtherUserTile)
{
hr = S_FALSE;
}
return hr;
}
Я не уверен, откуда приходит _fIsOtherUserTile. Если я игнорирую это
и просто установите для hr значение S_FALSE, поставщик учетных данных все еще не отображается на
плитка «Другой пользователь».
Что мне не хватает? Что мне нужно изменить, чтобы я мог использовать провайдер учетных данных на плитке «Другой пользователь»?
Обычно я занимаюсь веб-проектами, поэтому у меня мало опыта работы с Windows SDK.
Если вы используете пример, он всегда инициализирует SID в функции Initialize, поэтому этот код всегда копирует SID в указатель возврата функции, независимо от того, что вы делаете потом (_pszUserSid! = Nullptr всегда истинно в примере ). Если вы хотите иметь эту функцию и показывать свой CP в разделе «Другой пользователь», то тело должно быть не более чем:
*ppszSid = nullptr;
return S_FALSE;
Если вы не хотите, чтобы ваша плитка была привязана к пользователю, вам вообще не нужно реализовывать ICredentialProviderCredential2, поскольку она только добавляет эту функцию. Без этого интерфейса ваш CP всегда будет отображаться в разделе «Другой пользователь». Для этого достаточно реализации ICredentialProviderCredential.