向用户询问凭据

应用程序可能需要提示用户输入用户名和密码信息,以避免存储管理员密码或验证令牌是否具有适当的权限。

但是,仅提示输入凭据可能会训练用户将这些凭据提供给屏幕上显示的任何随机、未识别的对话框。 建议执行以下过程来降低训练效果。

正确获取用户凭据

  1. 通过使用明确属于应用程序的消息通知用户,他们将看到一个对话框,请求其用户名和密码。 还可以在调用 CredUIPromptForCredentials 时使用 CREDUI_INFO 结构来传达标识数据或消息。
  2. 调用 CredUIPromptForCredentials。 请注意,为用户名和密码信息指定的最大字符数包括终止 null 字符。
  3. 调用 CredUIParseUserNameCredUIConfirmCredentials 以验证是否获得了适当的凭据。

以下示例演示如何调用 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