遠端桌面協定疑難排解


在某些情況下,您可能無法透過遠端桌面協定連線至 Compute Engine 上的 Windows 虛擬機器 (VM) 執行個體。這可能是因為設定錯誤、網路錯誤或啟動程序未完成所致。

本文件將針對常見遠端桌面協定問題,提供一些疑難排解提示和解決方法。

確保 VM 已連上網路且準備就緒

等待 VM 完成啟動 (可能需要幾分鐘) 後,請使用下列其中一種方法確認其狀態:

序列埠 1

序列埠 1 用於記錄系統和應用程式活動。查看其輸出內容,判斷 VM 是否已完成啟動,以及服務是否已正確啟動。

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下要查看記錄的 VM 名稱。系統會開啟 VM 執行個體詳細資料頁面。

  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.
    

輸出內容包含 GCEGuestAgentGCEMetadataScripts,表示 Windows 已成功啟動。請嘗試使用 RDP 重新連線至 VM。

序列埠 2

序列埠 2 可與 VM 進行互動連線,並顯示 Special Administrative Console (SAC) 的輸出內容。您可以使用序列控制台 2,判斷系統服務是否已成功啟動。

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 按一下要查看記錄的 VM 名稱。系統會開啟 VM 執行個體詳細資料頁面。

  3. 在「Logs」(記錄) 下方,展開「More」(更多),然後按一下「Serial port 2 (console)」(序列埠 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 initializedCMD command is now available 時,表示 Windows 已成功啟動。請嘗試使用 RDP 重新連線至 VM。

VM 螢幕截圖

VM 螢幕截圖可視覺化呈現 VM 的狀態,類似電腦螢幕。

  1. 您必須先啟用 VM 的虛擬顯示裝置,才能擷取 VM 的螢幕截圖。如果您尚未啟用虛擬顯示器,請參閱啟用虛擬顯示器

  2. 擷取螢幕截圖。詳情請參閱「從 VM 擷取螢幕截圖」。

  3. 查看螢幕截圖,確認執行個體是否已就緒。

請將螢幕截圖與下列畫面進行比較,判斷目前狀態:

如果 Windows 在幾分鐘後仍未順利啟動,請參閱 Windows 疑難排解指南。

檢查工作站和 VM 執行個體之間的連線能力

如果在連線 Windows VM 時遇到問題,建議您先確認問題是出在用來連線的工作站,還是連線的 VM。在 Linux、macOS 或 Windows 工作站執行下列指令,檢查工作站和 VM 之間的連線能力:

curl -v telnet://DESTINATION_IP_ADDRESS:PORT

更改下列內容:

  • DESTINATION_IP_ADDRESS:Windows VM 的 IP 位址
  • PORT:在 Windows VM 上透過 RDP 連線時所設定的通訊埠

您也可以使用連線測試進一步驗證 VM 執行個體與其他 Google Cloud 產品和服務之間的連線狀態。此外,在相同子網路上設定防禦主機,也許也有助於隔離 VM 執行個體上的 RDP 連線問題。

檢查您的 Windows 執行個體密碼

如果 Compute Engine 的 Windows 執行個體並非位於網域或自訂映像檔上,則每個執行個體都須設有本機密碼。請透過 Google Cloud CLI 指令列工具或 Google Cloud 主控台連線至 VM,確認您已設有正確密碼。詳情請參閱「連線至 Windows VM 的 SAC」。

如果無法連線,請嘗試建立或重設密碼。詳情請參閱「為 Windows 虛擬機建立密碼」。

檢查是否使用 Windows Server Core

使用 RDP 連線時,如果您在空白背景上看到 Command Prompt 視窗,這可能表示您正在使用 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

如果工作負載需要圖形使用者介面,請考慮建立 Windows 執行個體,其中包含桌面體驗,而非 Server Core。或者,您也可以參閱 Microsoft 說明文件,瞭解如何管理 Windows Core 伺服器

檢查您的虛擬私人雲端防火牆規則

Compute Engine 會自動為新專案佈建允許遠端桌面協定流量的防火牆規則。如果您目前已有專案,或已修改過設定,則允許遠端桌面協定的預設防火牆規則可能並不存在。因此,請確認有規則允許遠端桌面協定流量連線至受影響執行個體所在的網路。

如要檢查您的專案是否有 default-allow-rdp 防火牆規則,請查看「Firewall rules」(防火牆規則) 頁面,或執行以下 gcloud CLI 指令:

gcloud compute firewall-rules list

如果專案中沒有上述規則,請使用以下指令建立規則:

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

驗證外部 IP 位址

確認您是連線至執行個體的正確外部 IP 地址。如要查看執行個體的 IP,請前往「VM 執行個體」頁面,或使用以下 gcloud CLI 指令:

gcloud compute instances list

使用 Windows 遠端桌面服務 (RDS)

如果您的執行個體上已安裝 Windows 遠端桌面服務 (先前稱為終端機服務),則系統會強制執行用戶端存取使用權 (CAL)。若是具有 CAL,則遠端桌面協定連線會在發生以下任一情況時失敗:

  • 您的可用授權已全數用盡
  • 授權已安裝,但未正確設定或啟用
  • 您的 RDS 試用期 (180 天) 已到期

您可能沒有足夠有效授權的症狀包括:

  • 由於沒有可提供授權的遠端桌面授權伺服器,因此這個遠端工作階段已中斷。
  • 由於終端機伺服器的授權相關錯誤,導致遠端工作階段中斷。
  • 這台電腦沒有可用的遠端桌面用戶端存取授權,因此遠端工作階段已中斷連線。

為了進行管理,若您的遠端桌面協定連線失敗,可使用 /admin 參數連線至執行個體。您可以使用原生遠端桌面連線用戶端在 Windows 機器完成這項作業。

%SystemRoot%\System32\mstsc.exe /admin

在 Windows Server 和 SQL Server 映像檔中,您可以同時開啟兩個用於管理的遠端桌面工作階段。

如要解決 RDP 連線相關問題,請為您的執行個體購買新的 RDS 授權。如要進一步瞭解 CAL,請參閱 Microsoft 說明文件。或者,如果不需要遠端桌面服務,請解除安裝服務並使用一般遠端桌面協定連線。

驗證作業系統層級設定和資源

如果執行個體的訪客環境和設定正確,則執行個體上的作業系統可能設定錯誤。此外,如果資源不足,可能無法建立 RDP 連線。如要驗證 OS 層級設定,請連線至 Windows SAC

確認 VM 有足夠的資源

確認 CPU、記憶體、磁碟用量和可用磁碟空間未達上限。您可以在 Google Cloud 主控台中查看可觀察度指標,檢查這類資料。部分指標僅適用於已安裝作業套件代理程式的 VM。或者,如果未安裝 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%

如果任何建議的預估值都達到上限,您可以修改 VM 執行個體的資源。如要編輯 VM 屬性,請參閱如何編輯 VM 執行個體的機器類型增加永久磁碟的大小

檢查作業系統設定

連線至 VM 的 SAC,然後執行下列指令,確認執行個體會接受連線:

  1. 檢查是否已啟用乙太網路轉換器:

    • 指令:
      netsh interface show interface
    • 通過:在標示為「Ethernet」的介面名稱上,將管理狀態設為「已啟用」
    • 失敗:在標示為「乙太網路」的介面名稱上,管理狀態設為「停用」
    • 解決方法:啟用乙太網路轉換器:
      netsh interface set interface Ethernet admin=enabled
  2. 檢查執行個體是否有有效的 IP 設定:

    • 指令:
      ipconfig /all
    • 通過:乙太網路轉換器 Ethernet 會顯示執行個體指派的子網路的 IPv4 位址。
    • 失敗:沒有 IPv4 位址,或位址與 Google Cloud 控制台 中顯示的位址不符。
    • 解決方法:請繼續下一個步驟。
  3. 檢查是否已在執行個體上啟用 DHCP:

    • 指令:
      netsh interface ipv4 show addresses
    • 通過:「Ethernet」下方的輸出內容包含「DHCP Enabled: Yes」
    • 失敗:「Ethernet」下方的輸出內容包含「DHCP Enabled: No」
    • 解決方案:在乙太網路轉換器上啟用 DHCP:
      netsh interface ipv4 set address Ethernet dhcp
  4. 檢查遠端桌面服務是否正在執行:

    • 指令:
      net start | find "Remote Desktop Services"
    • 通過:Remote Desktop Service
    • 失敗:(輸出結果中沒有 Remote Desktop Service)
    • 解決方案:啟動遠端桌面服務:
      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)"
    • 通過:Enabled:Yes, Direction: In, Profiles: Public, Grouping: Remote Desktop, LocalIP: Any, RemoteIP: Any, Protocol:TCP, LocalPort: 3389, RemotePort: Any, Edge traversal: No, Action: Allow

    • 失敗:(意外結果,例如 enabled = No)

    • 解決方案:在 Windows 防火牆中啟用預設的「遠端桌面」防火牆規則:

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

  7. 檢查遠端執行個體上為遠端桌面協定連線設定的通訊埠編號為何:

    • 指令
      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 通訊埠的項目,其狀態為「Listening」。您可以使用下列指令,透過程序 ID (PID) 找出相符的服務:
      tasklist /svc | find ""
      ,其中 PID 是上一個指令中的 ID。輸出內容應只傳回 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
    • 解決方法:在登錄檔中設定「Network Level Authentication」值:
      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 後面的數字大於虛擬私有雲網路的 MTU。
    • 解決方法:將介面的 MTU 設為虛擬私有雲網路的 MTU:

      netsh interface ipv4 set subinterface Ethernet mtu=MTU_OF_VPC_NETWORK

      如要進一步瞭解 MTU 大小的不相容情形,請參閱封包分段說明文件。

  13. 如果您嘗試使用 RDP 連線至 VM,而 VM 顯示鍵盤版面配置畫面,您必須連線至 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. 如果登入畫面上的 RDP 錯誤訊息提到 you need the right to sign in through Remote Desktop Servicesyou must be granted the Allow log on through Terminal Services right,則「允許透過遠端桌面服務登入」SeRemoteInteractiveLogonRight 中的「本機電腦」政策設定會移除「遠端桌面使用者」或「管理員」群組。

  15. 確認沒有缺少權限而導致憑證驗證失敗:

    • 指令
      icacls.exe "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys"
    • 通過:輸出內容類似於「Everyone:(R,W) BUILTIN\Administrators:(F)」
    • 失敗:輸出內容不符合 Everyone:(R,W) BUILTIN\Administrators:(F)
  16. 確認防毒/端點保護用戶端設定是否允許您設定的通訊埠編號和服務。

確認工作階段逾時限制

如果您可以建立 RDP 連線,但在一段時間後會斷線,並顯示「Timer Expired」訊息,請確認下列值是否符合預期:

登錄檔路徑:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services

登錄機碼:

  • MaxDisconnectionTime
  • MaxIdleTime
  • MaxConnectionTime
  • MaxDisconnectionTime
  • RemoteAppLogoffTimeLimit

這些值以毫秒為單位。如果登錄檔中缺少這些金鑰,則 VM 執行個體就沒有工作階段限制。如果這些鍵存在於您的登錄檔中,但其值設為 0,則您的工作階段將永遠不會到期。

排解 Windows 啟動問題

如果上述疑難排解步驟無法解決 RDP 連線問題,您的 Windows 執行個體可能無法正常啟動或執行。在這種情況下,請參閱疑難排解 Windows的指南。

後續步驟