CredUIPromptForCredentials, заставляющий ручной выбор имени пользователя - PullRequest
4 голосов
/ 28 февраля 2012

Я использую CredUIPromptForCredentials , чтобы запросить у пользователя учетные данные, которые затем передаются веб-службе.

В приглашении отображается параметр «Запомнить мой пароль», чтобы в имени пользователя и пароле могли использоваться ранее использованные значения.

Когда появляется приглашение и учетные данные предварительно заполнены, я не могу продолжить, пока не выберу имя пользователя из выпадающего списка.

Это экран, который я вижу:

enter image description here

Нажатие ОК ничего не делает, кроме как вызвать подсказку «Примеры», но если я выберу «Грег» вручную из раскрывающегося списка, я смогу продолжить.

Вот код, который я использую:

StringBuilder userPassword = new StringBuilder(), userID = new StringBuilder();
CREDUI_INFO credUI = new CREDUI_INFO();
credUI.cbSize = Marshal.SizeOf(credUI);
bool save = true;
CREDUI_FLAGS flags = CREDUI_FLAGS.ALWAYS_SHOW_UI | CREDUI_FLAGS.GENERIC_CREDENTIALS 
                    | CREDUI_FLAGS.SHOW_SAVE_CHECK_BOX ;

//Display password prompt:
CredUIReturnCodes returnCode = CredUIPromptForCredentials
    (ref credUI, this.serverName, IntPtr.Zero, 0, userID, 100, userPassword, 100, ref save, flags);

ОС - Windows 7 и Server 2008 r2.

Я создал полный, но простой пример приложения, которое можно загрузить с https://docs.google.com/open?id=0BxSAZ9JlU2w9VHZWWFBjVEhTNG02N1Q4WkFrUkhDUQ для тестирования.

Ответы [ 3 ]

5 голосов
/ 04 марта 2012

Я собирался попытаться ответить на ваш вопрос, но вы сами решили его слишком быстро.

Однако, читая документацию по CredUIPromptForCredentials , я замечаю, что вам рекомендуется использовать CredUIPromptForWindowsCredentials в Windows 7 и Server 2008.

В Googling вокруг я обнаружил эту превосходную бесплатную библиотеку классов , которая содержит обертки для нескольких нативных API, включая полный пример отображения диалога учетных данных с использованием API CredUIPromptForWindowsCredentials.

4 голосов
/ 02 марта 2012

Настройка save = false решает проблему.

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

0 голосов
/ 01 марта 2012

Полагаю, вы просто хотите установить идентификатор пользователя: userID = new StringBuilder("Greg")

Здесь есть реализация оболочки в c #: http://www.developerfusion.com/code/4693/using-the-credential-management-api/

Возможно, вам понадобится имя пользователя от Environment.UserName.

...