【问题标题】:Issue with providing load balancing information using AxMSTSCLib使用 AxMSTSCLib 提供负载平衡信息的问题
【发布时间】:2023-02-01 23:28:25
【问题描述】:

我正在尝试使用“AxInterop.MSTSCLib”在我的 C# 应用程序中通过远程桌面会话代理建立远程桌面连接,我在传输负载平衡信息时遇到问题。

基本上,我创建一个新对象并设置基本参数。直接连接到单个远程桌面 (RD) 服务器已经成为可能:

var rd = new AxMsRdpClient11NotSafeForScripting();

rd.Server = "target-server.domain.local";
rd.UserName = "user";
var secured = (MSTSCLib.IMsTscNonScriptable)rd.GetOcx();
secured.ClearTextPassword = "password";

我要连接的 RD 环境由多个 RD 服务集合组成,每个服务集合管理一个或多个 RD Server。对于新的 RD 连接,RD 客户端连接到 RD 代理服务器,该服务器根据它们提供的各个负载平衡信息重定向客户端。

为了提供此负载平衡信息,我使用 mstsc.exe 和 .rdp 文件提供了设置“loadbalanceinfo:s:tsv://MS Terminal Services Plugin.1.99999”,其中“99999”是目标 RD 集合的名称,它有效美好的。要在 MSTSCLib 中实现这一点,我必须使用“rd.AdvancedSettings9.LoadBalanceInfo”对其进行设置。

但是,正如this post on the Microsoft Technet forum 也描述的那样,负载平衡信息字符串必须首先重新编码。

var lbinfo = "loadbalanceinfo:s:tsv://MS Terminal Services Plugin.1.99999";

if (lbinfo.Length % 2 == 1) lbinfo += " ";
lbinfo += "\r\n";
var b = Encoding.UTF8.GetBytes(lbinfo);
var final = Encoding.Unicode.GetString(b);

rd.AdvancedSettings9.LoadBalanceInfo = final;

根据 Technet 帖子中的最后评论,字节数必须为偶数,因此必要时添加一个空格 (U+0020)。

使用“rd.Connect()”建立连接,我的客户端到达连接代理。在第一步中,我的连接请求出现在代理服务器的日志中:

[TerminalServices-SessionBroker(操作)]
远程桌面连接代理已收到用户 {user} 的连接请求。
RDP 文件中的注释 (TSV URL) = 'tsv://MS Terminal Services Plugin.1.99999 ' (注意:字符串末尾有两个空格) 原始申请 = NULL
调用来自重定向服务器 = broker.domain.local
重定向器配置为虚拟机重定向器。

请注意所用代码添加的 TSV URL 末尾的两个空格,否则字节数会不均匀。与 mstsc.exe 的唯一区别是只显示一个空格(我猜这是我们也添加的新换行符)。

在下一步中,错误发生并且我们的连接尝试失败。它说“为连接指定的场不存在。” OnDisconnected 事件被触发并向我提供信息:“DiscReason: 3”和“ExtendedDisconnectReason: 1040”。

我的猜测:由于我们添加的空间,无法再正确分配 RD 集合的名称。如果我们在字节级别比较传递的信息 (loadbalanceinfo:s:tsv://MS Terminal Services Plugin.1.99999),我们还会看到这个增加的空间是唯一的区别:

mstsc程序 74 73 76 3a 2f 2f 4d 53 20 54 65 72 6d 69 6e 61 6c 20 53 65 72 76 69 63 65 73 20 50 6c 75 67 69 6e 2e 31 2e 39 39 39 39 39 0d 0a

AxMSTSCLib: 74 73 76 3a 2f 2f 4d 53 20 54 65 72 6d 69 6e 61 6c 20 53 65 72 76 69 63 65 73 20 50 6c 75 67 69 6e 2e 31 2e 39 39 39 39 39 20 0d 0a

请注意倒数第三个字节 U+0020,我们添加它是为了实现偶数字节数。

如果我不添加空格并且字节数 (43) 不是偶数,我在 WireShark 中看到 TPKT 数据包甚至不再发送。根据其日志,代理服务器也不会注意到连接尝试。 OnDisconnected 事件为我提供了信息:: 'DiscReason: 4' 和 'ExtendedDisconnectReason: exDiscReasonNoInfo'。所以看起来 AxMSTSCLib 已经假定字节数是偶数。

不幸的是,我无法弄清楚 mstsc.exe 是如何设法成功传输相同的奇数字符串的。在字节级别上,我的工作方式应该是相同的。

我已经在这里上传了 TPKT 包的全部字节内容以便更好地比较:https://pastebin.com/tLtfWHiP

我很感激任何想法。

感谢致敬

卢卡斯 P。

【问题讨论】:

    标签: c# load-balancing remote-desktop rdp mstsc


    【解决方案1】:

    始终与 mstsc.exe 发送的内容有一个字节的差异。但是rd Session Broker对此非常敏感。

    在提出解决方案之前,我尝试了很多:在负载平衡字符串之前和之后添加空格、零宽度空格字符,如 u200B。但是rd经纪人没有接受。

    解决方案:

    在奇数字节的情况下,如果我们在正确的位置放置一个点 (U+002E),rd 会话代理可以提取目标 rd 集合所需的标识符,并且连接将正确建立。

    private void RdpLogic()
    {
        AdvancedSettings9.LoadBalanceInfo = ToLoadBalanceString($"tsv://MS Terminal Services Plugin.1.lbinfo");
    }
    
    private string ToLoadBalanceString(string loadBalanceInfo)
    {
        var temp = loadBalanceInfo;
        if (temp.Length % 2 == 1) temp = temp.Insert(temp.LastIndexOf('.') + 1, ".");
        var final =  Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(temp + "
    "));
    
        return final;
     }
    

    样本:

    ToLoadBalanceString("tsv://MS Terminal Services Plugin.1.even")
    

    结果: 'tsv://MS Terminal Services Plugin.1.even/r/n' 和

    ToLoadBalanceString("tsv://MS Terminal Services Plugin.1.odd")
    

    结果是 'tsv://MS Terminal Services Plugin.1..odd/r/n'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 2010-09-15
      • 2017-09-21
      相关资源
      最近更新 更多