RDPSession ConnectToClient意外终止

时间:2012-03-16 18:03:59

标签: c# .net remote-access rdp desktop-sharing

我已经成功创建了一个桌面共享解决方案,其中RDPViewer连接到RDPSession。这一切都很美妙。然而,现在,我正试图让相反的工作:使用RDPViewer的StartReverseConnectListener方法和RDPSession的ConnectToClient方法(会话端将连接到查看器端以解决NAT /防火墙问题)。我遵循了http://msdn.microsoft.com/en-us/library/windows/desktop/aa373359%28v=vs.85%29.aspx中概述的步骤,主要是:

  1. 查看器通过调用获取其连接字符串 StartReverseConnectListener方法,为NULL传递NULL bstrConnectionString,bstrUserName和bstrPassword参数。

  2. 查看器通过调用来启动反向连接侦听器 StartReverseConnectListener方法,为NULL传递NULL pbstrReverseConnectString参数和有效值 bstrConnectionString,bstrUserName和bstrPassword参数。

  3. 查看器将步骤1中获取的连接字符串发送给 共享者。

  4. 使用C#2010,我在RDPSession端完成了以下操作:

    RDPSession session = new RDPSession();
    session.Open();
    session.Invitations.CreateInvitation(null, "test", "12345", 1);
    

    然后,在RDPViewer方面,我已经完成了:

    string reverseConnectString = axRDPViewer1.StartReverseConnectListener(null, null, null);
    

    (上面的步骤1)

    axRDPViewer1.StartReverseConnectListener(reverseConnectString, "test", "12345");
    

    (上面的第2步)

    然后,回到RDPSession端,我尝试使用从查看器获得的reverseConnectString来建立连接(我实际上将字符串保存到文件中,然后将其加载到RDPSession端):

    session.ConnectToClient(reverseConnectString);
    

    (上面的步骤3)

    一旦我执行此方法,RDPViewer端就会断开错误1798,根据http://msdn.microsoft.com/en-us/library/aa373802%28VS.85%29.aspx,这意味着:

      

    ServerCertificateUnpackErr 1798

         

    无法解压缩服务器证书。

    我觉得我错过了一些明显的东西,但我无法弄清楚是什么。

    有什么建议吗?

    谢谢!

1 个答案:

答案 0 :(得分:2)

Microsoft文档在反向连接方面都是错误的。以下是您需要做的事情(根据您的代码改编):

RDP会话端:

RDPSession session = new RDPSession(); 
session.Open(); 
string hostConnString = session.Invitations.CreateInvitation(null, "My Group Name", "12345", 1);

RDPViewer端(请注意,hostConnString应与会话端检索的值相同):

string viewerConnString = axRDPViewer1.StartReverseConnectListener(hostConnString, "My Name", "12345");

现在回到RDP会话端(请注意,viewerConnString应该与从查看者端检索的值相同):

session.ConnectToClient(viewerConnString); 

那应该这样做。有几点需要注意。 CreateInvitation中指定的组名称不需要与其他任何地方匹配。我认为如果你的程序需要枚举主机发起的邀请,那只是供参考。传递给StartReverseConnectListener的用户名也可以是您想要的任何名称。通过查看RemoteName接口中的IRDPSRAPIAttendee属性,可以在主机端查询和使用它。