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);
internal static PSCredential CredUIPromptForCredential(string caption, string message, string userName, string targetName, PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options, IntPtr parentHWND) { PSCredential credential = null; CreduiInfo structure = new CreduiInfo(); structure.pszCaptionText = caption; structure.pszMessageText = message; StringBuilder pszUserName = new StringBuilder(userName, 0x201); StringBuilder pszPassword = new StringBuilder(0x100); bool flag = false; int pfSave = Convert.ToInt32(flag); structure.cbSize = Marshal.SizeOf(structure); structure.hwndParent = parentHWND; CreduiFlags 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; } } CredUiReturnCodes codes = CredUiReturnCodes.ERROR_INVALID_PARAMETER; if ((pszUserName.Length <= 0x201) && (pszPassword.Length <= 0x100)) { codes = CredUIPromptForCredentials(ref structure, targetName, IntPtr.Zero, 0, pszUserName, 0x201, pszPassword, 0x100, ref pfSave, dwFlags); } if (codes == CredUiReturnCodes.NO_ERROR) { string str = null; if (pszUserName != null) { str = pszUserName.ToString(); } SecureString password = new SecureString(); for (int i = 0; i < pszPassword.Length; i++) { password.AppendChar(pszPassword[i]); pszPassword[i] = '\0'; } if (!string.IsNullOrEmpty(str)) { credential = new PSCredential(str, password); } else { credential = null; } } else { credential = null; } return(credential); }
/// <summary> /// コマンドライン(コンソール)アプリケーションで作業しているユーザーからの資格情報を要求し、その資格情報を受け入れます。ユーザーが入力した名前とパスワードは、検証のために呼び出し元のアプリケーションに戻されます。 /// </summary> /// <param name="TargetName">資格情報のターゲット名</param> /// <param name="Reserved">予約された引数。NULLの必要があります。</param> /// <param name="AuthError">資格情報の入力が必要な理由を指定します。呼び出し元は、別の認証呼び出しによって返されたこのWindowsエラーパラメータを渡して、ダイアログボックスが特定のエラーに対応できるようにすることができます。</param> /// <param name="UserName">信任状のユーザー名</param> /// <param name="UserNameMaxChars"></param> /// <param name="Password"></param> /// <param name="PasswordMaxChars"></param> /// <param name="Save">資格情報保存の初期状態</param> /// <param name="Flags"></param> public static (CredUIReturnCodes ResultCode, string UserName, string Password, bool IsSave) CmdLinePromptForCredentials(string TargetName, IntPtr Reserved, int AuthError, string UserName, uint UserNameMaxChars, string Password, uint PasswordMaxChars, bool Save, CreduiFlags Flags) { var UserNameBuffer = new StringBuilder((int)UserNameMaxChars); if (!string.IsNullOrEmpty(UserName)) { UserNameBuffer.Append(UserName); } var PasswordBuffer = new StringBuilder((int)PasswordMaxChars); if (!string.IsNullOrEmpty(Password)) { PasswordBuffer.Append(Password); } var result = Interop.CredUICmdLinePromptForCredentials(TargetName, Reserved, AuthError, UserNameBuffer, UserNameMaxChars, PasswordBuffer, PasswordMaxChars, ref Save, Flags); return(result, UserNameBuffer.ToString(), PasswordBuffer.ToString(), Save); }