RDP 问题排查

在某些情况下,您可能无法通过 RDP 连接 Compute Engine Windows 虚拟机 (VM) 实例。导致此问题的原因可能包括配置错误、网络错误或者启动过程尚未完成。

本文档介绍排查和解决常见 RDP 问题的一些提示和方法。

确保虚拟机处于在线状态并已准备就绪

虚拟机完成启动(可能需要几分钟时间)后,请使用以下方法之一确认其状态:

串行端口 1

串行端口 1 用于记录系统和应用活动。查看其输出以确定您的虚拟机已完成启动以及服务是否已正常启动。

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击要查看其日志的虚拟机的名称。虚拟机实例详情页面随即打开。

  3. 在日志下,选择串行端口 1。

  4. 查看串行端口 1 的输出并查找类似于以下内容的输出:

    BdsDxe: loading Boot0003 "Windows Boot Manager" from HD(2,GPT,DD3FB000-7000-4000-8000-3977378A7000,0x0000,0x00000)/\EFI\Microsoft\Boot\bootmgfw.efi
    BdsDxe: starting Boot0003 "Windows Boot Manager" from HD(2,GPT,DD3FB000-7000-4000-8000-3977378A7000,0x0000,0x00000)/\EFI\Microsoft\Boot\bootmgfw.efi
    
    UEFI: Attempting to start image.
    Description: Windows Boot Manager
    FilePath: HD(2,GPT,DD3FB000-7000-4000-8000-3977378A7000,0x0000,0x00000)/\EFI\Microsoft\Boot\bootmgfw.efi
    OptionNumber: 3.
    
    2021/04/13 10:50:22 GCEGuestAgent: GCE Agent Started (version 20210128.00)
    2021-04-13T10:50:23.4621Z OSConfigAgent Info: OSConfig Agent (version 20210217.00.0+win@1) started.
    2021/04/13 10:50:42 GCEMetadataScripts: Starting startup scripts (version 20200129.00).
    2021/04/13 10:50:42 GCEMetadataScripts: No startup scripts to run.
    

包含 GCEGuestAgent 或 GCEMetadataScripts 的输出表明 Windows 已经成功启动。尝试使用 RDP 重新连接到虚拟机。

串行端口 2

串行端口 2 提供与虚拟机的交互式连接,还显示特殊管理控制台 (SAC) 的输出。您可以使用串行控制台 2 来确定系统服务是否已成功启动。

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击要查看其日志的虚拟机的名称。虚拟机实例详情页面随即打开。

  3. 在日志下,展开更多,然后点击串行端口 2(控制台)。

  4. 查看串行端口 2 输出并查找类似于以下内容的输出:

    BdsDxe: loading Boot0003 "Windows Boot Manager" from HD(2,GPT,DD3FB000-7000-4000-8000-3977378A7000,0x0000,0x00000)/\EFI\Microsoft\Boot\bootmgfw.efi
    BdsDxe: starting Boot0003 "Windows Boot Manager" from HD(2,GPT,DD3FB000-7000-4000-8000-3977378A7000,0x0000,0x00000)/\EFI\Microsoft\Boot\bootmgfw.efi
    
    UEFI: Attempting to start image.
    Description: Windows Boot Manager
    FilePath: HD(2,GPT,DD3FB000-7000-4000-8000-3977378A7000,0x0000,0x00000)/\EFI\Microsoft\Boot\bootmgfw.efi
    OptionNumber: 3.
    
    <machine-info>
    <name>WINDOWS</name>
    <guid>b7ab5000-4000-e000-e000-bc5a738da000</guid>
    <processor-architecture>AMD64</processor-architecture>
    <os-version>10.0</os-version>
    <os-build-number>17763</os-build-number>
    <os-product>Windows Server 2019 Datacenter</os-product>
    <os-service-pack>None</os-service-pack>
    </machine-info>
    Computer is booting, SAC started and initialized.
    Use the "ch -?" command for information about using channels.
    EVENT: The CMD command is now available.
    SAC>
    

包含 SAC started and initialized 或 CMD command is now available 的输出表明 Windows 已经成功启动。尝试使用 RDP 重新连接到虚拟机。

虚拟机屏幕截图

虚拟机屏幕截图可直观呈现虚拟机状态,类似于计算机显示器。

  1. 在捕获虚拟机的屏幕截图之前,必须先启用虚拟机的虚拟显示设备。如果您尚未启用虚拟显示设备,请参阅启用虚拟显示设备。

  2. 捕获一个屏幕截图。如需了解详情,请参阅从虚拟机捕获屏幕截图。

  3. 查看屏幕截图,查看实例是否已准备就绪。

将屏幕截图与下面的屏幕截图进行比较,以确定当前状态:

如果 Windows 几分钟后没有成功启动,请参阅 Windows 问题排查指南。

检查工作站与虚拟机实例之间的连接

如果您在连接 Windows 虚拟机时遇到问题,最好确定问题出在您用于连接的工作站上,还是出在您连接到的虚拟机上。通过从 Linux、macOS 或 Windows 工作站运行以下命令,检查工作站与虚拟机之间的连接:

curl -v telnet://DESTINATION_IP_ADDRESS:PORT

请替换以下内容:

  • DESTINATION_IP_ADDRESS:Windows 虚拟机的 IP 地址
  • PORT:为在 Windows 虚拟机上通过 RDP 进行连接配置的端口

您还可以使用 Connectivity Tests 进一步验证虚拟机实例与其他 Google Cloud 产品和服务之间的连接。此外,在同一子网上设置堡垒主机以隔离虚拟机实例上的 RDP 连接问题可能也很有用。

检查 Windows 实例密码

每个 Compute Engine Windows 实例都必须在网域或自定义映像��设置本地密码(如果尚未设置)。可以通过 Google Cloud CLI 命令行工具或 Google Cloud 控制台连接到虚拟机,确认已设置正确的密码。如需了解详情,请参阅连接到 Windows 虚拟机的 SAC。

如果您在连接时遇到问题,请尝试创建或重置密码。如需了解详情,请参阅为 Windows 虚拟机创建密码。

检查您是否使用的是 Windows Server Core

使用 RDP 进行连接时,如果您在空白背景上收到命令提示符窗口,这可能表明您正在使用 Windows Server Core。如需确认您是否在运行以下命令,请执行以下操作:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v InstallationType

输出中的 Server Core 确认您使用的是 Windows Core 版本。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    InstallationType    REG_SZ    Server Core

如果您的工作负载需要图形界面,请参阅创建包含 Desktop Experience 而不是 Server Core 的 Windows 实例。或者,您可以参阅 Microsoft 文档,了解如何管理 Windows Core 服务器。

检查您的 VPC 防火墙规则

Compute Engine 会自动使用允许 RDP 流量的防火墙规则来预配新项目。如果您使用已有项目或已修改过配置,则允许 RDP 的默认防火墙规则可能不存在。因此,请确认防火墙规则允许 RDP 流量连接到受影响实例所在的网络。

如需检查您的项目中是否存在 default-allow-rdp 防火墙规则,请查看“防火墙规则”页面或运行以下 gcloud CLI 命令:

gcloud compute firewall-rules list

如需创建新的防火墙规则(如果不存在),请使用以下命令:

gcloud compute firewall-rules create allow-rdp --allow tcp:3389

验证外部 IP 地址

确保您连接的是实例的正确外部 IP 地址。您可以从虚拟机实例页面或使用以下 gcloud CLI 命令查看实例的 IP:

gcloud compute instances list

使用 Windows 远程桌面服务 (RDS)

如果您的实例上安装了 Windows 远程桌面服务(以前称为“终端服务”),则系统会强制执行客户端访问许可 (CAL) 的条件。使用这些 CAL 时,RDP 连接将在以下任何条件下失败:

  • 您用完了所有可用许可
  • 您的许可已安装,但未正确配置或激活
  • 您的 RDS 试用期(180 天)已结束

有效许可数量不足的症状包括如下消息:

  • 此远程会话由于没有远程桌面许可服务器可用于提供许可而断开连接。
  • 此远程会话由于发生与终端服务器中的许可相关的错误而断开连接。
  • 此远程会话由于没有远程桌面客户端访问许可可用于此计算机而断开连接。

如果您的 RDP 连接失败,可以使用 admin 开关连接到实例以进行管理。您可以在 Windows 机器上通过使用远程桌面连接原生客户端执行此操作。

%SystemRoot%\System32\mstsc.exe /admin

按需 Windows Server 和 SQL Server 映像包含两个用于管理的并发远程桌面会话。

如需解决 RDP 连接问题,请为您的实例购买新的 RDS 许可。如需详细了解 CAL,请参阅 Microsoft 文档。或者,如果不需要使用远程桌面服务,请卸载该服务并使用常规 RDP 连接。

验证操作系统级别配置和资源

如果实例的客机环境和配置都正确,则实例上的操作系统可能未正确配置。此外,如果没有足够的资源,则可能无法建立 RDP 连接。如需验证操作系统级别配置,请连接到 Windows SAC:

确保虚拟机有足够的资源

验证 CPU、内存、磁盘用量和磁盘可用空间是否未达到其上限。您可以通过查看 Google Cloud 控制台中的可观测性指标来检查此数据。某些指标仅适用于安装了 Ops Agent 的虚拟机。或者,如果 Ops Agent 未安装,请在它连接到 SAC 时使用以下命令:

CPU 用量、内存用量、磁盘用量和磁盘容量

  • CPU 使用率:
    typeperf "\Processor(_Total)\% Processor Time" -sc 5
  • 内存用量:
    typeperf "\Memory\% Committed Bytes In Use" -sc 5
  • 磁盘使用量:
    typeperf "\LogicalDisk(*)\% Idle Time" -sc 5
  • 磁盘容量:
    fsutil volume diskfree C:

以下是 RDP 连接的建议资源用量,但这些只是估算值,在不同实例之间可能会有所不同。

  • CPU:<80%
  • 内存:<80%
  • 磁盘可用空间:>20%
  • 磁盘空闲空间:>50%

如果任何建议的估算值达到上限,您可以为虚拟机实例修改相应资源。如需修改虚拟机属性,请参阅如何修改虚拟机实例的机器类型和增加永久性磁盘的大小。

检查操作系统配置

连接到虚拟机的 SAC,并运行以下命令以确保实例接受连接:

  1. 检查以太网适配器是否已启用:

    • 命令:
      netsh interface show interface
    • 通过:管理员状态在标记为以太网的接口名称上设置为启用
    • 失败:管理员状态在标记为以太网的接口名称上设置为停用
    • 解决方案:启用以太网适配器:
      netsh interface set interface Ethernet admin=enabled
  2. 检查实例是否具有有效的 IP 配置:

    • 命令:
      ipconfig /all
    • 通过:以太网适配器的以太网显示实例分配到的子网的 IPv4 地址。
    • 未通过:没有 IPv4 地址,或者地址与 Google Cloud 控制台中显示的地址不一致。
    • 解决方案:继续执行下一步。
  3. 检查实例上是否已启用 DHCP:

    • 命令:
      netsh interface ipv4 show addresses
    • 通过:“以太网”下的输出包含“已启用 DHCP:是”。
    • 失败:“以太网”下的输出包含“已启用 DHCP:否”。
    • 解决方案:在以太网适配器上启用 DHCP:
      netsh interface ipv4 set address Ethernet dhcp
  4. 检查“远程桌面服务”是否正在运行:

    • 命令:
      net start | find "Remote Desktop Services"
    • 通过:远程桌面服务
    • 未通过:(输出中缺少远程桌面服务)
    • 解决方案:启动远程桌面服务:
      net start "Remote Desktop Services"
  5. 检查远程连接是否已启用:

    • 命令:
      reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
    • 通过:fDenyTSConnections REG_DWORD 0x0
    • 未通过:fDenyTSConnections REG_DWORD 0x1
    • 解决方案:在注册表中启用远程桌面连接:
      reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /f /v fDenyTSConnections /t REG_DWORD /d 0
  6. 确保 Windows 防火墙已启用远程桌面连接:

    • 命令:
      netsh advfirewall firewall show rule name="Remote Desktop - User Mode (TCP-In)"
    • 通过:已启用:是;方向:输入;配置文件:公共;分组:远程桌面;LocalIP:任意;RemoteIP:任意;协议:TCP;LocalPort:3389;RemotePort:任意;边缘遍历:否;操作:允许

    • 未通过:(出现意外结果,例如 enabled = No)

    • 解决方案:在 Windows 防火墙中启用默认的“远程桌面”防火墙规则:

      netsh advfirewall firewall set rule group="remote desktop" new enable=Yes

  7. 查看在远程实例上为 RDP 连接配置的端口号:

    • 命令:
      reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
    • 通过:PortNumber REG_DWORD [PORT NUMBER]
    • 未通过:(出现意外的端口号)
    • 解决方案:在 RDP 所需的注册表中配置端口号:

      reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /f /v PortNumber /t REG_DWORD /d [PORT NUMBER]

  8. 验证其他应用是否未尝试使用相同的端口:

    • 命令:
      netstat -ano | find "3389"
    • 通过:查找状态为“正在监听”的已分配 RDP 端口的条目。您可以通过以下命令使用进程标识符 (PID) 找到匹配的服务:
      tasklist /svc | find ""
      ,其中 PID 是上述命令中的标识符。输出应仅返回 Termservice。
    • 失败:除 Termservice 正在使用分配的端口以外的情况。
    • 解决方案:将应用/服务配置为使用其他端口号。
  9. 确保已连接的用户账号有权进行远程连接:

    • 命令:
      net localgroup "Remote Desktop Users"
    • 通过:(结果列表中有目标本地/网域用户名)
    • 未通过:(结果列表中缺少目标本地/网域用户名)
    • 解决方案:为网域中的用户添加“远程桌面用户”规则:

      net localgroup "Remote Desktop Users" /add [DOMAIN\USERNAME]

      只有加入其他网域的系统上的用户账号才需要网域。对于本地账号,仅需指定用户名。

  10. 验证客户端/服务器安全协商是否设置为其默认值:

    • 命令:
      reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer
    • 通过:SecurityLayer REG_DWORD 0x1
    • 未通过:SecurityLayer REG_DWORD 0x0(或 0x2)
    • 解决方案:在注册表中设置安全协商值:
      reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 1 /f
  11. 如果您的实例已连接到 Active Directory 域,但无法建立连接,您可能会在尝试访问该实例时收到以下错误:

    The remote computer that you are trying to connect to requires Network Level Authentication (NLA), but your Windows domain controller cannot be contacted to perform NLA.
    

    验证用户网络级身份验证 (NLA) 是否设置为其默认值:

    • 命令:
      reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication
    • 通过:UserAuthentication REG_DWORD 0x0
    • 未通过:UserAuthentication REG_DWORD 0x1
    • 解决方案:在注册表中设置网络级身份验证值:
      reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
  12. 确认您的 MTU 大小不超过网络的 MTU 大小:

    • 命令:
      netsh interface ipv4 show subinterfaces
    • 符合条件:如果 MTU 后的数字与 VPC 网络的 MTU 大小匹配。
    • 不符合条件:如果 MTU 后的数字大于 VPC 网络的 MTU 大小。
    • 解决方案:将接口的 MTU 设置为 VPC 网络的 MTU:

      netsh interface ipv4 set subinterface Ethernet mtu=MTU_OF_VPC_NETWORK

      如需详细了解 MTU 大小不兼容性,请参阅数据包碎片文档。

  13. 如果您尝试使用 RDP 连接到虚拟机,并且虚拟机显示键盘布局屏幕,则需要通过连接到 Windows SAC 来选择语言。如需选择语言,请完成以下步骤:

    1. 连接到 SAC。
    2. 输入 powershell 以打开 Powershell。
    3. 获取正确的语言字符串。

      Get-WinUserLanguageList
    4. 设置所需的布局。将 LANGUAGE_TAG 替换为所需的语言布局(例如 en-US)。

      Set-WinUserLanguageList -LanguageList LANGUAGE_TAG -force
    5. 重新启动实例。

      shutdown -r -t 0
  14. 对于登录屏幕上提及 you need the right to sign in through Remote Desktop Services 或 you must be granted the Allow log on through Terminal Services right 的 RDP 错误,远程桌面用户或管理员组已从允许通过远程桌面服务或 SeRemoteInteractiveLogonRight 登录SeRemoteInteractiveLogonRight中的本地计算机政策设置中移除。

  15. 验证是否未缺失进行证书身份验证所需的权限:

    • 命令:
      icacls.exe "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys"
    • 通过:输出类似 Everyone:(R,W) BUILTIN\Administrators:(F)
    • 失败:输出不匹配 Everyone:(R,W) BUILTIN\Administrators:(F)
  16. 确保您的杀毒软件/端点防护客户端设置允许使用已配置的端口号和服务。

验证会话超时限制

如果您能够建立 RDP 连接,但过了一段时间后断开连接,并显示消息提到“计时器已过期”,请验证以下值是否符合预期:

注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services

注册表项:

  • MaxDisconnectionTime
  • MaxIdleTime
  • MaxConnectionTime
  • MaxDisconnectionTime
  • RemoteAppLogoffTimeLimit

这些值以毫秒为单位进行设置。如果注册表中缺少这些键,则虚拟机实例没有会话限制。如果注册表中存在这些键,但其值设置为 0,则会话将永不过期。

Windows 启动问题排查

如果上述问题排查步骤无法解决 RDP 连接问题,可能是因为 Windows 实例无法正常启动或运行。在这种情况下,请查看我们 Windows 问题排查指南。

后续步骤