예제 #1
0
 internal static extern int CredUIPromptForWindowsCredentials(ref CredentialUIInfo creditUR,
                                                              int authError,
                                                              ref uint authPackage,
                                                              IntPtr InAuthBuffer,
                                                              uint InAuthBufferSize,
                                                              out IntPtr refOutAuthBuffer,
                                                              out uint refOutAuthBufferSize,
                                                              ref bool fSave,
                                                              PromptForWindowsCredentialsFlags flags);
예제 #2
0
 internal static extern CredentialUIReturnCodes CredUIPromptForCredentials(ref CredentialUIInfo creditUR,
                                                                           string targetName,
                                                                           IntPtr reserved1,
                                                                           int iError,
                                                                           StringBuilder userName,
                                                                           int maxUserName,
                                                                           StringBuilder password,
                                                                           int maxPassword,
                                                                           [MarshalAs(UnmanagedType.Bool)] ref bool pfSave,
                                                                           CredentialUIFlags flags);
        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);
        }