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

时间:2017-11-27 16:05:49

标签: delphi remote-desktop rdp mstsc

正如主题所说,我试图在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对象显示远程桌面登录提示框以重新输入用户名或密码,如图像

enter image description here

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

我尝试使用OnLogonError()程序,但它没有触发任何代码 我读了这个Question,但代码是c#,我与.getocx()混淆了,我无法在(MSTSCLib_TLB.pas)中找到(PromptForCredentials)

任何帮助:( ??

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:2)

接口IMsRdpClientNonScriptable5具有以下方法:

  • Get_AllowPromptingForCredentials()
  • Set_AllowPromptingForCredentials()

如果您使用参数设置为Set_AllowPromptingForCredentials()来致电false,则不会显示该对话框。

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

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

答案 1 :(得分:0)

您可以在建立连接之前将用户名和密码传递给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.