Delphi/Rdp 连接前检查用户名和密码

Delphi/Rdp check username and password before connect

正如主题所说,我正在尝试使用 delphi

中的此代码连接到服务器
procedure TmainF.Button1Click(Sender: TObject);
var 
   rdp1 : TMsRdpClient7NotSafeForScripting ;
begin
  rdp1 := TMsRdpClient7NotSafeForScripting.Create(self);
  rdp1.Parent := mainF;
  rdp1.Server:=server_name;
  rdp1.UserName := user.Text;
  rdp1.AdvancedSettings7.ClearTextPassword := password.Text;
  rdp1.ConnectingText := 'connecting';
  rdp1.DisconnectedText := 'disconnected';
  rdp1.AdvancedSettings7.AuthenticationLevel:=0;
  rdp1.AdvancedSettings7.EnableCredSspSupport:=true;
  rdp1.Connect;
end;

代码运行正常,但如果用户输入了错误的用户名或密码
rdp 对象显示远程桌面登录提示框以重新输入用户名或密码,如图所示

我想在连接前验证用户名和密码
或阻止此框并显示来自我的应用程序的自定义消息

我尝试使用 OnLogonError() 过程,但它没有触发任何代码
我读了这个 Question 但代码是 c# 并且我与 .getocx() 混淆并且我在 (MSTSCLib_TLB.pas)

中找不到 (PromptForCredentials)

任何帮助:( ??

抱歉我的英语不好。

有一个接口 IMsRdpClientNonScriptable5 具有以下方法:

  • Get_AllowPromptingForCredentials()
  • Set_AllowPromptingForCredentials()

如果您调用 Set_AllowPromptingForCredentials() 并将参数设置为 false,则不会出现该对话框。

至于如何获取此接口的实例 - 简单,您只需转换 RDP 客户端对象的 ControlInterface

Ircns5 := rdp1.ControlInterface as IMsRdpClientNonScriptable5;
if Assigned(Ircns5) then
  Ircns5.Set_AllowPromptingForCredentials(False);

您可以在建立连接之前将用户名和密码传递给 Windows API 函数“LogonUser”。为此,身份验证实体必须在用户网络上可用。

{$APPTYPE CONSOLE}

uses SysUtils, Windows;

var
    hToken : THandle;

begin
    if (ParamCount <> 3) then
    begin
        WriteLn ('LogonUserTest.exe [user name] [domain] [password]');
        Halt ($FF);
    end; { if }

    try
        Win32Check (LogonUser (PChar (ParamStr (1)), PChar (ParamStr (2)),
                               PChar (ParamStr (3)), Logon32_Logon_Interactive,
                               LOGON32_PROVIDER_DEFAULT, hToken));
        WriteLn ('LogonUser success');
        CloseHandle (hToken);

    except
        on E: Exception do
            Writeln (E.ClassName, ': ', E.Message);
    end; { try / except }
end.