Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class CredentialDialog
- {
- private const int MaxBufferLength = 100;
- public string Caption { get; set; }
- public string Message { get; set; }
- public string Username { get; private set; }
- public SecureString Password { get; private set; }
- public unsafe DialogResult ShowDialog(IWin32Window owner = null)
- {
- var info = new NativeMethods.CredentialUiInfo
- {
- pszCaptionText = this.Caption,
- pszMessageText = this.Message,
- };
- info.cbSize = Marshal.SizeOf(info);
- if (owner != null)
- info.hwndParent = owner.Handle;
- uint authPackage = 0;
- var authError = 0;
- var save = false;
- var result = NativeMethods.CredUIPromptForWindowsCredentials(ref info,
- authError,
- ref authPackage,
- IntPtr.Zero,
- 0,
- out var outCredBuffer,
- out var outCredSize,
- ref save,
- 0x1);
- var usernameBuffer = new StringBuilder(MaxBufferLength);
- var domainBuffer = new StringBuilder(MaxBufferLength);
- var usernameLength = MaxBufferLength;
- var passwordLength = MaxBufferLength;
- var domainLength = MaxBufferLength;
- var pwPointer = Marshal.AllocHGlobal(MaxBufferLength);
- NativeMethods.CredUnPackAuthenticationBuffer(0,
- outCredBuffer,
- outCredSize,
- usernameBuffer,
- ref usernameLength,
- domainBuffer,
- ref domainLength,
- pwPointer,
- ref passwordLength);
- Marshal.FreeCoTaskMem(outCredBuffer);
- this.Username = usernameBuffer.ToString();
- this.Password = new SecureString((char*)pwPointer, passwordLength);
- return result == (int)NativeMethods.CredentialDialogResult.Ok
- ? DialogResult.OK
- : DialogResult.Cancel;
- }
- private static class NativeMethods
- {
- public enum CredentialDialogResult
- {
- Ok = 0,
- Cancel = 1223
- }
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
- public struct CredentialUiInfo
- {
- public int cbSize;
- public IntPtr hwndParent;
- public string pszMessageText;
- public string pszCaptionText;
- public IntPtr hbmBanner;
- }
- [DllImport("credui.dll", CharSet = CharSet.Auto)]
- public static extern bool CredUnPackAuthenticationBuffer(int dwFlags,
- IntPtr pAuthBuffer,
- uint cbAuthBuffer,
- StringBuilder pszUserName,
- ref int pcchMaxUserName,
- StringBuilder pszDomainName,
- ref int pcchMaxDomainame,
- IntPtr pszPassword,
- ref int pcchMaxPassword);
- [DllImport("credui.dll", CharSet = CharSet.Auto)]
- public static extern int CredUIPromptForWindowsCredentials(ref CredentialUiInfo notUsedHere,
- int authError,
- ref uint authPackage,
- IntPtr InAuthBuffer,
- uint InAuthBufferSize,
- out IntPtr refOutAuthBuffer,
- out uint refOutAuthBufferSize,
- ref bool fSave,
- int flags);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement