遠端桌面協定疑難排解

在某些情況下,您可能無法透過 RDP 連線至 Compute Engine Windows 虛擬機器 (VM) 執行個體。這可能是因為設定錯誤、網路錯誤,或是開機程序尚未完成。

本文說明多項提示和方法,協助您排解及解決常見的 RDP 問題。

確保 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.
    

如果輸出內容包含 GCEGuestAgent 或 GCEMetadataScripts,表示 Windows 已順利啟動。嘗試使用 RDP 重新連線至 VM。

序列埠 2

序列埠 2 提供與 VM 的互動式連線,也會顯示特殊管理控制台 (SAC) 的輸出內容。您可以使用序列控制台 2,判斷系統服務是否已順利啟動。

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

    前往 VM 執行個體

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

  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 重新連線至 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 連線的通訊埠

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

檢查與中繼資料伺服器的連線

Windows 執行個體必須連線至中繼資料伺服器 (169.254.169.254 或 fd20:ce::254),才能正常運作。如果執行個體無法存取中繼資料伺服器,應用程式可能無法取得憑證,您也可能無法使用 RDP 連線至執行個體。

序列埠 1 控制台記錄中的訊息,可能會提供開機期間網路或服務故障的線索。例如,尋找指出執行個體無法連線至中繼資料伺服器 (169.254.169.254 或 fd20:ce::254) 的錯誤。

如果執行個體檢查通過,但您仍然無法連上中繼資料伺服器,請按照「排解中繼資料伺服器存取問題」一文的步驟操作,測試並解決連線問題。

使用 RDP 疑難排解指令碼

Google 提供的 Windows VM 執行個體包含診斷指令碼,可自動執行本文件中的許多檢查。

  1. 連線至 Windows VM 的 SAC。
  2. 輸入 powershell 開啟 PowerShell。
  3. 執行下列指令來啟動診斷程序:

    powershell -file "C:\Program Files\Google\Compute Engine\diagnostics\rdp_status.ps1" | more
    
  4. 查看輸出內容是否有「FAIL」結果,並套用建議的解決方案。

檢查您的 Windows 執行個體密碼

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

如果無法連線,請嘗試建立或重設密碼。詳情請參閱「管理 Windows VM 上的帳戶和憑證」。

確認是否使用 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

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

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

Compute Engine 會自動為新專案佈建允許 RDP 流量的防火牆規則。如果您有現有專案,或已修改設定,則可能不存在允許 RDP 的預設防火牆規則。確認規則允許 RDP 流量連線至受影響執行個體所在的網路。

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

gcloud compute firewall-rules list

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

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

驗證外部 IP 位址

請確認您連線至執行個體的正確外部 IP 位址。從VM 執行個體頁面查看執行個體的 IP,或使用下列 gcloud CLI 指令:

gcloud compute instances list

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

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

  • 您已用完所有可用授權
  • 授權已安裝,但設定或啟用有誤
  • 您的 RDS 180 天試用期已結束

如果有效授權不足,您可能會收到以下訊息:

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

如果 RDP 連線失敗,您可以使用管理員切換選項連線至執行個體,以進行管理。在 Windows 電腦上,您可以使用內建的遠端桌面連線用戶端執行這項操作。

%SystemRoot%\System32\mstsc.exe /admin

隨選 Windows Server 和 SQL Server 映像檔包含兩個用於管理的並行遠端桌面工作階段。

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

驗證 OS 層級設定和資源

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

確認 VM 有足夠的資源

確認 CPU、記憶體、磁碟用量和可用磁碟空間未達上限。如要檢查這項資料,請在 Google Cloud 控制台中查看可觀測性指標。部分指標僅適用於已安裝Ops Agent的 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 執行個體的機型和增加永久磁碟的大小。

檢查 OS 設定

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

  1. 確認乙太網路轉換器已啟用:

    • 指令:
      netsh interface show interface
    • 通過:在標示為「Ethernet」的介面名稱上,管理員狀態設為「Enabled」
    • 失敗:在標示為「Ethernet」的介面名稱上,管理員狀態設為「Disabled」
    • 解決方案:啟用乙太網路介面卡:
      netsh interface set interface Ethernet admin=enabled
  2. 確認執行個體具備有效的 IP 設定:

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

    • 指令:
      netsh interface ipv4 show addresses
    • 通過:「乙太網路」下方的輸出內容包含「已啟用 DHCP:是」。
    • 失敗:「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 通訊埠的項目,狀態為「正在接聽」。您可以使用下列指令,透過程序 ID (PID) 找出相符的服務:
      tasklist /svc | find ""
      其中 PID 是前一個指令的 ID。輸出內容應只會傳回 Termservice。
    • 失敗:除了 Termservice 以外,任何項目都使用指派的通訊埠。
    • 解決方法:將應用程式或服務設定為使用其他連接埠號碼。
  9. 確認已連線的使用者帳戶具備遠端連線的權限:

    • 指令:
      net localgroup "Remote Desktop Users"
    • Pass:(結果清單中的目標本機或網域使用者名稱)
    • 失敗:(缺少目標本機或網域使用者名稱)
    • 解決方案:為網域中的使用者新增「遠端桌面使用者」規則:

      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
    • Pass: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 後方的數字與虛擬私有雲網路的 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 Services 或 you must be granted the Allow log on through Terminal Services right,表示「遠端桌面使用者」或「管理員」群組已從「允許透過遠端桌面服務登入」或「SeRemoteInteractiveLogonRight」SeRemoteInteractiveLogonRight的本機電腦政策設定中移除。

  15. 確認沒有缺少權限,導致憑證驗證受阻:

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

  17. CredSSP 加密 Oracle 補救錯誤:如果收到提及「CredSSP 加密 Oracle 補救」的錯誤訊息,請確認工作站和 VM 執行個體都已安裝最新的 Windows 更新。

  18. 內部錯誤代碼 0x4:如果連線失敗並顯示「錯誤代碼:0x4」,請確認伺服器已啟用 TLS 1.2。如要查看登記資料,請前往 HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client。

  19. 錯誤碼 0x108:如果收到「錯誤碼:0x108 (兩部電腦無法在指定時間內連線)」,請檢查可觀測性指標,確認 CPU 或記憶體使用率是否過高。如果資源耗盡,請考慮變更機型。

確認工作階段逾時限制

如果可以建立 RDP 連線,但過一段時間後連線中斷,並顯示「計時器已過期」訊息,請確認下列值是否符合預期:

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

登錄機碼:

  • MaxDisconnectionTime
  • MaxIdleTime
  • MaxConnectionTime
  • MaxDisconnectionTime
  • RemoteAppLogoffTimeLimit

這些值的單位為毫秒。如果登錄檔中缺少這些金鑰,VM 執行個體就不會有工作階段限制。如果登錄檔中存在這些金鑰,但值設為 0,工作階段就不會過期。

排解 Windows 啟動問題

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

後續步驟