Запрос учетных данных пользователя

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

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

Правильное получение учетных данных пользователя

  1. Сообщите пользователю с помощью сообщения, которое явно является частью вашего приложения, что он увидит диалоговое окно с запросом имени пользователя и пароля. Вы также можете использовать структуру CREDUI_INFO при вызове CredUIPromptForCredentials для передачи идентифицирующие данные или сообщение.
  2. Вызовите CredUIPromptForCredentials. Обратите внимание, что максимальное число символов, указанное для имени пользователя и пароля, включает завершающий символ NULL.
  3. Вызовите CredUIParseUserName и CredUIConfirmCredentials, чтобы убедиться , что вы получили соответствующие учетные данные.

В следующем примере показано, как вызвать CredUIPromptForCredentials , чтобы запросить у пользователя имя пользователя и пароль. Она начинается с заполнения структуры CREDUI_INFO информацией о том, какие запросы следует использовать. Затем код заполняет два буфера нулями. Это делается для того, чтобы гарантировать, что в функцию не передаются сведения, которые могут показать пользователю старое имя пользователя или пароль. Вызов CredUIPromptForCredentials открывает диалоговое окно. По соображениям безопасности в этом примере используется флаг CREDUI_FLAGS_DO_NOT_PERSIST, чтобы предотвратить хранение пароля операционной системой, так как он может быть предоставлен. Если ошибок нет, CredUIPromptForCredentials заполняет переменные pszName и pszPwd и возвращает ноль. Когда приложение завершит использование учетных данных, оно должно поместить нули в буферы, чтобы предотвратить случайное раскрытие информации.

CREDUI_INFO cui;
TCHAR pszName[CREDUI_MAX_USERNAME_LENGTH+1];
TCHAR pszPwd[CREDUI_MAX_PASSWORD_LENGTH+1];
BOOL fSave;
DWORD dwErr;
 
cui.cbSize = sizeof(CREDUI_INFO);
cui.hwndParent = NULL;
//  Ensure that MessageText and CaptionText identify what credentials
//  to use and which application requires them.
cui.pszMessageText = TEXT("Enter administrator account information");
cui.pszCaptionText = TEXT("CredUITest");
cui.hbmBanner = NULL;
fSave = FALSE;
SecureZeroMemory(pszName, sizeof(pszName));
SecureZeroMemory(pszPwd, sizeof(pszPwd));
dwErr = CredUIPromptForCredentials( 
    &cui,                         // CREDUI_INFO structure
    TEXT("TheServer"),            // Target for credentials
                                  //   (usually a server)
    NULL,                         // Reserved
    0,                            // Reason
    pszName,                      // User name
    CREDUI_MAX_USERNAME_LENGTH+1, // Max number of char for user name
    pszPwd,                       // Password
    CREDUI_MAX_PASSWORD_LENGTH+1, // Max number of char for password
    &fSave,                       // State of save check box
    CREDUI_FLAGS_GENERIC_CREDENTIALS |  // flags
    CREDUI_FLAGS_ALWAYS_SHOW_UI |
    CREDUI_FLAGS_DO_NOT_PERSIST);  

if(!dwErr)
{
    //  Put code that uses the credentials here.
 
    //  When you have finished using the credentials,
    //  erase them from memory.
    SecureZeroMemory(pszName, sizeof(pszName));
    SecureZeroMemory(pszPwd, sizeof(pszPwd));
}

CredUICmdLinePromptForCredentials

CREDUI_UINFO