遠端桌面協定疑難排解

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

本文將介紹疑難排解和解決常見遠端桌面協定問題的一些提示與方法。

確認 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 的互動式連線,也會顯示特別管理控制台 (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 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 連線

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

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

連線至中繼資料伺服器 (169.254.169.254fd20:ce::254) 對於 Windows 執行個體的健康狀態至關重要。如果執行個體無法存取中繼資料伺服器,應用程式可能無法取得憑證,您也可能無法使用 RDP 連線至執行個體。

序列埠 1 主控台記錄中的訊息,可能會提供開機期間網路或服務故障的相關線索。舉例來說,請找出指出執行個體無法連線至中繼資料伺服器 (169.254.169.254fd20: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 執行個體,其中包含 Desktop Experience,而非 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,則遠端桌面協定連線會在發生以下任一情況時失敗:

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

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

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

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

%SystemRoot%\System32\mstsc.exe /admin

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

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

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

如果執行個體的客體環境和設定正確無誤,可能是執行個體上的作業系統設定有誤。此外,如果資源不足,可能無法建立遠端桌面連線。如要驗證作業系統層級設定,請連線至 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 執行個體的機型,以及增加永久磁碟的大小

檢查作業系統設定

連線至 VM 的 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"
    • 通過: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
    • Pass: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 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. 確認防毒軟體或端點保護用戶端設定允許所設定的通訊埠編號和服務。

  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 或記憶體使用率是否過高。如果資源耗盡,請考慮變更機型

確認工作階段逾時限制

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

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

登錄機碼:

  • MaxDisconnectionTime
  • MaxIdleTime
  • MaxConnectionTime
  • MaxDisconnectionTime
  • RemoteAppLogoffTimeLimit

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

排解 Windows 啟動問題

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

後續步驟