在 Compute Engine 上设置适用于 Windows 的 Chrome 远程桌面

Last reviewed 2022-11-16 UTC

本教程介绍了如何在 Compute Engine 中的 Microsoft Windows 虚拟机实例上设置 Chrome 远程桌面服务。如需了解 Linux 虚拟机的单独说明,请参阅 Linux 虚拟机。Chrome 远程桌面可让您从本地计算机或移动设备使用图形界面远程访问应用。

按照本教程操作时,默认防火墙规则允许 Chrome 远程桌面连接;您无需配置任何其他防火墙规则。

虚拟机需要访问互联网(通过外部 IP 地址或 Cloud NAT),您需要使用 Google 账号进行身份验证和授权。

下面介绍了两种设置 Chrome 远程桌面的方法:

  • 使用 Windows 远程桌面协议 (RDP) 的交互式方法。

    此方法要求可以使用 RDP 客户端直接从本地机器访问虚拟机,这在某些情况下可能无法实现。

  • 使用启动脚本的非交互式方法,启动脚本会在创建虚拟机时安装和配置 Chrome 远程桌面。

    如果您的防火墙阻止直接访问虚拟机,或者您无权访问 RDP 客户端(例如在 ChromeOS 上),则应使用此方法。

本教程假定您熟悉 Microsoft Windows 和 PowerShell 命令行。

如需了解创建虚拟工作站的其他选项,请参阅创建虚拟工作站

目标

  • 创建 Windows Compute Engine 虚拟机实例,以在其上运行 Chrome 远程桌面。
  • 在虚拟机实例上安装和配置 Chrome 远程桌面服务。
  • 从本地计算机连接到虚拟机实例上的桌面环境。

费用

本教程使用 Google Cloud 的以下收费组件:

  • Compute Engine

请使用价格计算器根据您的预计使用情况来估算费用。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Compute Engine API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Compute Engine API。

    启用 API

  8. 完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

  9. 确保您拥有项目的以下一个或多个角色: roles/compute.admin

    检查角色

    1. 在 Google Cloud 控制台中,前往 IAM 页面。

      转到 IAM
    2. 选择项目。
    3. 主账号列中,找到您的电子邮件地址所在的行。

      如果您的电子邮件地址不在此列,则表示您没有任何角色。

    4. 在您的电子邮件地址所在的行对应的角色列中,检查角色列表是否包含所需的角色。

    授予角色

    1. 在 Google Cloud 控制台中,前往 IAM 页面。

      转到 IAM
    2. 选择项目。
    3. 点击 授予访问权限
    4. 新的主账号字段中,输入您的电子邮件地址。
    5. 选择角色列表中,选择一个角色。
    6. 如需授予其他角色,请点击 添加其他角色,然后添加其他各个角色。
    7. 点击 Save(保存)。
  10. 在本地计算机上使用 Google Chrome 浏览器。
  11. 如果您要使用交互式方法,则您的本地机器需要具有 RDP 客户端,并且能够与远程虚拟机实例直接进行 RDP 连接。

使用 RDP 执行交互式安装

如需以交互方式安装 Chrome 远程桌面,您需要能够使用 RDP 客户端连接到远程虚拟机。在本教程中,您将在使用默认防火墙规则的默认 VPC 中创建虚拟机,该 VPC 会将 RDP 端口 3339 公开给互联网。

如果您的环境中实现不了,请使用本文档后面部分介绍的非交互式方法

创建 Compute Engine 实例

本教程中使用默认机器类型。如果您在自己的环境中使用此方法,可能需要调整机器类型、名称、区域、启动磁盘大小或其他设置。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面:

转到“虚拟机实例”

  1. 点击创建

  2. 将实例名称设置为 crdhost

  3. 选中启用显示设备复选框,因为 Chrome 远程桌面需要在 Windows 虚拟机上使用显示设备。

  4. 启动磁盘下,点击更改以打开启动磁盘面板。

  5. 操作系统列表中选择 Windows Server

  6. 版本列表中选择 Windows Server 2022 Datacenter

  7. 点击选择以关闭面板。

  8. 点击创建

Cloud Shell

  1. 打开 Cloud Shell。

    打开 Cloud Shell

  2. 设置您的首选区域:

    ZONE=us-central1-b
    REGION=us-central1
    gcloud config set compute/zone "${ZONE}"
    
  3. 使用 Windows Server 2022 Datacenter 的应用映像创建 Compute Engine 实例:

    gcloud compute instances create crdhost \
        --machine-type=e2-medium \
        --scopes=cloud-platform \
        --enable-display-device \
        --image-family=windows-2022 \
        --image-project=windows-cloud \
        --boot-disk-size=50GB \
        --boot-disk-device-name=crdhost
    

    此命令会创建一个 Windows Server 2022 虚拟机,该虚拟机挂接了一个显示设备(Windows 虚拟机上的 Chrome 远程桌面需要)和一个 50GB 的启动磁盘,并向实例授予了对 Google Cloud API 的完整访问权限。

    忽略磁盘性能警告,因为本教程不需要高性能。

使用 RDP 连接到虚拟机实例

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 确保 crdhost 实例名称旁边显示一个绿色对勾标记 ,表明该实例已准备就绪。

  3. 点击实例名称 crdhost,打开虚拟机实例详情页面。

  4. 远程访问下,点击设置 Windows 密码,然后点击设置,在远程机器上创建您的账号。

    此步骤会为您生成密码。记下此密码或将其复制到安全的临时文件中。

  5. 如需连接到远程实例,请点击 RDP 按钮旁边的箭头 ,然后选择下载 RDP 文件。您可以使用偏好的 RDP 客户端打开此 RDP 文件。

  6. 当 RDP 客户端提示输入密码时,请输入您之前生成的密码。

  7. 当系统提示您是否希望网络上的其他 PC 和设备可以发现您的计算机时,点击

  8. 关闭服务器管理器信息中心(如果已打开)。

安装 Chrome 远程桌面服务

下一步是在虚拟机实例上安装 Google Chrome 和 Chrome 远程桌面服务。

  1. 在 RDP 会话中,点击 Windows 任务栏上的开始,输入 PowerShell,然后选择 Windows PowerShell 应用。

  2. 在 PowerShell 提示符中,下载并运行 Chrome 远程桌面主机安装程序。

      $installer = "$env:TEMP\chromeremotedesktophost.msi"
      $uri = 'https://dl.google.com/edgedl/chrome-remote-desktop/chromeremotedesktophost.msi'
      (New-Object Net.WebClient).DownloadFile($uri,"$installer") && `
        Start-Process $installer -Wait && `
        Remove-Item $installer
    
  3. 收到系统提示时,确认您希望安装程序进行更改。

设置 Chrome 远程桌面服务

现在,您将生成一个 Windows 命令,用于启动 Chrome 远程桌面服务并将其关联到您的 Google 账号。

  1. 在本地计算机上,使用 Chrome 浏览器,转到 Chrome 远程桌面命令行设置页面

  2. 如果您尚未登录,请使用 Google 账号登录。这是将用于授权远程访问的账号。

  3. 再设置一台计算机页面上,点击开始,然后点击下一步

  4. 点击授权

    您需要允许 Chrome 远程桌面访问您的账号。当您批准访问后,该页面会显示几个命令行,其中一个用于 Windows (Powershell),如下所示:

    & "${Env:PROGRAMFILES(X86)}\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" `
    --code="4/ENCODED_AUTHENTICATION_TOKEN" `
    --redirect-url="https://remotedesktop.google.com/_/oauthredirect" `
    --name=$Env:COMPUTERNAME
    
  5. 点击复制 以将命令行复制到剪贴板。

  6. 在 RDP 会话中,在 Powershell 提示符处粘贴刚刚复制的命令行,然后按 Enter 键。

  7. 收到系统提示时,确认您希望应用进行更改。

  8. 出现提示时,输入一个 6 位数的 PIN 码。稍后连接时使用此号码进行额外的授权。

    命令完成后,系统便会启动远程桌面服务。

  9. 关闭 Powershell 窗口。

  10. 关闭 RDP 会话。

您现在可以使用 Chrome 远程桌面连接到虚拟机

非交互式安装

在此方法中,您可以配置虚拟机实例,让其具有在创建虚拟机时运行的启动脚本

使用此方法时,您无需直接通过互联网访问虚拟机,但它仍需要互联网访问权限。

向 Chrome 远程桌面服务授权

现在将生成一个 Windows 命令,供您稍后在专用脚本中使用。在此过程中,您需要提供命令中包含的授权信息。

  1. 在本地计算机上,使用 Chrome 浏览器,转到 Chrome 远程桌面命令行设置页面

  2. 如果您尚未登录,请使用 Google 账号登录。这是将用于授权远程访问的账号。

  3. 点击开始,然后点击下一步

  4. 点击授权

  5. 允许 Chrome 远程桌面访问您的账号。

    该页面现包含多个命令行,其中一个用于 Windows (Cmd),如下所示:

    "%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe"
    --code="4/ENCODED_AUTHENTICATION_TOKEN"
    --redirect-url="https://remotedesktop.google.com/_/oauthredirect"
    --name=%COMPUTERNAME%
    

    --code 标志包含唯一的短期有效的 OAuth 令牌。

    命令行中的授权代码仅在几分钟内有效,并且只能使用一次。

    让此页面保持打开状态。

将启动命令复制到 Cloud Shell

接下来,在 Cloud Shell 实例中创建一个文件,其中包含您刚刚生成的启动命令。

  1. 打开 Cloud Shell。

    打开 Cloud Shell

  2. 为启动命令创建文件:

    cat  > crd-auth-command.txt
    
  3. 转到包含 Chrome 远程桌面启动命令的页面,然后复制 Windows (Cmd) 命令行。

  4. 在 Cloud Shell 中,将命令粘贴到文件中。

  5. Enter 结束行,然后按 Ctrl-D 关闭文件。

创建启动脚本

  • 复制以下代码块并将其粘贴到 Cloud Shell 中。

    cat << "EOF" > crd-sysprep-script.ps1
    <#
        .SYNOPSIS
        GCESysprep specialize script for unattended Chrome Remote Desktop installation.
    #>
    $ErrorActionPreference = 'stop'
    
    function Get-Metadata([String]$metadataName) {
      try {
        $value = (Invoke-RestMethod `
            -Headers @{'Metadata-Flavor' = 'Google'} `
            -Uri "http://metadata.google.internal/computeMetadata/v1/instance/attributes/$metadataName")
      }
      catch {
        # Report but ignore REST errors.
        Write-Host $_
      }
      if ($value -eq $null -or $value.Length -eq 0) {
        throw "Metadata value for ""$metadataName"" not specified. Skipping Chrome Remote Desktop service installation."
      }
      return $value
    }
    
    # Get config from metadata
    #
    $crdCommand = Get-Metadata('crd-command')
    $crdPin = Get-Metadata('crd-pin')
    $crdName = Get-Metadata('crd-name')
    
    if ($crdPin -isNot [Int32] -or $crdPin -gt 999999 -or $crdPin -lt 0) {
      throw "Metadata ""crd-pin""=""$crdPin"" is not a 6 digit number. Skipping Chrome Remote Desktop service installation."
    }
    # Prefix $crdPin with zeros if required.
    $crdPin = $crdPin.ToString("000000");
    
    # Extract the authentication code and redirect URL arguments from the
    # remote dekstop startup command line.
    #
    $crdCommandArgs = $crdCommand.Split(' ')
    $codeArg = $crdCommandArgs | Select-String -Pattern '--code="[^"]+"'
    $redirectArg = $crdCommandArgs | Select-String -Pattern '--redirect-url="[^"]+"'
    
    if (-not $codeArg) {
      throw 'Cannot get --code= parameter from crd-command. Skipping Chrome Remote Desktop service installation.'
    }
    if (-not $redirectArg) {
      throw 'Cannot get --redirect-url= parameter from crd-command. Skipping Chrome Remote Desktop service installation.'
    }
    
    Write-Host 'Downloading Chrome Remote Desktop.'
    $installer = "$env:TEMP\chromeremotedesktophost.msi"
    $uri = 'https://dl.google.com/edgedl/chrome-remote-desktop/chromeremotedesktophost.msi'
    (New-Object Net.WebClient).DownloadFile($uri,"$installer")
    Write-Host 'Installing Chrome Remote Desktop.'
    & msiexec.exe /I $installer /qn /quiet | Out-Default
    Remove-Item $installer
    
    Write-Host 'Starting Chrome Remote Desktop service.'
    & "${env:ProgramFiles(x86)}\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" `
        $codeArg $redirectArg --name="$crdName" -pin="$crdPin" | Out-Default
    
    Write-Host 'Downloading Chrome.'
    $installer = "$env:TEMP\chrome_installer.exe"
    $uri = 'https://dl.google.com/chrome/install/latest/chrome_installer.exe'
    (New-Object Net.WebClient).DownloadFile($uri,"$installer")
    Write-Host 'Installing Chrome.'
    & $installer /silent /install | Out-Default
    Remove-Item $installer
    
    EOF
    

    此代码块是在创建虚拟机时运行的 PowerShell 脚本。它执行以下操作:

    • 下载并安装 Chrome 远程桌面主机服务。
    • 检索以下元数据参数:
      • crd-command - Windows 身份验证和启动命令。
      • crd-pin - 用于额外身份验证的 6 位数 PIN 码。
      • crd-name - 此实例的名称。
    • 配置并启动 Chrome 远程桌面主机服务。
    • 下载并安装 Chrome 浏览器。

创建新的 Windows 虚拟机

您现在可以使用之前创建的文件创建新的 Windows 虚拟机,以配置和设置 Chrome 远程桌面。

本教程中使用 e2-medium 机器类型。如果您在自己的环境中使用此方法,可能需要调整机器类型、名称、区域、启动磁盘大小或其他设置。

  1. 在 Cloud Shell 中,设置您的首选可用区:

    ZONE=us-central1-b
    REGION=us-central1
    gcloud config set compute/zone "${ZONE}"
    
  2. 为 Chrome 远程桌面设置一个 6 位数的 PIN 码用于额外的身份验证:

    CRD_PIN=your-pin
    

    your-pin 替换为 6 位数字。

  3. 为此虚拟机实例设置名称:

    INSTANCE_NAME=crdhost
    
  4. 创建实例:

    gcloud compute instances create ${INSTANCE_NAME} \
        --machine-type=e2-medium \
        --scopes=cloud-platform \
        --enable-display-device \
        --image-family=windows-2022 \
        --image-project=windows-cloud \
        --boot-disk-size=50GB \
        --boot-disk-device-name=${INSTANCE_NAME} \
        --metadata=crd-pin=${CRD_PIN},crd-name=${INSTANCE_NAME} \
        --metadata-from-file=crd-command=crd-auth-command.txt,sysprep-specialize-script-ps1=crd-sysprep-script.ps1
    

    此命令会在默认 VPC 中创建一个 Windows Server 2022 虚拟机,该虚拟机挂接了一个显示设备(Windows 虚拟机上的 Chrome 远程桌面需要)和一个 50GB 的启动磁盘,并为实例授予对 Google Cloud API 的完整访问权限。

    元数据值用于指定专用脚本、Windows 启动命令行以及启动 Chrome 远程桌面服务所需的参数。

监控虚拟机启动

要验证启动脚本是否成功,您可以在创建虚拟机的串行端口时检查其记录的消息。

  1. 在 Cloud Shell 中,显示虚拟机启动期间记录的消息:

    gcloud compute instances tail-serial-port-output ${INSTANCE_NAME}
    

    如果 Chrome 远程桌面配置成功,您会看到以下日志行:

    Found sysprep-specialize-script-ps1 in metadata.
    sysprep-specialize-script-ps1: Downloading Chrome Remote Desktop.
    sysprep-specialize-script-ps1: Installing Chrome Remote Desktop.
    sysprep-specialize-script-ps1: Downloading Chrome.
    sysprep-specialize-script-ps1: Installing Chrome.
    sysprep-specialize-script-ps1: Starting Chrome Remote Desktop service.
    Finished running specialize scripts.
    

    您可能还会看到以下行:

    sysprep-specialize-script-ps1: ... Failed to read 'C:\ProgramData\Google\Chrome Remote Desktop\host_unprivileged.json'.: The system cannot find the path specified. (0x3)
    

    这是正常现象,可以忽略。

    如果 Chrome 远程桌面服务启动失败,您会看到一条指示问题的错误消息,例如:

    sysprep-specialize-script-ps1: Couldn't start host: OAuth error.
    

    此错误表示来自 Chrome 远程桌面身份验证页面的 OAuth 令牌已不再有效,因为该令牌已被使用或已过期。

    如需更正此错误,请使用 RDP 进行连接并按照上述说明执行交互式设置,或者删除虚拟机并重试设置过程

    当您在串行端口监视器中看到以下消息时,就表示虚拟机已准备就绪。

    GCEInstanceSetup: ------------------------------------------------------------
    GCEInstanceSetup: Instance setup finished. crdhost is ready to use.
    GCEInstanceSetup: ------------------------------------------------------------
    
  2. Ctrl-C 可停止显示启动消息。

创建 Windows 用户账号

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击实例名称 crdhost,打开虚拟机实例详情页面。

  3. 远程访问下,点击设置 Windows 密码,然后点击设置,在远程机器上创建您的账号。

    此步骤会为您生成密码。记下用户名和密码,或将其复制到安全的临时文件中。

使用 Chrome 远程桌面连接到虚拟机实例

您可以使用 Chrome 远程桌面 Web 应用连接到虚拟机实例。

  1. 在本地计算机上,转到 Chrome 远程桌面网站。

  2. 点击访问我的计算机

  3. 如果您尚未登录 Google,请使用您用于设置 Chrome 远程桌面服务的同一 Google 账号进行登录。

    您可以在远程设备列表中看到此新虚拟机实例 crdhost

  4. 点击远程桌面实例的名称。

  5. 收到系统提示时,请输入您之前创建的 PIN 码,然后点击箭头 按钮进行连接。

    现在,您已连接到远程 Compute Engine 实例上的 Windows 登录屏幕。

  6. 如果出现提示,请始终允许远程桌面应用读取剪贴板,以便您可以在本地和远程应用之间复制和粘贴。

  7. 按任意键,然后输入之前生成的 Windows 用户的密码。注意,默认的远程键盘采用美式英语布局,因此输入的字符可能与当地键盘上的字符不匹配。您也无法复制和粘贴密码。

您现在已连接并登录到远程 Windows 桌面。

改善远程桌面体验

本部分介绍如何更改设置,以改善远程桌面体验。

安装远程桌面 Chrome 应用

远程桌面 Chrome 应用提供了单独的基于窗口的体验,允许在远程系统上使用通常被 Chrome 拦截的键盘快捷键。

如果未安装此应用,请执行以下操作:

  1. 使用将鼠标移动到窗口一侧时显示的按钮 打开会话选项面板。
  2. 安装应用部分,点击开始
  3. 点击安装

远程桌面会话会在单独的应用窗口中重新打开。

点击地址栏中的打开方式 图标,可以将任何远程桌面会话从 Chrome 标签页移至应用窗口。

提高屏幕分辨率

您可以修改默认的远程桌面分辨率,更好地满足本地计算机的桌面分辨率要求。

  1. 右键点击远程桌面的背景,然后选择显示设置
  2. 分辨率下拉列表中,选择其他屏幕分辨率。
  3. 在对话框中确认新的屏幕分辨率。

重新启用服务

如果您在客户端应用中错误地停用了与远程实例的连接,您可以按照设置 Chrome 远程桌面服务中的说明重新配置并重新启用服务。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除 Compute Engine 实例

作为删除整个项目的替代方法,您可以删除为本教程创建的虚拟机实例:

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面:

    转到“虚拟机实例”页面

  2. 选中您先前创建的实例名称 (crdhost) 旁边的复选框。

  3. 点击页面顶部的删除按钮:

    删除虚拟机实例。

    删除实例需要一些时间。

取消对实例的 Chrome 远程桌面授权

如果您不想再连接到该虚拟机实例,可以将其停用并从远程设备列表中移除。

  1. 在本地计算机上,前往 Chrome 远程桌面远程设备列表网站。
  2. 点击实例名称 crdhost 旁边的
  3. 点击确定以确认停用远程设备连接。

后续步骤