我已经在MSDN论坛上搜索了此文件,但似乎每个人(我认为)都建议恢复为RDP 7.x(卸载MS Update KB2592687)。

我有一个用C#/WPF编写的自定义远程桌面客户端,该远程桌面ActiveX控件托管在WindowsFormsHost控件内。
该应用程序之前运行良好,可以更新RDP 8.0(MS更新KB2592687)。如果我卸载了MS更新(还原为RDP 7.1),则该应用程序正常运行。

我的RDP客户端用于连接到Virtualbox VRDP(Virtualbox 4.2.x),无需身份验证(空)。安装RDP 8.0后,Windows远程桌面客户端(mstsc.exe)可以很好地进行连接,并具有更好的响应能力(RDP 8.0增强功能);但是我的自定义RD客户端无法连接。

经过进一步调查,我的自定义RDP客户端不会引发任何异常或触发 OnConnecting OnLogonError 或其他大多数事件。
奇怪的是,它仅触发这两个事件(按顺序)

OnAuthenticationWarning显示的
OnAuthenticationWarning已关闭

我还使用RawCap(http://www.netresec.com/?page=RawCap)进行了测试,以查看我的自定义RDP客户端是否在发生这些事件之前将数据包发送到Virtualbox VRDP。令人惊讶的是,它甚至没有发送数据包。 (MS RD客户端-mstsc.exe正常运行。)

因此,归结为我的自定义RDP客户端上的这些事件/方法调用,不幸的是我被卡住了。

(为简明起见,代码已缩短)

    AxMSTSCLib.AxMsRdpClient8 rdp = new AxMSTSCLib.AxMsRdpClient8();

    rdp.OnAuthenticationWarningDisplayed+=new EventHandler(rdp_OnAuthenticationWarningDisplayed);
    rdp.OnAuthenticationWarningDismissed+=new EventHandler(rdp_OnAuthenticationWarningDismissed);
    rdp.Server = server;
    rdp.AdvancedSettings8.RDPPort = 5050;

//No username/password since Virtualbox RDP authentication is set to *null*
//MS RD Client connects just fine to Virtualbox RDP without username/password

    try
    {
       rdp.Connect();
    }
    catch (Exception ex)
    {
    }

OnAuthenticationWarningDisplayed OnAuthenticationWarningDismissed 上设置一个断点,可确认在 Connect()方法之后均触发了这两个事件。
我怀疑在调用 Connect()方法后,ActiveX控件正试图显示一个对话框(??);但我似乎无法弄清楚。

是否有人使用RDP 8.0完成了一些自定义客户端?使它能够工作的前提是什么(代码)。

非常感谢!将不胜感激。

最佳答案

解决了这个问题!

只需尝试使用 AxMSTSCLib.AxMsRdpClient8NotSafeForScripting 而不是 AxMSTSCLib.AxMsRdpClient8

这是工作代码(Delphi):

rdp:TMsRdpClient8NotSafeForScripting; // ***Instead of TMsRdpClient8 (!!!)***
...

if rdp.Connected<>0 then rdp.Disconnect;

rdp.Server:='192.168.1.1';
rdp.UserName:='User';
rdp.AdvancedSettings8.ClearTextPassword:='Password';
rdp.AdvancedSettings8.AuthenticationLevel:=2;
rdp.AdvancedSettings8.EnableCredSspSupport:=true;
rdp.AdvancedSettings8.NegotiateSecurityLayer:=false;

rdp.AdvancedSettings8.RelativeMouseMode:=true;
rdp.AdvancedSettings.BitmapPeristence:=1;
rdp.AdvancedSettings.Compress:=1;
rdp.AdvancedSettings8.SmartSizing:=true;
rdp.DesktopHeight:= Screen.Height;
rdp.DesktopWidth:= Screen.Width;
rdp.FullScreen:=true;
rdp.ColorDepth:= 15;

rdp.AdvancedSettings8.RedirectDrives:=false;
rdp.AdvancedSettings8.RedirectPrinters:=false;
rdp.AdvancedSettings8.RedirectClipboard:=true;
rdp.AdvancedSettings8.RedirectSmartCards:=false;

rdp.Connect;

P.S.并且不要使用以下属性:
rdp.AdvancedSettings8.AuthenticationServiceClass

关于使用RDP 8.0的C#自定义远程桌面客户端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19869076/

10-13 05:02