远程桌面服务器场无法通过 DirectAccess (单/多站点)

本文有助于修复使远程桌面服务器(RDS)场在 Windows Server 2008 环境中不可用的问题。

原始 KB 数: 3123137

现象

假设出现了下面这种情景:

  • 你有一个 DirectAccess 环境(Edge 上的两个网络适配器、Edge 后面的两个网络适配器或 Edge 后面的单个网络适配器),包括强制隧道。
  • 你有用户通过 DirectAccess 隧道从外部网络连接到远程桌面服务部署。
  • 通过连接代理角色在 RDS 场上启用会话重定向。

在此方案中,所有重定向的 RDS 连接都失败。

原因

出现此问题的原因是远程桌面服务角色和服务无法识别 IPv6。 当客户端尝试连接到 RDS 部署时,连接代理将返回重定向数据包,其中包含客户端将重定向到的终结点 RDSH 的 IP 地址。 如果 RDSH 服务器只分配了 IPv4 地址,则连接代理仅返回此 IPv4 地址。 因此,客户端尝试通过 DA 隧道连接到 IPv4 地址,并且此操作会失败。

解决方法

先决条件

Windows 7 和 Windows 8.1 客户端必须安装以下更新才能通过 DA 连接连接到 RDP。 此更新修复了以下问题:如果连接到 IPv4 地址失败,客户端不会尝试连接到 IPv6 地址:

Windows 8.1 或 Windows 7 无法通过 DirectAccess 连接到远程桌面会话主机服务器场

若要解决此问题,必须启用和应用 IPv6 IP 地址,并且内部网络必须能够进行 IPv6 路由。 若要启用此功能,请使用以下方法之一:

  • 在远程桌面会话主机服务器上启用和使用 ISATAP 适配器。 请注意,此方法仅支持单个站点 DA 部署。 建议也不支持在包含多站点 DA 部署的环境中使用 ISATAP 适配器。
  • 应用“解决方法”部分中介绍的方法。

详细信息

有关与 DA 相关的更多修补程序,请参阅 Windows Server 2012 DirectAccess 和 Windows Server 2012 R2 DirectAccess 的建议修补程序和更新

解决方法

若要解决此问题,请执行以下步骤:

  1. 在 DA 服务器上的管理 PowerShell 提示符下,运行以下命令:

    Get-NetNatTransitionConfiguration
    

    注意

    记下前缀(它通常有 :7777::嵌入其中)。

  2. 根据你的 Windows Server 版本,将前缀注入到以下脚本中。 对于多个 DA 部署,请添加以逗号(,)分隔的每个后缀。 此外,还需要引号(“”)。

    对于 Windows Server 2012 及更高版本

    $prefix = ""
    $add = Get-NetIPAddress -AddressFamily IPv4 -Type Unicast -PrefixOrigin Manual
    foreach ($a in $add)
    {
    
    
    $n = ($a.IPAddress).Split(".")
    Clear-Variable c -ErrorAction SilentlyContinue
    $c;
    foreach($num in $n)
    {if ($c.Length -eq 4)
    {$c = $c + ":"
    }
    $c = $c + ("{0:X2}" -f [int]$num)
    }
    $ip = $prefix + $c;
    New-NetIPAddress -IPAddress $ip -InterfaceAlias $a.InterfaceAlias -AddressFamily IPv6 -PrefixLength 64 -Type Unicast
    }
    

    对于 Windows Server 2008 R2

    $prefix = ""
    $addresses = get-wmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { ($_.IPEnabled -eq $true) } | Select-object IPAddress,InterfaceIndex
    
    Write-Host "Prefix: $prefix" -ForegroundColor Yellow
    
    foreach ($address in $addresses)
    {
    
    $a = $address.IPAddress[0];
    $idx = $address.InterfaceIndex;
    
    $n = $a.ToString().Split(".")
    foreach($num in $n)
    {
    if ($c.Length -eq 4)
    {
    $c = $c + ":"
    }
    $c = $c + ("{0:X2}" -f [int]$num)
    }
    $ip = $prefix + $c;
    Clear-Variable c;
    Write-Host "Adding DNS64 IP : $a == $ip " -ForegroundColor Green
    netsh int ipv6 add address $idx $ip
    }
    
  3. 在所有 RDS 服务器上运行此脚本。 该脚本从网络适配器中选取静态 IP,生成 NAT64'd IPv6 地址,并将该地址分配给网络适配器。

数据收集

如果需要Microsoft支持方面的帮助,建议按照使用 TSS 收集信息中的 步骤收集用户体验问题来收集信息。