本文介绍在 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 社区支持提交产品反馈。