遠端桌面協定疑難排解


在某些情況下,您可能無法透過遠端桌面協定連線至 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 已順利啟動。嘗試使用遠端桌面協定重新連線至 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 上設定的通訊埠,用於透過遠端桌面協定連線

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

檢查您的 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 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 說明文件。或者,如果不需要遠端桌面服務,請解除安裝服務並使用一般遠端桌面協定連線。

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

如果執行個體的客體環境和設定正確無誤,可能是執行個體上的作業系統設定有誤。此外,如果資源不足,可能無法建立遠端桌面連線。如要驗證 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
    • 通過:介面名稱標示為「乙太網路」時,管理員狀態設為「已啟用」
    • 失敗:介面名稱標示為「乙太網路」,但管理員狀態設為「已停用」
    • 解決方法:啟用乙太網路轉換器:
      netsh interface set interface Ethernet admin=enabled
  2. 檢查執行個體是否具備有效 IP 設定:

    • 指令:
      ipconfig /all
    • 通過:乙太網路介面卡「乙太網路」會顯示執行個體所屬子網路的 IPv4 位址。
    • 失敗:沒有 IPv4 位址,或位址與 Google Cloud 控制台中顯示的位址不符。
    • 解決方法:繼續下一個步驟。
  3. 確認執行個體已啟用 DHCP:

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

    • 指令
      net localgroup "Remote Desktop Users"
    • 通過:(目標本機/網域使用者名稱在系統產生的清單中)
    • 失敗:(目標本機/網域使用者名稱不在清單中)
    • 解決方案:將「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
    • 通過: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. 確認防毒/端點保護用戶端設定是否允許您設定的通訊埠編號和服務。

確認工作階段逾時限制

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

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

登錄機碼:

  • MaxDisconnectionTime
  • MaxIdleTime
  • MaxConnectionTime
  • MaxDisconnectionTime
  • RemoteAppLogoffTimeLimit

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

排解 Windows 啟動問題

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

後續步驟