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); }
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; }
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); }