Laden...

Windows Fenster für Benutzername und Passwort

Erstellt von AyrA vor 10 Jahren Letzter Beitrag vor 10 Jahren 7.292 Views
AyrA Themenstarter:in
60 Beiträge seit 2010
vor 10 Jahren
Windows Fenster für Benutzername und Passwort

Beschreibung:

Diese klasse erlaubt es das Zugangsdatenfenster anzuzeigen, das von Windows für diverse Aufgaben selbst verwendet wird (z.B. Netzlaufwerke verbinden)

Es muss lediglich die askCred Funktion ausgeführt werden. Sie gibt True bei Erfolg zurück. False bei Misserfolg (z.B. wenn der User auf Abbrechen klickt).
Name und Passwort werden als Cleartext in die Variablen geschrieben.


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ytBackup
{

    public static class PWD
    {
        [DllImport("credui")]
        private static extern CredUIReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO creditUR,string targetName,IntPtr reserved1,int iError,StringBuilder userName,int maxUserName,StringBuilder password,int maxPassword,[MarshalAs(UnmanagedType.Bool)] ref bool pfSave,CREDUI_FLAGS flags);

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        private struct CREDUI_INFO
        {
            public int cbSize;
            public IntPtr hwndParent;
            public string pszMessageText;
            public string pszCaptionText;
            public IntPtr hbmBanner;
        }
        
        [Flags]
        private enum CREDUI_FLAGS
        {
            INCORRECT_PASSWORD = 0x1,
            DO_NOT_PERSIST = 0x2,
            REQUEST_ADMINISTRATOR = 0x4,
            EXCLUDE_CERTIFICATES = 0x8,
            REQUIRE_CERTIFICATE = 0x10,
            SHOW_SAVE_CHECK_BOX = 0x40,
            ALWAYS_SHOW_UI = 0x80,
            REQUIRE_SMARTCARD = 0x100,
            PASSWORD_ONLY_OK = 0x200,
            VALIDATE_USERNAME = 0x400,
            COMPLETE_USERNAME = 0x800,
            PERSIST = 0x1000,
            SERVER_CREDENTIAL = 0x4000,
            EXPECT_CONFIRMATION = 0x20000,
            GENERIC_CREDENTIALS = 0x40000,
            USERNAME_TARGET_CREDENTIALS = 0x80000,
            KEEP_USERNAME = 0x100000,
        }

        private enum CredUIReturnCodes
        {
            NO_ERROR = 0,
            ERROR_CANCELLED = 1223,
            ERROR_NO_SUCH_LOGON_SESSION = 1312,
            ERROR_NOT_FOUND = 1168,
            ERROR_INVALID_ACCOUNT_NAME = 1315,
            ERROR_INSUFFICIENT_BUFFER = 122,
            ERROR_INVALID_PARAMETER = 87,
            ERROR_INVALID_FLAGS = 1004,
        }

        /// <summary>
        /// Fragt nach Benutzername und Passwort
        /// </summary>
        /// <param name="Title">Fenstertitel</param>
        /// <param name="Message">Fensternachricht</param>
        /// <param name="name">Benutzername</param>
        /// <param name="pass">Passwort</param>
        /// <returns>true, wenn erfolgreich</returns>
        public static bool askCred(string Title,string Message,out string name,out string pass)
        {
            // Setup the flags and variables
            StringBuilder userPassword = new StringBuilder(), userID = new StringBuilder();
            CREDUI_INFO credUI = new CREDUI_INFO();
            credUI.pszCaptionText = Title;
            credUI.pszMessageText = Message;
            credUI.cbSize = Marshal.SizeOf(credUI);
            bool save = false;
            CREDUI_FLAGS flags = CREDUI_FLAGS.ALWAYS_SHOW_UI | CREDUI_FLAGS.GENERIC_CREDENTIALS;

            // Prompt the user
            CredUIReturnCodes returnCode = CredUIPromptForCredentials(ref credUI, System.Windows.Forms.Application.ProductName, IntPtr.Zero, 0, userID, 100, userPassword, 100, ref save, flags);

            name = userID.ToString();
            pass = userPassword.ToString();

            return (returnCode == CredUIReturnCodes.NO_ERROR);
        }
    }
}

Der Screenshot zeigt das Fenster, wie es in ytBackup verwendet wird.

Schlagwörter: Windows Benutzername Passwort abfrage Dialog Fenster API

**:::

AyrA Themenstarter:in
60 Beiträge seit 2010
vor 10 Jahren
Unicode

Ersetzt man den Funktionsnamen CredUIPromptForCredentials mit CredUIPromptForCredentialsW können unicode Zeichen verwendet werden.

**:::