Advertisement
Guest User

Untitled

a guest
May 3rd, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.63 KB | None | 0 0
  1. public class CredentialDialog
  2. {
  3. private const int MaxBufferLength = 100;
  4.  
  5. public string Caption { get; set; }
  6. public string Message { get; set; }
  7.  
  8. public string Username { get; private set; }
  9. public SecureString Password { get; private set; }
  10.  
  11. public unsafe DialogResult ShowDialog(IWin32Window owner = null)
  12. {
  13. var info = new NativeMethods.CredentialUiInfo
  14. {
  15. pszCaptionText = this.Caption,
  16. pszMessageText = this.Message,
  17. };
  18.  
  19. info.cbSize = Marshal.SizeOf(info);
  20.  
  21. if (owner != null)
  22. info.hwndParent = owner.Handle;
  23.  
  24. uint authPackage = 0;
  25. var authError = 0;
  26. var save = false;
  27.  
  28. var result = NativeMethods.CredUIPromptForWindowsCredentials(ref info,
  29. authError,
  30. ref authPackage,
  31. IntPtr.Zero,
  32. 0,
  33. out var outCredBuffer,
  34. out var outCredSize,
  35. ref save,
  36. 0x1);
  37.  
  38. var usernameBuffer = new StringBuilder(MaxBufferLength);
  39. var domainBuffer = new StringBuilder(MaxBufferLength);
  40.  
  41. var usernameLength = MaxBufferLength;
  42. var passwordLength = MaxBufferLength;
  43. var domainLength = MaxBufferLength;
  44.  
  45. var pwPointer = Marshal.AllocHGlobal(MaxBufferLength);
  46.  
  47. NativeMethods.CredUnPackAuthenticationBuffer(0,
  48. outCredBuffer,
  49. outCredSize,
  50. usernameBuffer,
  51. ref usernameLength,
  52. domainBuffer,
  53. ref domainLength,
  54. pwPointer,
  55. ref passwordLength);
  56.  
  57. Marshal.FreeCoTaskMem(outCredBuffer);
  58.  
  59. this.Username = usernameBuffer.ToString();
  60. this.Password = new SecureString((char*)pwPointer, passwordLength);
  61.  
  62. return result == (int)NativeMethods.CredentialDialogResult.Ok
  63. ? DialogResult.OK
  64. : DialogResult.Cancel;
  65. }
  66.  
  67. private static class NativeMethods
  68. {
  69.  
  70. public enum CredentialDialogResult
  71. {
  72. Ok = 0,
  73. Cancel = 1223
  74. }
  75.  
  76. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  77. public struct CredentialUiInfo
  78. {
  79. public int cbSize;
  80. public IntPtr hwndParent;
  81. public string pszMessageText;
  82. public string pszCaptionText;
  83. public IntPtr hbmBanner;
  84. }
  85.  
  86. [DllImport("credui.dll", CharSet = CharSet.Auto)]
  87. public static extern bool CredUnPackAuthenticationBuffer(int dwFlags,
  88. IntPtr pAuthBuffer,
  89. uint cbAuthBuffer,
  90. StringBuilder pszUserName,
  91. ref int pcchMaxUserName,
  92. StringBuilder pszDomainName,
  93. ref int pcchMaxDomainame,
  94. IntPtr pszPassword,
  95. ref int pcchMaxPassword);
  96.  
  97. [DllImport("credui.dll", CharSet = CharSet.Auto)]
  98. public static extern int CredUIPromptForWindowsCredentials(ref CredentialUiInfo notUsedHere,
  99. int authError,
  100. ref uint authPackage,
  101. IntPtr InAuthBuffer,
  102. uint InAuthBufferSize,
  103. out IntPtr refOutAuthBuffer,
  104. out uint refOutAuthBufferSize,
  105. ref bool fSave,
  106. int flags);
  107. }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement