Как отобразить ICredentialProviderCredentialv2 более чем на одной пользовательской плитке на другой пользовательской плитке

Я пытаюсь разработать Credentialprovider v2. Я экспериментирую с samplecredentialproviderv2, предоставленным Microsoft. После установки распространяемого пакета 2013 и компиляции для правильной архитектуры я зарегистрировал его, и он заработал.

Моя проблема в том, что это работает только на первой показанной пользовательской плитке. Если я перечисляю более одной пользовательской плитки, она либо отображается только в одной пользовательской плитке, либо возникает ошибка и уничтожается мой пользовательский интерфейс входа в систему.

Я знаю, что вопрос очень похож на этот one . Здесь я могу сказать, что пробовал решение, изложенное в упомянутом документе Microsoft. Существует функция, которая указывает, отображается ли плитка «другой пользователь», и эта функция работает достаточно хорошо. Единственное, что else if не сработает, потому что, если вы получите легальную плитку, getSid не доберется до else if. Таким образом, если вы вернете в getSid нулевой sid и hr_false, CredentialProvider будет показан другой пользовательской плиткой, но в этом случае не будет показан везде. Если это решение жестко запрограммировано. Я пытался создать более одного ICredentialProviderCredential, чтобы у меня был список интерфейсов, но это не сработало.

В документе, представленном здесь, говорится следующее: "• v2 поставщики учетных данных должны реализовывать интерфейс ICredentialProviderCredential2 и возвращать действительный SID в функции GetUserSID. Это сообщает Windows, с какими пользователями должен быть связан поставщик».

Моя проблема в том, как вернуть более одного Sid в функцию GetUserSid. Было бы здорово, если бы вы могли помочь.


person Khalidjian    schedule 06.07.2015    source источник


Ответы (1)


В ICredentialProvider::GetCredentialCount() вы возвращаете количество плиток учетных данных (по одной на пользователя), которое предоставит ваш поставщик учетных данных (поставщик учетных данных может узнать, сколько пользователей существует, из пользовательского массива, переданного в SetUserArray() ). Возвращайте другой экземпляр ICredentialProviderCredential2 в ответ на каждый вход в систему ICredentialProvider::GetCredentialAt(), и каждый из этих экземпляров возвращает другой SID в ответ на GetUserSID(). Затем каждый из ваших учетных данных должен быть связан с другим пользователем при входе в систему.

person Phil Sturges    schedule 06.07.2015
comment
Спасибо, Фил, это кажется очевидным после того, как я проверил свой журнал. Поэтому я отмечаю это как решенное. - person Khalidjian; 23.07.2015
comment
@Khalidjian У меня точно такая же проблема: мой CP v2 отображается только для учетной записи локального администратора. Не могли бы вы предоставить код, который вы реализовали, с помощью, поскольку я новичок в C++? Огромное спасибо - person StehtimSchilf; 05.04.2017
comment
@StehtimSchilf Мне жаль, что я не могу предоставить пример кода, потому что проект разработан слишком далеко от чистого поставщика учетных данных, поэтому я боюсь, что это будет очень запутанно, если я опубликую пример кода. - person Khalidjian; 10.08.2017
comment
@StehtimSchilf Я собираюсь дать вам подсказку в заголовке вашего провайдера, который является закрытым членом типа CSampleCredential, если вы используете пример Microsoft. Я изменил его на: std::vector<CSampleCredential> _pCredentialVector; // SampleV2Credential Таким образом, вы можете создать учетные данные для каждого отображаемого пользователя. - person Khalidjian; 10.08.2017