本文介绍在 Azure Microsoft 尝试连接到虚拟机 (VM) 时可能会遇到的错误。

无法使用远程桌面协议 (RDP) 连接到 Azure VM。 连接停滞在 “配置远程” 部分,或者你收到以下错误消息:

  • RDP 内部错误
  • 发生内部错误
  • 此计算机无法连接到远程计算机。 尝试再次连接。 如果问题仍然存在,请与远程计算机的所有者或网络管理员联系
  • 出现此问题的原因可能如下:

  • 虚拟机可能受到攻击。
  • 无法访问本地 RSA 加密密钥。
  • TLS 协议已禁用。
  • 证书已损坏或已过期。
  • 若要解决此问题,请完成以下部分中的步骤。 在开始之前,请创建受影响 VM 的 OS 磁盘的快照作为备份。 有关详细信息,请参阅 为磁盘创建快照

    检查 RDP 安全性

    首先,检查 RDP 端口 3389 的网络安全组是否不安全, (打开) 。 如果它不安全,并且显示为 * 作为入站的源 IP 地址,请将 RDP 端口限制为特定用户的 IP 地址,然后测试 RDP 访问。 如果此操作失败,请完成下一部分中的步骤。

    使用串行控件

    使用串行控制台或通过 将 VM 的 OS 磁盘附加到恢复 VM 来脱机修复 VM。

    首先,请连接到 串行控制台并打开 PowerShell 实例 。 如果未在 VM 上启用串行控制台,请转到 修复 VM 脱机 部分。

    步骤:1 检查 RDP 端口

  • 在 PowerShell 实例中,使用 NETSTAT 检查端口 3389 是否由其他应用程序使用:

    Netstat -anob |more
    
  • 如果Termservice.exe使用 3389 端口,请转到步骤 2。 如果 Termservice.exe 以外的其他服务或应用程序使用 3389 端口,请执行以下步骤:

  • 停止使用 3389 服务的应用程序的服务:

    Stop-Service -Name <ServiceName> -Force
    
  • 启动终端服务:

    Start-Service -Name Termservice
    
  • 更改端口:

    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -name PortNumber -value <Hexportnumber>
    Stop-Service -Name Termservice -Force
    Start-Service -Name Termservice
    
  • 为新端口设置防火墙:

    Set-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" -LocalPort <NEW PORT (decimal)>
    
  • 更新 Azure 门户 RDP 端口中新端口的网络安全组

    Set-Location Cert:\LocalMachine $RdpCertThumbprint = 'Cert:\LocalMachine\Remote Desktop\'+((Get-ChildItem -Path 'Cert:\LocalMachine\Remote Desktop\').thumbprint) Remove-Item -Path $RdpCertThumbprint Stop-Service -Name "SessionEnv" Start-Service -Name "SessionEnv"
  • 如果无法使用此方法续订证书,请尝试远程续订 RDP 自签名证书:

  • 从连接到遇到问题的 VM 的工作 VM 中,在“运行”框中键入 mmc 以打开Microsoft管理控制台。

  • 在“ 文件 ”菜单上,依次选择“ 添加/删除管理单元”、“ 证书”和“ 添加”。

  • 选择“ 计算机帐户”,选择“ 另一台计算机”,然后添加问题 VM 的 IP 地址。

  • 转到 “远程桌面\证书 ”文件夹,右键单击该证书,然后选择“ 删除”。

  • 在串行控制台中的 PowerShell 实例中,重启远程桌面配置服务:

    Stop-Service -Name "SessionEnv"
    Start-Service -Name "SessionEnv"
    md c:\temp
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\BeforeScript_permissions.txt 
    takeown /f "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /a /r
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\System:(F)"
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "BUILTIN\Administrators:(F)"
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\AfterScript_permissions.txt 
    Restart-Service TermService -Force
    
  • 重启 VM,然后尝试启动与 VM 的远程桌面连接。 如果错误仍然存在,请转到下一步。

    步骤 3:启用所有受支持的 TLS 版本

    RDP 客户端使用 TLS 1.0 作为默认协议。 但是,这可以更改为 TLS 1.1,这已成为新标准。 如果在 VM 上禁用 TLS 1.1,连接将失败。

  • 在 CMD 实例中,启用 TLS 协议:

    reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 1 /f
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 1 /f
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
    
  • 若要防止 AD 策略覆盖更改,请暂时停止组策略更新:

    REG add "HKLM\SYSTEM\CurrentControlSet\Services\gpsvc" /v Start /t REG_DWORD /d 4 /f
    
  • 重启 VM,使更改生效。 如果问题得到解决,请运行以下命令以重新启用组策略:

    sc config gpsvc start= auto sc start gpsvc
    gpupdate /force
    

    如果还原更改,则表示公司域中存在 Active Directory 策略。 必须更改该策略以避免此问题再次发生。

    修复 VM 脱机

    将 OS 磁盘附加到恢复 VM

  • 将 OS 磁盘附加到恢复 VM
  • 将 OS 磁盘附加到恢复 VM 后,请确保磁盘在磁盘管理控制台中标记为 “联机 ”。 记下分配给附加 OS 磁盘的驱动器号。
  • 启动到恢复 VM 的远程桌面连接。
  • 启用转储日志和串行控制台

    若要启用转储日志和串行控制台,请运行以下脚本。

  • 打开提升的命令提示符会话 (以管理员身份运行) 。

  • 运行以下脚本:

    在此脚本中,我们假定分配给附加 OS 磁盘的驱动器号为 F。请将此驱动器号替换为 VM 的相应值。

    reg load HKLM\BROKENSYSTEM F:\windows\system32\config\SYSTEM
    REM Enable Serial Console
    bcdedit /store F:\boot\bcd /set {bootmgr} displaybootmenu yes
    bcdedit /store F:\boot\bcd /set {bootmgr} timeout 5
    bcdedit /store F:\boot\bcd /set {bootmgr} bootems yes
    bcdedit /store F:\boot\bcd /ems {<BOOT LOADER IDENTIFIER>} ON
    bcdedit /store F:\boot\bcd /emssettings EMSPORT:1 EMSBAUDRATE:115200
    REM Suggested configuration to enable OS Dump
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\CrashControl" /v DumpFile /t REG_EXPAND_SZ /d "%SystemRoot%\MEMORY.DMP" /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\CrashControl" /v NMICrashDump /t REG_DWORD /d 1 /f
    reg unload HKLM\BROKENSYSTEM
    

    重置 MachineKeys 文件夹的权限

  • 打开提升的命令提示符会话 (以管理员身份运行) 。

  • 运行以下脚本。 在此脚本中,我们假定分配给附加 OS 磁盘的驱动器号为 F。请将此驱动器号替换为 VM 的相应值。

    Md F:\temp
    icacls F:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\BeforeScript_permissions.txt
    takeown /f "F:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /a /r
    icacls F:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\System:(F)"
    icacls F:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
    icacls F:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "BUILTIN\Administrators:(F)"
    icacls F:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\AfterScript_permissions.txt
    

    启用所有支持的 TLS 版本

  • 打开提升的命令提示符会话 (以管理员身份运行) ,然后运行以下命令。 以下脚本假定分配给附加的 OS 磁盘的驱动程序号为 F。将此驱动器号替换为 VM 的相应值。

  • 检查已启用哪个 TLS:

    reg load HKLM\BROKENSYSTEM F:\windows\system32\config\SYSTEM
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
    
  • 如果密钥不存在,或者其值为 0,请通过运行以下脚本来启用协议:

    REM Enable TLS 1.0, TLS 1.1 and TLS 1.2
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
    
  • 启用 NLA:

    REM Enable NLA
    REG ADD "HKLM\BROKENSYSTEM\ControlSet001\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 1 /f
    REG ADD "HKLM\BROKENSYSTEM\ControlSet002\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 1 /f
    reg unload HKLM\BROKENSYSTEM
    
  • 分离 OS 磁盘并重新创建 VM,然后检查问题是否已解决。

    联系我们寻求帮助

    如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 社区支持提交产品反馈。

  •