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.
正如主题所说,我正在尝试使用 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)
任何帮助:( ??
抱歉我的英语不好。
有一个接口 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.