Fragen des Benutzers nach Anmeldeinformationen

Möglicherweise muss Ihre Anwendung den Benutzer zur Eingabe von Benutzernamen- und Kennwortinformationen auffordern, um das Speichern eines Administratorkennworts zu vermeiden oder zu überprüfen, ob das Token die entsprechenden Berechtigungen enthält.

Durch die einfache Aufforderung zur Eingabe von Anmeldeinformationen können Benutzer jedoch trainieren, diese für jedes zufällige, nicht identifizierte Dialogfeld bereitzustellen, das auf dem Bildschirm angezeigt wird. Das folgende Verfahren wird empfohlen, um diesen Trainingseffekt zu verringern.

So rufen Sie Benutzeranmeldeinformationen ordnungsgemäß ab

  1. Informieren Sie den Benutzer mithilfe einer Meldung, die eindeutig Teil Ihrer Anwendung ist, dass ein Dialogfeld angezeigt wird, das seinen Benutzernamen und sein Kennwort anfordert. Sie können auch die CREDUI_INFO-Struktur für den Aufruf von CredUIPromptForCredentials verwenden, um identifizierende Daten oder eine Nachricht zu übermitteln.
  2. Rufen Sie CredUIPromptForCredentials auf. Beachten Sie, dass die maximale Anzahl von Zeichen, die für Benutzernamen- und Kennwortinformationen angegeben sind, das beendende NULL-Zeichen enthält.
  3. Rufen Sie CredUIParseUserName und CredUIConfirmCredentials auf, um zu überprüfen, ob Sie die entsprechenden Anmeldeinformationen erhalten haben.

Im folgenden Beispiel wird gezeigt, wie Sie CredUIPromptForCredentials aufrufen, um den Benutzer nach einem Benutzernamen und einem Kennwort zu fragen. Sie beginnt mit dem Ausfüllen einer CREDUI_INFO-Struktur mit Informationen dazu, welche Aufforderungen verwendet werden sollen. Als Nächstes füllt der Code zwei Puffer mit Nullen. Dies geschieht, um sicherzustellen, dass keine Informationen an die Funktion übergeben werden, die dem Benutzer möglicherweise einen alten Benutzernamen oder ein altes Kennwort anzeigen. Durch den Aufruf von CredUIPromptForCredentials wird das Dialogfeld geöffnet. Aus Sicherheitsgründen wird in diesem Beispiel das Flag CREDUI_FLAGS_DO_NOT_PERSIST verwendet, um zu verhindern, dass das Betriebssystem das Kennwort speichert, da es dann möglicherweise verfügbar gemacht wird. Wenn keine Fehler vorhanden sind, füllt CredUIPromptForCredentials die Variablen pszName und pszPwd aus und gibt null zurück. Wenn die Anwendung die Anmeldeinformationen verwendet hat, sollte sie Nullen in die Puffer setzen, um zu verhindern, dass die Informationen versehentlich offengelegt werden.

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