public CredentialResult(string userName, string password, string domain, CredentialSaveOption credentialSaved)
 {
     UserName        = userName;
     Password        = password;
     Domain          = domain;
     CredentialSaved = credentialSaved;
 }
 // Display the sign in dialog and create a credential 
 private async Task<Credential> SignInDialogCreateCredentialAsync(CredentialRequestInfo credentialRequestInfo)
 {
     Credential credential = await _signInDialog.CreateCredentialAsync(credentialRequestInfo);
     if (AllowSaveCredentials && _signInDialog.CredentialSaveOption != CredentialSaveOption.Unselected)
         CredentialManager.AddCredential(credential);
     CredentialSaveOption = _signInDialog.CredentialSaveOption; // so a custom component can use it
     return credential;
 }
        public static CredentialResult PromptForCredentials(IntPtr owner = default, string messageText = null, string captionText = null, string userName = null, CredentialSaveOption saveCredential = CredentialSaveOption.Unselected)
        {
            var credUI = new CredentialUIInfo
            {
                hwndParent     = owner,
                pszMessageText = messageText,
                pszCaptionText = captionText,
                hbmBanner      = IntPtr.Zero,
            };

            var save = saveCredential == CredentialSaveOption.Selected ? true : false;

            // Setup the flags and variables
            credUI.cbSize = Marshal.SizeOf(credUI);
            var  errorcode   = 0;
            uint authPackage = 0;

            var outCredBuffer = IntPtr.Zero;
            var flags         = PromptForWindowsCredentialsFlags.GenericCredentials | PromptForWindowsCredentialsFlags.EnumerateCurrentUser;

            if (saveCredential != CredentialSaveOption.Hidden)
            {
                flags |= PromptForWindowsCredentialsFlags.ShowCheckbox;
            }

            // Prefill username
            GetInputBuffer(userName, out var inCredBuffer, out var inCredSize);

            // Setup the flags and variables
            var result = Credui.CredUIPromptForWindowsCredentials(ref credUI,
                                                                  errorcode,
                                                                  ref authPackage,
                                                                  inCredBuffer,
                                                                  inCredSize,
                                                                  out outCredBuffer,
                                                                  out var outCredSize,
                                                                  ref save,
                                                                  flags);

            FreeCoTaskMem(inCredBuffer);

            if (result == 0 && GetCredentialsFromOutputBuffer(outCredBuffer, outCredSize, out userName, out var password, out var domain))
            {
                var credentialSaved = saveCredential == CredentialSaveOption.Hidden ? CredentialSaveOption.Hidden : (save ? CredentialSaveOption.Selected : CredentialSaveOption.Unselected);
                return(new CredentialResult(userName, password, domain, credentialSaved));
            }

            return(null);
        }
        public static CredentialResult PromptForCredentialsConsole(string target, string userName = null, CredentialSaveOption saveCredential = CredentialSaveOption.Unselected)
        {
            var userId       = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);
            var userPassword = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);

            if (!string.IsNullOrEmpty(userName))
            {
                userId.Append(userName);
            }

            var save  = saveCredential == CredentialSaveOption.Selected ? true : false;
            var flags = CredentialUIFlags.CompleteUsername | CredentialUIFlags.ExcludeCertificates | CredentialUIFlags.GenericCredentials;

            if (saveCredential == CredentialSaveOption.Unselected)
            {
                flags |= CredentialUIFlags.ShowSaveCheckBox | CredentialUIFlags.DoNotPersist;
            }
            else if (saveCredential == CredentialSaveOption.Selected)
            {
                flags |= CredentialUIFlags.ShowSaveCheckBox | CredentialUIFlags.Persist;
            }
            else
            {
                flags |= CredentialUIFlags.DoNotPersist;
            }

            var returnCode = Credui.CredUICmdLinePromptForCredentials(target, IntPtr.Zero, 0, userId, userId.Capacity, userPassword, userPassword.Capacity, ref save, flags);

            var userBuilder   = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);
            var domainBuilder = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);

            var credentialSaved = saveCredential == CredentialSaveOption.Hidden ? CredentialSaveOption.Hidden : (save ? CredentialSaveOption.Selected : CredentialSaveOption.Unselected);

            returnCode = Credui.CredUIParseUserName(userId.ToString(), userBuilder, userBuilder.Capacity, domainBuilder, domainBuilder.Capacity);
            switch (returnCode)
            {
            case CredentialUIReturnCodes.Success:
                return(new CredentialResult(
                           userBuilder.ToString(),
                           userPassword.ToString(),
                           domainBuilder.ToString(),
                           credentialSaved));

            case CredentialUIReturnCodes.InvalidAccountName:
                return(new CredentialResult(
                           userId.ToString(),
                           userPassword.ToString(),
                           null,
                           credentialSaved));

            case CredentialUIReturnCodes.InsufficientBuffer:
                throw new OutOfMemoryException();

            case CredentialUIReturnCodes.InvalidParameter:
                throw new ArgumentException();

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public static CredentialResult PromptForCredentialsConsole(string target, string?userName = null, CredentialSaveOption saveCredential = CredentialSaveOption.Unselected)
        {
            var userId       = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);
            var userPassword = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);

            if (!string.IsNullOrEmpty(userName))
            {
                userId.Append(userName);
            }

            var save  = saveCredential == CredentialSaveOption.Selected;
            var flags = CredentialUIFlags.CompleteUsername | CredentialUIFlags.ExcludeCertificates | CredentialUIFlags.GenericCredentials;

            if (saveCredential == CredentialSaveOption.Unselected)
            {
                flags |= CredentialUIFlags.ShowSaveCheckBox | CredentialUIFlags.DoNotPersist;
            }
            else if (saveCredential == CredentialSaveOption.Selected)
            {
                flags |= CredentialUIFlags.ShowSaveCheckBox | CredentialUIFlags.Persist;
            }
            else
            {
                flags |= CredentialUIFlags.DoNotPersist;
            }

            _ = Credui.CredUICmdLinePromptForCredentialsW(target, IntPtr.Zero, 0, userId, userId.Capacity, userPassword, userPassword.Capacity, ref save, flags);

            var userBuilder   = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);
            var domainBuilder = new StringBuilder(Credui.CREDUI_MAX_USERNAME_LENGTH);

            var credentialSaved = saveCredential == CredentialSaveOption.Hidden ? CredentialSaveOption.Hidden : (save ? CredentialSaveOption.Selected : CredentialSaveOption.Unselected);

            var returnCode = Credui.CredUIParseUserName(userId.ToString(), userBuilder, userBuilder.Capacity, domainBuilder, domainBuilder.Capacity);

            return(returnCode switch
            {
                CredentialUIReturnCodes.Success => new CredentialResult(userBuilder.ToString(), userPassword.ToString(), domainBuilder.ToString(), credentialSaved),
                CredentialUIReturnCodes.InvalidAccountName => new CredentialResult(userId.ToString(), userPassword.ToString(), domain: null, credentialSaved),
                CredentialUIReturnCodes.InsufficientBuffer => throw new Win32Exception((int)returnCode, "Insufficient buffer"),
                CredentialUIReturnCodes.InvalidParameter => throw new Win32Exception((int)returnCode, "Invalid parameter"),
                _ => throw new Win32Exception((int)returnCode),
            });