[DllImport("credui.dll", CharSet = CharSet.Unicode)]
private static extern uint CredUIPromptForWindowsCredentials(ref CREDUI_INFO notUsedHere,
int authError,
ref uint authPackage,
IntPtr InAuthBuffer,
uint InAuthBufferSize,
out IntPtr refOutAuthBuffer,
out uint refOutAuthBufferSize,
ref bool fSave,
PromptForWindowsCredentialsFlags flags);
''' <summary>
''' The CredUIPromptForWindowsCredentials function creates and displays a configurable dialog box that allows users to supply credential information by using any credential provider installed on the local computer.
''' NOTE: Windows Vista or Server 2008 or later ONLY. For older Windows versions use CredUIPromptForCredentials().
''' See http://msdn.microsoft.com/en-us/library/aa375178(v=VS.85).aspx
''' </summary>
''' <param name="pUiInfo">The CREDUI_INFO structure with customises the appearance of the dialog.</param>
''' <param name="dwAuthError">If prompting after an error pass the Windows Error code so the appropriate error message is included in the dialog.</param>
''' <param name="pulAuthPackage">Determine the authentication package to use. Pass zero to use default. Returns with identifier for package used.</param>
''' <param name="pvInAuthBuffer">An authentication buffer with which to default prompted values (see <see cref="CredPackAuthenticationBuffer" />).</param>
''' <param name="ulInAuthBufferSize">Size of the input authentication buffer.</param>
''' <param name="ppvOutAuthBuffer">An authentication buffer which will be populated with entered credentials (see <see cref="CredUnPackAuthenticationBuffer" />).</param>
''' <param name="pulOutAuthBufferSize">Size of the output authentication buffer.</param>
''' <param name="pfSave">If set to <c>True</c> the check the "Save" checkbox on the dialog - only displayed if CREDUIWIN_CHECKBOX is passed in dwFlags.</param>
''' <param name="dwFlags">Flags to control the dialog functionality (see <see cref="CredUIWinFlags" />.</param>
''' <returns>A <see cref="CredUIReturnCodes" /> value.</returns>
<System.Runtime.InteropServices.DllImport("credui.dll", EntryPoint:="CredUIPromptForWindowsCredentials", CharSet:=CharSet.Unicode)> <CLSCompliant(False)> _
Public Shared Function CredUIPromptForWindowsCredentials(ByRef pUiInfo As CREDUI_INFO, _
ByVal dwAuthError As UInt32, _
ByRef pulAuthPackage As UInt32, _
ByVal pvInAuthBuffer As IntPtr, _
ByVal ulInAuthBufferSize As UInt32, _
ByRef ppvOutAuthBuffer As IntPtr, _
ByRef pulOutAuthBufferSize As UInt32, _
<MarshalAs(UnmanagedType.Bool)> ByRef pfSave As Boolean, _
ByVal dwFlags As CredUIWinFlags) As CredUIReturnCodes
End Function
C# Syntax:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct CREDUI_INFO
{
public int cbSize;
public IntPtr hwndParent;
public string pszMessageText;
public string pszCaptionText;
public IntPtr hbmBanner;
}
[Flags]
private enum PromptForWindowsCredentialsFlags
{
/// <summary>
/// The caller is requesting that the credential provider return the user name and password in plain text.
/// This value cannot be combined with SECURE_PROMPT.
/// </summary>
CREDUIWIN_GENERIC = 0x1,
/// <summary>
/// The Save check box is displayed in the dialog box.
/// </summary>
CREDUIWIN_CHECKBOX = 0x2,
/// <summary>
/// Only credential providers that support the authentication package specified by the authPackage parameter should be enumerated.
/// This value cannot be combined with CREDUIWIN_IN_CRED_ONLY.
/// </summary>
CREDUIWIN_AUTHPACKAGE_ONLY = 0x10,
/// <summary>
/// Only the credentials specified by the InAuthBuffer parameter for the authentication package specified by the authPackage parameter should be enumerated.
/// If this flag is set, and the InAuthBuffer parameter is NULL, the function fails.
/// This value cannot be combined with CREDUIWIN_AUTHPACKAGE_ONLY.
/// </summary>
CREDUIWIN_IN_CRED_ONLY = 0x20,
/// <summary>
/// Credential providers should enumerate only administrators. This value is intended for User Account Control (UAC) purposes only. We recommend that external callers not set this flag.
/// </summary>
CREDUIWIN_ENUMERATE_ADMINS = 0x100,
/// <summary>
/// Only the incoming credentials for the authentication package specified by the authPackage parameter should be enumerated.
/// </summary>
CREDUIWIN_ENUMERATE_CURRENT_USER = 0x200,
/// <summary>
/// The credential dialog box should be displayed on the secure desktop. This value cannot be combined with CREDUIWIN_GENERIC.
/// Windows Vista: This value is not supported until Windows Vista with SP1.
/// </summary>
CREDUIWIN_SECURE_PROMPT = 0x1000,
/// <summary>
/// The credential provider should align the credential BLOB pointed to by the refOutAuthBuffer parameter to a 32-bit boundary, even if the provider is running on a 64-bit system.
/// </summary>
CREDUIWIN_PACK_32_WOW = 0x10000000,
}
VB Syntax:
<Flags()> _
Public Enum CredUIWinFlags As Integer
CredUIWin_Generic = &H1
CredUIWin_Checkbox = &H2
CredUIWin_AuthPackage_Only = &H10
CredUIWin_InCred_Only = &H20
CredUIWin_Enumerate_Admins = &H100
CredUIWin_Enumerate_CurrentUser = &H200
CredUIWin_Secure_Prompt = &H1000
CredUIWin_Pack_32_Wow = &H10000000
End Enum
Public Enum CredUIReturnCodes As Integer
NO_ERROR = 0
ERROR_CANCELLED = 1223
ERROR_NO_SUCH_LOGON_SESSION = 1312
ERROR_NOT_FOUND = 1168
ERROR_INVALID_ACCOUNT_NAME = 1315
ERROR_INSUFFICIENT_BUFFER = 122
ERROR_INVALID_PARAMETER = 87
ERROR_INVALID_FLAGS = 1004
End Enum
Do you know one? Please contribute it!
None.
Please add some!
C# Sample:
bool save = false;
int errorcode = 0;
uint dialogReturn;
uint authPackage = 0;
IntPtr outCredBuffer;
uint outCredSize;
CREDUI_INFO credui = new CREDUI_INFO();
credui.cbSize = Marshal.SizeOf(credui);
credui.pszCaptionText = "Connect to your application";
credui.pszMessageText = "Enter your credentials!";
credui.hwndParent = this.Handle;
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)0, //You can force that a specific username is shown in the dialog. 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,
0); //Use the PromptForWindowsCredentialsFlags-Enum here. You can use multiple flags if you seperate them with | .
if (dialogReturn != 0) break; //Break, if Cancel was clicked or an error occurred
/*Unpack your credentials (outCredBuffer, outCredSize) with 'CredUnPackAuthenticationBuffer()'
For example, it returns a bool 'credentialsEnteredCorrect':*/
bool credentialsEnteredCorrect = false;
if (credentialsEnteredCorrect) break; //Break the while-loop, if the entered credentials are correct.
else errorcode = 1326; //Else display an error message inside the dialog next time (The errorcodes are defined in 'winerror.h')
//1326 = 'Logon failure: unknown user name or bad password.'
}