internal static PSCredential CredUIPromptForCredentials(
            string caption, string message, string userName, string targetName,
            PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options,
            IntPtr parentHwnd = default(IntPtr))
        {
            PSCredential credential = null;

            var info = new CreduiInfo
            {
                pszCaptionText = caption,
                pszMessageText = message
            };

            var pszUserName = new StringBuilder(userName, 0x201);
            var pszPassword = new StringBuilder(0x100);
            int pfSave      = Convert.ToInt32(false);

            info.cbSize     = Marshal.SizeOf(info);
            info.hwndParent = parentHwnd;

            var dwFlags = CreduiFlags.DO_NOT_PERSIST;

            if ((allowedCredentialTypes & PSCredentialTypes.Domain) != PSCredentialTypes.Domain)
            {
                dwFlags |= CreduiFlags.GENERIC_CREDENTIALS;
                if ((options & PSCredentialUIOptions.AlwaysPrompt) == PSCredentialUIOptions.AlwaysPrompt)
                {
                    dwFlags |= CreduiFlags.ALWAYS_SHOW_UI;
                }
            }

            var codes = CredUiReturnCodes.ERROR_INVALID_PARAMETER;

            if ((pszUserName.Length <= 0x201) &&
                (pszPassword.Length <= 0x100))
            {
                codes = CredUIPromptForCredentials(
                    ref info, targetName, IntPtr.Zero, 0, pszUserName,
                    0x201, pszPassword, 0x100, ref pfSave, dwFlags);
            }

            if (codes == CredUiReturnCodes.NO_ERROR)
            {
                string providedUserName = pszUserName.ToString();
                var    providedPassword = new SecureString();

                for (int i = 0; i < pszPassword.Length; i++)
                {
                    providedPassword.AppendChar(pszPassword[i]);
                    pszPassword[i] = '\0';
                }
                providedPassword.MakeReadOnly();

                if (!String.IsNullOrEmpty(providedUserName))
                {
                    credential = new PSCredential(providedUserName, providedPassword);
                }
            }
            return(credential);
        }
Exemple #2
0
        internal static PSCredential CredUIPromptForCredentials(
            string caption, string message, string userName, string targetName,
            PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options,
            IntPtr parentHwnd = default(IntPtr))
        {

            PSCredential credential = null;

            var info = new CreduiInfo
            {
                pszCaptionText = caption,
                pszMessageText = message
            };

            var pszUserName = new StringBuilder(userName, 0x201);
            var pszPassword = new StringBuilder(0x100);
            int pfSave = Convert.ToInt32(false);
            info.cbSize = Marshal.SizeOf(info);
            info.hwndParent = parentHwnd;

            var dwFlags = CreduiFlags.DO_NOT_PERSIST;
            if ((allowedCredentialTypes & PSCredentialTypes.Domain) != PSCredentialTypes.Domain)
            {
                dwFlags |= CreduiFlags.GENERIC_CREDENTIALS;
                if ((options & PSCredentialUIOptions.AlwaysPrompt) == PSCredentialUIOptions.AlwaysPrompt)
                {
                    dwFlags |= CreduiFlags.ALWAYS_SHOW_UI;
                }
            }

            var codes = CredUiReturnCodes.ERROR_INVALID_PARAMETER;

            if ((pszUserName.Length <= 0x201) && (pszPassword.Length <= 0x100))
            {
                codes = CredUIPromptForCredentials(
                    ref info, targetName, IntPtr.Zero, 0, pszUserName,
                    0x201, pszPassword, 0x100, ref pfSave, dwFlags);
            }

            if (codes == CredUiReturnCodes.NO_ERROR)
            {

                string providedUserName = pszUserName.ToString();
                var providedPassword = new SecureString();

                for (int i = 0; i < pszPassword.Length; i++)
                {
                    providedPassword.AppendChar(pszPassword[i]);
                    pszPassword[i] = '\0';
                }
                providedPassword.MakeReadOnly();

                if (!String.IsNullOrEmpty(providedUserName))
                {
                    credential = new PSCredential(providedUserName, providedPassword);
                }
            }
            return credential;
        }
 private static extern int CredUIPromptForWindowsCredentials(ref CreduiInfo notUsedHere,
                                                             int authError,
                                                             ref uint authPackage,
                                                             IntPtr inAuthBuffer,
                                                             uint inAuthBufferSize,
                                                             out IntPtr refOutAuthBuffer,
                                                             out uint refOutAuthBufferSize,
                                                             ref bool fSave,
                                                             int flags);
        public static void GetCredentialsVistaAndUp(out NetworkCredential networkCredential, string captionText = null, string message = null)
        {
            var credui = new CreduiInfo
            {
                pszCaptionText = captionText ?? "Please enter the credentails",
                pszMessageText = message ?? ""
            };

            credui.cbSize = Marshal.SizeOf(credui);
            uint   authPackage = 0;
            IntPtr outCredBuffer;
            uint   outCredSize;
            var    save   = false;
            var    result = CredUIPromptForWindowsCredentials(ref credui,
                                                              0,
                                                              ref authPackage,
                                                              IntPtr.Zero,
                                                              0,
                                                              out outCredBuffer,
                                                              out outCredSize,
                                                              ref save,
                                                              1 /* Generic */);

            var usernameBuf = new StringBuilder(100);
            var passwordBuf = new StringBuilder(100);
            var domainBuf   = new StringBuilder(100);

            var maxUserName = 100;
            var maxDomain   = 100;
            var maxPassword = 100;

            if (result == 0)
            {
                if (CredUnPackAuthenticationBuffer(0, outCredBuffer, outCredSize, usernameBuf, ref maxUserName,
                                                   domainBuf, ref maxDomain, passwordBuf, ref maxPassword))
                {
                    //TODO: ms documentation says we should call this but i can't get it to work
                    //SecureZeroMem(outCredBuffer, outCredSize);

                    //clear the memory allocated by CredUIPromptForWindowsCredentials
                    CoTaskMemFree(outCredBuffer);
                    networkCredential = new NetworkCredential()
                    {
                        UserName = usernameBuf.ToString(),
                        Password = passwordBuf.ToString(),
                        Domain   = domainBuf.ToString()
                    };
                    return;
                }
            }

            networkCredential = null;
        }
Exemple #5
0
 private static extern CredUiReturnCodes CredUIPromptForCredentials(ref CreduiInfo pUiInfo, string pszTargetName, IntPtr reserved, int dwAuthError, StringBuilder pszUserName, int ulUserNameMaxChars, StringBuilder pszPassword, int ulPasswordMaxChars, ref int pfSave, CreduiFlags dwFlags);
        public long GetCredential(string captionText, string messageText, IntPtr parentHandle, out NetworkCredential networkCredential)
        {
            var    save      = false;
            var    errorcode = 0;
            uint   dialogReturn;
            uint   authPackage = 0;
            IntPtr outCredBuffer;
            uint   outCredSize;

            var credui = new CreduiInfo();

            credui.Size           = Marshal.SizeOf(credui);
            credui.PszCaptionText = captionText;
            credui.PszMessageText = messageText;
            credui.HwndParent     = parentHandle;

            while (true) // Show the dialog again and again, until Cancel is clicked or the entered credentials are correct.
            {
                // Show the dialog
                dialogReturn = CredUIPromptForWindowsCredentials(ref credui,
                                                                 errorcode,
                                                                 ref authPackage,
                                                                 IntPtr.Zero, // A specific username can be forced to be shown in the dialog from here. Create it with 'CredPackAuthenticationBuffer()'. Then, the buffer goes here...
                                                                 0,           // ...and the size goes here. You also have to add CREDUIWIN_IN_CRED_ONLY to the flags (last argument).
                                                                 out outCredBuffer,
                                                                 out outCredSize,
                                                                 ref save,
                                                                 PromptForWindowsCredentialsFlags.CreduiwinGeneric); // Use the PromptForWindowsCredentialsFlags-Enum here. You can use multiple flags if you seperate them with | .

                if (dialogReturn != 0)                                                                               // cancel returns 1223
                {
                    errorcode = (int)dialogReturn;
                    break; // Break, if Cancel was clicked or an error occurred
                }

                var usernameBuf = new StringBuilder(100);
                var passwordBuf = new StringBuilder(100);
                var domainBuf   = new StringBuilder(100);

                var maxUserName = 100;
                var maxDomain   = 100;
                var maxPassword = 100;

                var credentialEnteredCorrect = false;

                if (dialogReturn == 0)
                {
                    credentialEnteredCorrect = CredUnPackAuthenticationBuffer(0, outCredBuffer, outCredSize, usernameBuf, ref maxUserName, domainBuf, ref maxDomain, passwordBuf, ref maxPassword);
                    if (credentialEnteredCorrect)
                    {
                        // clear the memory allocated by CredUIPromptForWindowsCredentials
                        CoTaskMemFree(outCredBuffer);
                        networkCredential = new NetworkCredential()
                        {
                            UserName = usernameBuf.ToString(),
                            Password = passwordBuf.ToString(),
                            Domain   = domainBuf.ToString()
                        };
                        return(errorcode);
                    }
                    else
                    {
                        errorcode = 1326;
                    }

                    networkCredential = null;
                }
            }

            networkCredential = null;
            return(errorcode);
        }
 private static extern CredUiReturnCodes CredUIPromptForCredentials(ref CreduiInfo pUiInfo, string pszTargetName, IntPtr reserved, int dwAuthError, StringBuilder pszUserName, int ulUserNameMaxChars, StringBuilder pszPassword, int ulPasswordMaxChars, ref int pfSave, CreduiFlags dwFlags);