Citrix DaaS™

连接到 Microsoft Azure

注意:

自 2023 年 7 月起,Microsoft 已将 Azure Active Directory (Azure AD) 重命名为 Microsoft Entra ID。本文档中,任何对 Azure Active Directory、Azure AD 或 AAD 的引用现在均指 Microsoft Entra ID。

创建和管理连接及资源介绍了用于创建连接的向导。以下信息涵盖了 Azure Resource Manager 云环境特有的详细信息。

注意:

在创建到 Microsoft Azure 的连接之前,您必须将 Azure 帐户设置为资源位置。请参阅 Microsoft Azure Resource Manager 虚拟化环境

创建服务主体和连接

在创建连接之前,您必须设置连接用于访问 Azure 资源的服务主体。您可以通过两种方式创建连接:

  • 使用 Studio 同时创建服务主体和连接
  • 使用之前创建的服务主体创建连接

本部分将向您展示如何完成以下任务:

注意事项

开始之前,请注意以下事项:

  • Citrix® 建议使用具有 参与者 角色的服务主体。但是,请参阅最低权限部分以获取最低权限列表。
  • 创建第一个连接时,Azure 会提示您授予必要的权限。对于将来的连接,您仍然需要进行身份验证,但 Azure 会记住您之前的同意,并且不会再次显示提示。
  • 首次通过 Azure 身份验证后,Citrix 拥有的多租户应用程序(ID: 08b70dc3-76c5-4611-ba7d-3312ba36cb2b)将代表经过身份验证的帐户邀请到您的 Azure Active Directory。
  • 用于身份验证的帐户必须具有使用 Azure RBAC 在订阅中分配角色的权限。例如,订阅的所有者、基于角色的访问控制管理员或用户访问管理员。
  • 用于身份验证的帐户必须是订阅目录的成员。需要注意两种类型的帐户:“工作或学校”帐户和“个人 Microsoft 帐户”。有关详细信息,请参阅 CTX219211
  • 虽然您可以通过将现有 Microsoft 帐户添加为订阅目录的成员来使用它,但如果该用户之前被授予了对目录中某个资源的来宾访问权限,则可能会出现复杂情况。在这种情况下,他们可能在目录中有一个占位符条目,该条目未授予他们必要的权限,并且会返回错误。

    通过从目录中删除资源并显式地将其添加回来来纠正此问题。但是,请谨慎使用此选项,因为它可能会对该帐户可以访问的其他资源产生意外影响。

  • 存在一个已知问题,即某些帐户在实际上是成员时被检测为目录来宾。此类配置通常发生在较旧的已建立的目录帐户中。解决方法:向目录添加一个帐户,该帐户将采用正确的成员身份值。
  • 资源组只是资源的容器,它们可以包含来自其自身区域以外的区域的资源。如果您期望资源组区域中显示的资源可用,这可能会造成混淆。
  • 确保您的网络和子网足够大,可以容纳您所需的计算机数量。这需要一些远见,但 Microsoft 会帮助您指定正确的值,并提供有关地址空间容量的指导。

使用 Studio 创建服务主体和连接

重要:

此功能尚不适用于 Azure 中国订阅。

使用 Studio,您可以在单个工作流程中同时创建服务主体和连接。服务主体授予连接访问 Azure 资源的权限。当您向 Azure 进行身份验证以创建服务主体时,Azure 中会注册一个应用程序。为注册的应用程序创建了一个密钥(称为 客户端密码应用程序密码)。注册的应用程序(在本例中为 连接)使用客户端密码向 Azure AD 进行身份验证。

开始之前,请确保您已满足以下先决条件:

  • 您的订阅的 Azure Active Directory 租户中有一个用户帐户。
  • 用于身份验证的帐户必须具有使用 Azure RBAC 在订阅中分配角色的权限。例如,订阅的所有者、基于角色的访问控制管理员或用户访问管理员。
  • 您拥有全局管理员、应用程序管理员或应用程序开发人员权限才能进行身份验证。创建主机连接后,可以撤销这些权限。有关角色的更多信息,请参阅 Azure AD 内置角色

使用添加连接和资源向导同时创建服务主体和连接:

  1. 连接页面上,选择创建新连接Microsoft Azure 连接类型和您的 Azure 环境。

  2. 选择用于创建虚拟机的工具,然后选择下一步

  3. 连接详细信息页面上,选择应用程序客户端密码身份验证模式,然后创建服务主体并按如下方式设置连接名称:

    1. 输入您的 Azure 订阅 ID 和连接名称。输入订阅 ID 后,新建按钮将启用。

    注意:

    连接名称可以包含 1–64 个字符,并且不能只包含空格或字符 \/;:#.*?=<>|[]{}"'()'.

    1. 选择新建,然后输入 Azure Active Directory 帐户用户名和密码。
    2. 选择登录
    3. 选择接受以授予 Citrix DaaS™ 列出的权限。Azure 会创建一个服务主体,允许 Citrix DaaS 代表指定用户管理 Azure 资源。
    > **注意:**
    >
    > Citrix DaaS 需要以下权限才能创建新的服务主体:
    >
    > -  **以您的身份访问 Azure 服务管理**
    > -  **读取和写入应用程序**
    > -  **登录并读取您的配置文件**
    > -  **维护对您已授予其访问权限的数据的访问**
    
    1. 选择接受后,您将返回到连接详细信息页面。

      注意:

      成功向 Azure 进行身份验证后,新建使用现有按钮将消失。连接成功文本将显示一个绿色复选标记,表示已成功连接到您的 Azure 订阅。

    2. 要通过 Citrix Cloud™ Connectors 将 API 请求路由到 Azure,请选中通过 Citrix Cloud Connectors 路由流量复选框。当 Cloud Connectors 没有直接 Internet 访问权限时,您可以选择使用 Citrix Cloud Connectors 上配置的代理以确保 Azure 连接通过 Citrix Cloud Connectors 正常工作。

      或者,您可以使用 PowerShell 启用此功能。有关详细信息,请参阅为 Azure 托管流量创建安全环境

      注意:

      此选项仅在您的部署中有活动的 Citrix Cloud Connectors 时可用。目前,Connector Appliances 不支持此功能。

    3. 选择下一步

    注意:

    在您成功向 Azure 进行身份验证并同意授予所需权限之前,您无法继续到下一页。

  4. 按如下方式配置连接的资源:

    • 区域页面上,选择一个区域。
    • 网络页面上,执行以下操作:
      • 键入一个 1–64 个字符的资源名称,以帮助识别区域和网络组合。资源名称不能只包含空格或字符 \/;:#.*?=<>|[]{}"'()'.
      • 选择一个虚拟网络/资源组对。(如果您有多个同名虚拟网络,将网络名称与资源组配对可提供唯一的组合。)如果您在上一页选择的区域没有任何虚拟网络,请返回该页面并选择一个具有虚拟网络的区域。
  5. 摘要页面上,查看设置摘要并选择完成以完成设置。

查看应用程序 ID

创建连接后,您可以查看连接用于访问 Azure 资源的应用程序 ID。

连接和资源列表中,选择连接以查看详细信息。详细信息选项卡显示应用程序 ID。

添加连接和资源页面上的应用程序 ID

使用 PowerShell 创建服务主体

要使用 PowerShell 创建服务主体,请连接到您的 Azure Resource Manager 订阅并使用以下部分中提供的 PowerShell cmdlet。

确保您已准备好以下各项:

  • SubscriptionId: 您要预配 VDA 的订阅的 Azure Resource Manager SubscriptionID
  • ActiveDirectoryID: 您在 Azure AD 中注册的应用程序的租户 ID。
  • ApplicationName: 要在 Azure AD 中创建的应用程序的名称。

详细步骤如下:

  1. 连接到您的 Azure Resource Manager 订阅。

    Connect-AzAccount

  2. 选择您要创建服务主体的 Azure Resource Manager 订阅。

    Get-AzSubscription -SubscriptionId $subscriptionId | Select-AzSubscription

  3. 在您的 AD 租户中创建应用程序。

    $AzureADApplication = New-AzADApplication -DisplayName $ApplicationName

  4. 创建服务主体。

    New-AzADServicePrincipal -ApplicationId $AzureADApplication.AppId

  5. 为服务主体分配角色。

    New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $AzureADApplication.AppId –scope /subscriptions/$SubscriptionId

  6. 从 PowerShell 控制台的输出窗口中,记下 ApplicationId。您在创建主机连接时提供该 ID。

在 Azure 中获取应用程序密码

使用现有服务主体创建连接,您必须首先在 Azure 门户中获取服务主体的应用程序 ID 和密码。

详细步骤如下:

  1. 从 Studio 或使用 PowerShell 获取应用程序 ID
  2. 登录 Azure 门户。
  3. 在 Azure 中,选择 Azure Active Directory
  4. 在 Azure AD 的应用注册中,选择您的应用程序。
  5. 转到证书和密码
  6. 单击客户端密码

Azure 门户中的应用程序密码

使用现有服务主体创建连接

如果您已有服务主体,则可以使用它通过 Studio 创建连接。

确保您已准备好以下各项:

  • SubscriptionId
  • ActiveDirectoryID(租户 ID)
  • 应用程序 ID
  • 应用程序密码

    有关详细信息,请参阅获取应用程序密码

  • 密码过期日期

详细步骤如下:

添加连接和资源向导中:

  1. 连接页面上,选择创建新连接Microsoft Azure 连接类型和您的 Azure 环境。

  2. 选择用于创建虚拟机的工具,然后选择下一步

  3. 连接详细信息页面上,选择应用程序客户端密码身份验证模式,然后输入您的 Azure 订阅 ID 和连接名称。

    注意:

    连接名称可以包含 1–64 个字符,并且不能只包含空格或字符 \/;:#.*?=<>|[]{}"'()'.

  4. 选择使用现有。在现有服务主体详细信息窗口中,输入现有服务主体的以下设置。输入详细信息后,保存按钮将启用。选择保存。在您提供有效详细信息之前,您无法继续到此页面之外。

    • 订阅 ID。输入您的 Azure 订阅 ID。要获取您的订阅 ID,请登录 Azure 门户并导航到订阅 > 概述
    • Active Directory ID(租户 ID)。输入您在 Azure AD 中注册的应用程序的目录(租户)ID。
    • 应用程序 ID。输入您在 Azure AD 中注册的应用程序的应用程序(客户端)ID。
    • 应用程序密码。输入密钥(客户端密码)。注册的应用程序使用该密钥向 Azure AD 进行身份验证。我们建议您定期更改密钥以确保安全。请务必保存密钥,因为以后无法检索该密钥。
    • 密码过期日期。输入应用程序密码的过期日期。在密钥过期前 14 天,您会在控制台上收到警报。但是,如果密钥过期,您会收到错误。

      注意:

      出于安全考虑,过期期限不能超过两年。

    • 身份验证 URL。此字段会自动填充且不可编辑。
    • 管理 URL。此字段会自动填充且不可编辑。
    • 存储后缀。此字段会自动填充且不可编辑。
    • 用于上传或下载磁盘或快照的 Azure Blob 存储终结点。此字段会自动填充且不可编辑。
    • Key Vault 服务。此字段会自动填充且不可编辑。
    • 服务总线后缀。此字段会自动填充且不可编辑。

      在 Azure 中创建 MCS 目录需要访问以下终结点。访问这些终结点可优化您的网络与 Azure 门户及其服务之间的连接。

      • 身份验证 URL:https://login.microsoftonline.com
      • 管理 URL:https://management.azure.com。这是 Azure Resource Manager 提供程序 API 的请求 URL。管理的终结点取决于环境。例如,对于 Azure Global,它是 https://management.azure.com;对于 Azure US Government,它是 https://management.usgovcloudapi.net
      • 存储后缀:https://*.core.windows.net。此 (*) 是存储后缀的通配符。例如,https://demo.table.core.windows.net
      • 用于上传或下载磁盘或快照的 Azure Blob 存储终结点:https://*.storage.azure.net。此 (*) 是 Blob 存储导入和导出操作的通配符。例如,https://md-impexp-xxxxx.z[00-50].blob.storage.azure.net
      • Key Vault 服务:https://*.vault.azure.net。此 (*) 是密钥保管库名称的通配符。例如,https://<your-key-vault-name>.vault.azure.net
      • 服务总线后缀:https://*.servicebus.windows.net。此 (*) 是在全局 Azure 云中创建的命名空间的通配符。例如,https://{serviceNamespace}.servicebus.windows.net/{path}
  5. 选择保存后,您将返回到连接详细信息页面。选择下一步以继续到下一页。

  6. 按如下方式配置连接的资源:

    • 区域页面上,选择一个区域。
    • 网络页面上,执行以下操作:
      • 键入一个 1–64 个字符的资源名称,以帮助识别区域和网络组合。资源名称不能只包含空格或字符 \/;:#.*?=<>|[]{}"'()'.
      • 选择一个虚拟网络/资源组对。(如果您有多个同名虚拟网络,将网络名称与资源组配对可提供唯一的组合。)如果您在上一页选择的区域没有任何虚拟网络,请返回该页面并选择一个具有虚拟网络的区域。
  7. 摘要页面上,查看设置摘要并选择完成以完成设置。

管理服务主体和连接

本部分详细介绍了如何管理服务主体和连接:

配置 Azure 限制设置

Azure Resource Manager 会限制对订阅和租户的请求,根据定义的限制路由流量,并根据提供商的特定需求进行调整。有关详细信息,请参阅 Microsoft 站点上的限制 Resource Manager 请求。订阅和租户存在限制,管理许多计算机可能会出现问题。例如,包含许多计算机的订阅可能会遇到与电源操作相关的性能问题。

提示:

有关详细信息,请参阅 Improving Azure performance with Machine Creation Services

为了帮助缓解这些问题,Citrix DaaS 允许您删除 MCS 内部限制,以使用更多 Azure 中可用的请求配额。

在大型订阅中打开或关闭 VM 电源时,我们建议使用以下最佳设置,例如,包含 1,000 个 VM 的订阅:

  • 绝对并发操作:500
  • 每分钟最大新操作数:2000
  • 最大并发操作数:500

使用 Studio 为给定主机连接配置 Azure 操作:

  1. 在 Studio 中,选择左侧窗格中的托管
  2. 选择要编辑的 Azure 相关连接。
  3. 编辑连接向导中,选择高级
  4. 高级页面上,使用配置选项指定并发操作数和每分钟最大新操作数,以及任何其他连接选项。

Azure 限制

MCS 默认支持 500 个最大并发操作。或者,您可以使用 Remote PowerShell SDK 设置最大并发操作数。

使用 PowerShell 属性 MaximumConcurrentProvisioningOperations 来指定最大并发 Azure 预配操作数。使用此属性时,请考虑:

  • MaximumConcurrentProvisioningOperations 的默认值为 500。
  • 使用 PowerShell 命令 Set-item 配置 MaximumConcurrentProvisioningOperations 参数。

管理现有主机连接的服务主体

使用服务主体创建主机连接后,您可以选择编辑主机连接以使其具有:

  • 新服务主体
  • 使用另一个现有服务主体
  1. 在 Studio 中,选择左侧窗格中的托管
  2. 选择连接,然后选择操作栏中的编辑连接
  3. 在出现的连接属性页面上,单击编辑连接设置。您现在可以选择创建新的服务主体或使用另一个现有服务主体。

    编辑设置

    • 单击创建服务主体以创建新的服务主体。按照提示登录您的 Azure AD 用户帐户。Citrix 使用多租户应用程序 ID 08b70dc3-76c5-4611-ba7d-3312ba36cb2b 为现有主机连接创建新的服务主体并授予适当的权限。
    • 单击使用现有以使用该主机连接的另一个现有服务主体。

在 Azure 中启用映像共享

创建或更新计算机目录时,您可以从不同的 Azure 租户和订阅中选择共享映像(通过 Azure 计算库共享)。要在租户内部或跨租户启用映像共享,您必须在 Azure 中进行必要的设置:

在租户内共享映像(跨订阅)

要选择 Azure 计算库中属于不同订阅的映像,必须将该映像与该订阅的服务主体 (SPN) 共享。

例如,如果有一个服务主体 (SPN 1),在 Studio 中配置为:

服务主体:SPN 1

订阅:订阅 1

租户:租户 1

映像位于另一个订阅中,在 Studio 中配置为:

订阅:订阅 2

租户:租户 1

如果您想将订阅 2 中的映像与订阅 1 (SPN 1) 共享,请转到订阅 2,并将资源组与 SPN1 共享。

必须使用 Azure 基于角色的访问控制 (RBAC) 与另一个 SPN 共享映像。Azure RBAC 是用于管理对 Azure 资源的访问的授权系统。有关 Azure RBAC 的更多信息,请参阅 Microsoft 文档 什么是 Azure 基于角色的访问控制 (Azure RBAC)。要授予访问权限,您需要以“参与者”角色在资源组范围为服务主体分配角色。要分配 Azure 角色,您必须具有 Microsoft.Authorization/roleAssignments/write 权限,例如用户访问管理员或所有者。有关与另一个 SPN 共享映像的更多信息,请参阅 Microsoft 文档 使用 Azure 门户分配 Azure 角色

跨租户共享映像

要通过 Azure 计算库跨租户共享映像,请创建或更新应用程序注册,并使用此应用程序创建主机连接。

例如,如果有两个租户(租户 1 和租户 2),并且您想与租户 1 共享您的映像库,则:

  1. 为租户 1 创建应用程序注册。有关详细信息,请参阅创建应用注册

  2. 通过使用浏览器请求登录来授予租户 2 对应用程序的访问权限。将 Tenant2 ID 替换为租户 1 的租户 ID。将 Application (client) ID 替换为您创建的应用程序注册的应用程序 ID。完成替换后,将 URL 粘贴到浏览器中,并按照登录提示登录到租户 2。例如:

    https://login.microsoftonline.com/<Tenant 2 ID>/oauth2/authorize?client_id=<Application (client) ID>&response_type=code&redirect_uri=https%3A%2F%2Fwww.microsoft.com%2F
    <!--NeedCopy-->
    

    有关详细信息,请参阅授予租户 2 访问权限

  3. 授予应用程序访问租户 2 资源组的权限。以租户 2 身份登录,并授予应用程序注册访问包含库映像的资源组的权限。有关详细信息,请参阅跨租户验证请求

使用 Studio 将共享租户添加到连接

在 Studio 中创建或更新计算机目录时,您可以从不同的 Azure 租户和订阅中选择共享映像(通过 Azure 计算库共享)。此功能要求您为关联的主机连接提供共享租户和订阅信息。

注意:

确保您已在 Azure 中配置了必要的设置以启用跨租户的映像共享。有关详细信息,请参阅跨租户共享映像

完成连接的以下步骤:

  1. 在 Studio 中,选择左侧窗格中的托管
  2. 选择连接,然后选择操作栏中的编辑连接

    共享租户

  3. 共享租户中,执行以下操作:
    1. 提供与连接订阅关联的应用程序 ID 和应用程序密码。DaaS 使用此信息向 Azure AD 进行身份验证。
    2. 添加与连接订阅共享 Azure 计算库的租户和订阅。每个租户最多可以添加八个共享租户和八个订阅。
  4. 完成后,选择应用以应用您所做的更改并保持窗口打开,或选择确定以应用更改并关闭窗口。

使用 PowerShell 实现映像共享

本部分将指导您完成使用 PowerShell 共享映像的过程:

从其他订阅中选择映像

您可以在 Azure 计算库中选择属于同一 Azure 租户中不同共享订阅的映像,以使用 PowerShell 命令创建和更新 MCS 目录。

  1. 在托管单元根文件夹中,Citrix 创建了一个名为 sharedsubscription 的新共享订阅文件夹。
  2. 列出租户中的所有共享订阅。

    Get-ChildItem -Path "XDhyp:\HostingUnits\azres\sharedsubscription.folder"
    <!--NeedCopy-->
    
  3. 选择一个共享订阅,然后列出该共享订阅的所有共享资源组。

    Get-ChildItem -Path "XDhyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription"
    <!--NeedCopy-->
    
  4. 选择一个资源组,然后列出该资源组的所有库。

    Get-ChildItem -Path "XDhyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription\ xyz.resourcegroup"
    <!--NeedCopy-->
    
  5. 选择一个库,然后列出该库的所有映像定义。

    Get-ChildItem -Path "XDhyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription\xyz.resourcegroup\testgallery.gallery"
    <!--NeedCopy-->
    
  6. 选择一个映像定义,然后列出该映像定义的所有映像版本。

    Get-ChildItem -Path "XDhyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription\xyz.resourcegroup\sigtestdef.imagedefinition"
    <!--NeedCopy-->
    
  7. 使用以下元素创建和更新 MCS 目录:

    • 资源组
    • 库映像定义
    • 库映像版本

使用共享租户 ID 更新主机连接自定义属性

使用 Set-Item 更新主机连接自定义属性中的共享租户 ID 和订阅 ID。在 CustomProperties 中添加属性 SharedTenantsShared Tenants 的格式为:

[{"Tenant":"94367291-119e-457c-bc10-25337231f7bd","Subscriptions":["7bb42f40-8d7f-4230-a920-be2781f6d5d9"]},{"Tenant":"50e83564-c4e5-4209-b43d-815c45659564","Subscriptions":["06ab8944-6a88-47ee-a975-43dd491a37d0"]}]
<!--NeedCopy-->

例如:

Set-Item -CustomProperties "<CustomProperties xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`" xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`">
<Property xsi:type=`"StringProperty`" Name=`"SubscriptionId`" Value=`"123`" />
<Property xsi:type=`"StringProperty`" Name=`"ManagementEndpoint`" Value=`"https://management.azure.com/`" />
<Property xsi:type=`"StringProperty`" Name=`"AuthenticationAuthority`" Value=`"https://login.microsoftonline.com/`" />
<Property xsi:type=`"StringProperty`" Name=`"StorageSuffix`" Value=`"core.windows.net`" />
<Property xsi:type=`"StringProperty`" Name=`"TenantId`" Value=`"123abc`" />
<Property xsi:type=`"StringProperty`" Name=`"SharedTenants`" Value=`"`[ { 'Tenant':'123abc', 'Subscriptions':['345', '567'] } ]`"` />
</CustomProperties>"
-LiteralPath @("XDHyp:\Connections\aazure") -PassThru -UserName "advc345" -SecurePassword
$psd
<!--NeedCopy-->

注意:

您可以添加多个租户。每个租户可以有多个订阅。

从其他租户中选择映像

您可以在 Azure 计算库中选择属于不同 Azure 租户的映像,以使用 PowerShell 命令创建和更新 MCS 目录。

  1. 在托管单元根文件夹中,Citrix 创建了一个名为 sharedsubscription 的新共享订阅文件夹。
  2. 列出所有共享订阅。

    Get-ChildItem XDHyp:\HostingUnits\azres\sharedsubscription.folder
    <!--NeedCopy-->
    
  3. 选择一个共享订阅,然后列出该共享订阅的所有共享资源组。

    Get-ChildItem XDHyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription
    <!--NeedCopy-->
    
  4. 选择一个资源组,然后列出该资源组的所有库。

    Get-ChildItem XDHyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription\ xyz.resourcegroup
    <!--NeedCopy-->
    
  5. 选择一个库,然后列出该库的所有映像定义。

    Get-ChildItem XDHyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription\xyz.resourcegroup\efg.gallery
    <!--NeedCopy-->
    
  6. 选择一个映像定义,然后列出该映像定义的所有映像版本。

    Get-ChildItem XDHyp:\HostingUnits\azres\image.folder\abc123.sharedsubscription\xyz.resourcegroup\efg.gallery\hij.imagedefinition
    <!--NeedCopy-->
    
  7. 使用以下元素创建和更新 MCS 目录:

    • 资源组
    • 库映像定义
    • 库映像版本

为 Azure 托管流量创建安全环境

MCS 允许网络流量(从 Citrix Cloud 到 Azure 管理程序的 API 调用)通过您环境中的 Cloud Connectors 进行路由。此实现可帮助您锁定 Azure 订阅,以允许来自特定 IP 地址的网络流量。为此,请在 CustomProperties 中添加 ProxyHypervisorTrafficThroughConnector。设置自定义属性后,您可以配置 Azure 策略以对 Azure 托管磁盘进行私有磁盘访问。

如果您配置 Azure 策略以自动为每个新磁盘创建磁盘访问权限以使用专用终结点,则不能同时上传或下载超过五个磁盘或快照,因为 Azure 强制执行相同的磁盘访问对象。此限制适用于每个计算机目录(如果您在资源组级别配置 Azure 策略),以及所有计算机目录(如果您在订阅级别配置 Azure 策略)。 如果您未配置 Azure 策略以自动为每个新磁盘创建磁盘访问权限以使用专用终结点,则不强制执行五个并发操作的限制。

注意:

目前,Connector Appliance 不支持此功能。有关此功能的 Azure 限制,请参阅使用 Azure 专用链接限制托管磁盘的导入/导出访问

启用代理

要启用代理,请在主机连接上按如下方式设置自定义属性:

  1. 使用 Remote PowerShell SDK 打开 PowerShell 窗口。有关详细信息,请参阅 https://docs.citrix.com/en-us/citrix-daas/sdk-api.html#citrix-virtual-apps-and-desktops-remote-powershell-sdk/
  2. 运行以下命令:

    Add-PSSnapin citrix*.
    cd XDHyp:\Connections\
    dir
    <!--NeedCopy-->
    
  3. 将连接的 CustomProperties 复制到记事本,并向 CustomProperties 追加属性设置 <Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="True" /> 以启用代理。例如:

    <CustomProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.citrix.com/2014/xd/machinecreation">
    <Property xsi:type="StringProperty" Name="SubscriptionId" Value="4991xxxx-2xxx-4xxx-8xxx-ff59a830xxxx" />
    <Property xsi:type="StringProperty" Name="ManagementEndpoint" Value="https://management.azure.com/" />
    <Property xsi:type="StringProperty" Name="AuthenticationAuthority" Value="https://login.microsoftonline.com/" />
    <Property xsi:type="StringProperty" Name="StorageSuffix" Value="core.windows.net" />
    <Property xsi:type="StringProperty" Name="TenantId" Value="5cxxxxx-9xxx-4xxx-8xxx-dffe3efdxxxx" />
    <Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="True" />
    </CustomProperties>
    <!--NeedCopy-->
    
  4. 在 PowerShell 窗口中,为修改后的自定义属性分配一个变量。例如:

    $customProperty = '<CustomProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.citrix.com/2014/xd/machinecreation">
    <Property xsi:type="StringProperty" Name="SubscriptionId" Value="4991xxxx-2xxx-4xxx-8xxx-ff59a830xxxx" />
    <Property xsi:type="StringProperty" Name="ManagementEndpoint" Value="https://management.azure.com/" />
    <Property xsi:type="StringProperty" Name="AuthenticationAuthority" Value="https://login.microsoftonline.com/" />
    <Property xsi:type="StringProperty" Name="StorageSuffix" Value="core.windows.net" />
    <Property xsi:type="StringProperty" Name="TenantId" Value="5cxxxxx-9xxx-4xxx-8xxx-dffe3efdxxxx" />
    <Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="True" />
    </CustomProperties>'
    <!--NeedCopy-->
    
  5. 运行 $cred = Get-Credential。如果出现提示,请提供连接凭据。凭据是 Azure 应用程序 ID 和密码。
  6. 运行 Set-Item -PSPath XDHyp:\Connections\<Connection_Name> -CustomProperties $customProperty -username $cred.username -Securepassword $cred.password

    重要:

    如果您收到一条消息,指出 SubscriptionId 缺失,请将自定义属性中的所有双引号 (“) 替换为反引号后跟双引号 (`”)。例如:

    <CustomProperties xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`" xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`">
    <Property xsi:type=`"StringProperty`" Name=`"SubscriptionId`" Value=`"4991xxxx-2xxx-4xxx-8xxx-ff59a830xxxx`" />
    <Property xsi:type=`"StringProperty`" Name=`"ManagementEndpoint`" Value=`"https://management.azure.com/`" />
    <Property xsi:type=`"StringProperty`" Name=`"AuthenticationAuthority`" Value=`"https://login.microsoftonline.com/`" />
    <Property xsi:type=`"StringProperty`" Name=`"StorageSuffix`" Value=`"core.windows.net`" />
    <Property xsi:type=`"StringProperty`" Name=`"TenantId`" Value=`"5cxxxxx-9xxx-4xxx-8xxx-dffe3efdxxxx`" />
    <Property xsi:type=`"StringProperty`" Name=`"ProxyHypervisorTrafficThroughConnector`" Value=`"True`" />
    </CustomProperties>
    <!--NeedCopy-->
    
  7. 运行 dir 以验证更新后的 CustomProperties 设置。

在 Citrix Cloud Connectors 上使用系统代理选项重定向 Azure API 流量

要通过非透明代理路由所有外部流量,请使用自定义属性 UseSystemProxyForHypervisorTrafficOnConnectors 配置主机连接。这会将 Citrix Cloud Connectors 上的 Azure API Internet 流量通过系统代理重定向。

执行与启用代理中概述的相同步骤,以使用自定义属性配置主机连接。但是,请务必向 CustomProperties 追加属性设置 <Property xsi:type="StringProperty" Name="UseSystemProxyForHypervisorTrafficOnConnectors" Value="True" /> 以启用代理。

<Property xsi:type="StringProperty" Name="UseSystemProxyForHypervisorTrafficOnConnectors" Value="True" />
<!--NeedCopy-->

例如:

<CustomProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.citrix.com/2014/xd/machinecreation">
<Property xsi:type="StringProperty" Name="SubscriptionId" Value="4991xxxx-2xxx-4xxx-8xxx-ff59a830xxxx" />
<Property xsi:type="StringProperty" Name="ManagementEndpoint" Value="https://management.azure.com/" />
<Property xsi:type="StringProperty" Name="AuthenticationAuthority" Value="https://login.microsoftonline.com/" />
<Property xsi:type="StringProperty" Name="StorageSuffix" Value="core.windows.net" />
<Property xsi:type="StringProperty" Name="TenantId" Value="5cxxxxx-9xxx-4xxx-8xxx-dffe3efdxxxx" />
<Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="True" />
<Property xsi:type="StringProperty" Name="UseSystemProxyForHypervisorTrafficOnConnectors" Value="True" />
</CustomProperties>
<!--NeedCopy-->

注意:

设置此属性后,Citrix Cloud Connectors 上 netsh winhttp 设置中配置的代理将用于出站流量到云服务提供商。

管理应用程序密码和密码过期日期

请务必在密码过期之前更改连接的应用程序密码。在密钥过期之前,您会在 Studio 上收到警报。

在 Azure 中创建应用程序密码

您可以通过 Azure 门户为连接创建应用程序密码。

  1. 选择 Azure Active Directory
  2. 在 Azure AD 的应用注册中,选择您的应用程序。
  3. 转到证书和密码
  4. 单击客户端密码 > 新建客户端密码

    创建应用程序密码

  5. 提供密码的描述并指定持续时间。完成后,选择添加

    注意:

    请务必保存客户端密码,因为以后无法检索该密码。

  6. 复制客户端密码值和过期日期。
  7. 在 Studio 中,编辑相应的连接,并将应用程序密码密码过期日期字段中的内容替换为您复制的值。

更改密码过期日期

您可以使用 Studio 添加或修改正在使用的应用程序密码的过期日期。

  1. 添加连接和资源向导中,右键单击连接,然后单击编辑连接
  2. 连接属性页面上,单击密码过期日期以添加或修改正在使用的应用程序密码的过期日期。

更改密码过期日期

使用 Azure 托管标识创建主机连接

您可以使用 Azure 托管标识创建到 Microsoft Azure Resource Manager 的主机连接。Azure 托管标识提供了一种安全且可扩展的方式来访问 Azure 服务,而无需管理凭据。此方法消除了与存储、轮换和管理密码相关的风险。

身份验证模式有三个选项:

  • AppClientSecret
  • SystemAssignedManagedIdentity
  • UserAssignedManagedIdentity

开始之前

以下是您在使用 Azure 托管标识创建主机连接之前必须执行的步骤:

  1. 在 Azure VM 中安装 Citrix Cloud Connector™。
  2. 在该 Cloud Connector VM 上启用 Azure 托管标识。

    • 对于用户分配的托管标识:

      1. 在 Azure 门户上,创建用户分配的托管标识。有关信息,请参阅创建和分配用户分配的托管标识
      2. 为托管标识分配 Azure 角色。请参阅所需的 Azure 权限
      3. 创建 Azure VM 作为 Cloud Connector,并将用户分配的标识添加到其中。
    • 对于系统分配的托管标识:

      1. 打开 Azure 门户并转到您的 VM。
      2. 在 VM 的设置中选择“标识”边栏选项卡。
      3. 系统分配选项卡下,将状态设置为
      4. 单击保存
      5. 授予所需的 Azure 权限

      注意:

      如果您在 Cloud Connector VM 上启用系统分配的托管标识并使用它创建主机连接,即使在 Cloud Connector VM 上禁用它之后,您仍然可以使用系统分配的托管标识创建主机连接。即使在标识被禁用 24 小时后,主机连接的创建也可能成功。发生这种情况是因为托管标识令牌被底层 Azure 基础结构缓存。有关详细信息,请参阅托管标识令牌是否被缓存?

使用 Studio 通过 Azure 托管标识创建主机连接

添加连接和资源向导中:

  1. 连接页面上:
    1. 选择创建新连接、Microsoft Azure 连接类型和您的 Azure 环境。
    2. 选择用于创建虚拟机的工具,然后选择下一步
  2. 连接详细信息页面上,选择身份验证模式

    • 对于用户分配的托管标识,输入以下设置。输入详细信息后,选择下一步以继续到以下页面。在您提供有效详细信息之前,您无法继续到此页面之外。

      • 订阅 ID:输入您的 Azure 订阅 ID。要获取您的订阅 ID,请登录 Azure 门户并导航到订阅 > 概述
      • Active Directory ID(租户 ID):输入您在 Azure AD 中注册的应用程序的目录(租户)ID。
      • 客户端 ID:输入您在 Azure 门户中创建的托管标识的客户端 ID。
      • 身份验证 URL:此字段会自动填充且不可编辑。
      • 管理 URL:此字段会自动填充且不可编辑。
      • 存储后缀:此字段会自动填充且不可编辑。
    • 对于系统分配的托管标识,输入以下设置。输入详细信息后,选择下一步以继续到以下页面。在您提供有效详细信息之前,您无法继续到此页面之外。

      • 订阅 ID:输入您的 Azure 订阅 ID。要获取您的订阅 ID,请登录 Azure 门户并导航到订阅 > 概述
      • Active Directory ID(租户 ID):输入您在 Azure AD 中注册的应用程序的目录(租户)ID。
      • 身份验证 URL:此字段会自动填充且不可编辑。
      • 管理 URL:此字段会自动填充且不可编辑。
      • 存储后缀:此字段会自动填充且不可编辑。

使用 PowerShell 通过 Azure 托管标识创建主机连接

您可以使用新的 CustomProperty AuthenticationMode 创建此主机连接。AuthenticationMode 有三个选项:AppClientSecretSystemAssignedManagedIdentityUserAssignedManagedIdentity。以下是身份验证模式选项的描述:

  • AppClientSecret:这是默认值。这需要应用程序 ID 和密码。
  • UserAssignedManagedIdentity:这需要通过 UserName 提供客户端 ID。
  • SystemAssignedManagedIdentity:这不需要任何输入。即使您提供了客户端 ID,它也会被忽略。

注意:

使用 PowerShell 时,参数 ProxyHypervisorTrafficThroughConnector 必须为 true 才能使用托管标识。

  1. 打开 PowerShell 窗口。
  2. 运行 asnp citrix* 以加载 Citrix 特定的 PowerShell 模块。
  3. 创建主机连接。例如:

    • 对于用户分配的托管标识:

       $UserName = "should be the Client ID of the user-assigned managed identity"
       $Password = "It can be any string.Not used"
       
       $CustomProperties = '<CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' `
       +  '<Property xsi:type="StringProperty" Name="SubscriptionId" Value="' + $SubscriptionId + '" />'`
       +  '<Property xsi:type="StringProperty" Name="ManagementEndpoint" Value="https://management.azure.com/" />'`
       +  '<Property xsi:type="StringProperty" Name="AuthenticationAuthority" Value="https://login.microsoftonline.com/" />'`
       +  '<Property xsi:type="StringProperty" Name="StorageSuffix" Value="core.windows.net" />'`
       +  '<Property xsi:type="StringProperty" Name="TenantId" Value="' + $TenantId + '" />'`
       +  '<Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="True" />'`
       +  '<Property xsi:type="StringProperty" Name="AuthenticationMode" Value="UserAssignedManagedIdentity" />'`
       +  '</CustomProperties>'
       
       New-Item -ConnectionType "Custom" `
       -CustomProperties $CustomProperties `
       -HypervisorAddress @($HypervisorAddress) `
       -Path @("XDHyp:\Connections\$($ConnectionName)") `
       -Metadata $Metadata `
       -Persist `
       -PluginId "AzureRmFactory" `
       -Scope @() `
       -Password $Password `
       -UserName $UserName `
       -ZoneUid $zoneUid
       <!--NeedCopy-->
      
    • 对于系统分配的托管标识:

       $UserName = "It can be any string. Not used"
       $Password = "It can be any string. Not used"  
       $CustomProperties = '<CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' `
       +  '<Property xsi:type="StringProperty" Name="SubscriptionId" Value="' + $SubscriptionId + '" />'`
       +  '<Property xsi:type="StringProperty" Name="ManagementEndpoint" Value="https://management.azure.com/" />'`
       +  '<Property xsi:type="StringProperty" Name="AuthenticationAuthority" Value="https://login.microsoftonline.com/" />'`
       +  '<Property xsi:type="StringProperty" Name="StorageSuffix" Value="core.windows.net" />'`
       +  '<Property xsi:type="StringProperty" Name="TenantId" Value="' + $TenantId + '" />'`
       +  '<Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="True" />'`
       +  '<Property xsi:type="StringProperty" Name="AuthenticationMode" Value="SystemAssignedManagedIdentity" />'`
       +  '</CustomProperties>'
       
       New-Item -ConnectionType "Custom" `
       -CustomProperties $CustomProperties `
       -HypervisorAddress @($HypervisorAddress) `
       -Path @("XDHyp:\Connections\$($ConnectionName)") `
       -Metadata $Metadata `
       -Persist `
       -PluginId "AzureRmFactory" `
       -Scope @() `
       -Password $Password `
       -UserName $UserName `
       -ZoneUid $zoneUid
       <!--NeedCopy-->
      

管理现有主机连接的 Azure 托管标识

使用 Studio

创建主机连接后,您可以选择更新现有主机连接以使其具有:

  • 系统分配的托管标识
  • 用户分配的托管标识
  • 新的用户分配的托管标识
  1. 在 Studio 中,选择左侧窗格中的托管
  2. 选择连接,然后选择操作栏中的编辑连接
  3. 在出现的连接属性页面上,单击编辑身份验证模式。您现在可以选择更新身份验证模式。

    • 单击用户分配的托管标识以使用该主机连接的用户分配的托管标识。按照提示填写客户端 ID。
    • 单击系统分配的托管标识以使用该主机连接的系统分配的托管标识。

使用 PowerShell

您还可以使用 PowerShell 更新现有主机连接,以使用系统分配的标识或用户分配的托管标识。例如,运行以下 PowerShell 命令:

  1. 打开 PowerShell 窗口。
  2. 运行 asnp citrix* 以加载 Citrix 特定的 PowerShell 模块。
  3. 运行以下命令:

    $connName = "ConnectionName"
    $conn = get-item XDHyp:\Connections\$connName
    $conn.CustomProperties
    <!--NeedCopy-->
    
  4. ProxyHypervisorTrafficThroughConnector 更改为 True,并添加 AuthenticationMode 的自定义属性,将其设置为 SystemAssignedManagedIdentityUserAssignedManagedIdentity。例如:

    $customProps = '<CustomProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.citrix.com/2014/xd/machinecreation"><Property xsi:type="StringProperty" Name="SubscriptionId" Value="subscriptionId" /><Property xsi:type="StringProperty" Name="ManagementEndpoint" Value="https://management.azure.com/" /><Property xsi:type="StringProperty" Name="AuthenticationAuthority" Value="https://login.microsoftonline.com/" /><Property xsi:type="StringProperty" Name="StorageSuffix" Value="core.windows.net" /><Property xsi:type="StringProperty" Name="TenantId" Value="tenantId" /><Property xsi:type="StringProperty" Name="AzureAdDeviceManagement" Value="false" /><Property xsi:type="StringProperty" Name="ProxyHypervisorTrafficThroughConnector" Value="true" /><Property xsi:type="StringProperty" Name="AuthenticationMode" Value="SystemAssignedManagedIdentity" /></CustomProperties>'
    <!--NeedCopy-->
    
  5. 运行 $cred = Get-Credential。在此处输入任何内容。
  6. 运行 Set-Item -PSPath XDHyp:\Connections\$connName -CustomProperties $CustomProperties -username $cred.username -Securepassword $cred.password

使用预创建的网络安全组

为映像准备创建一个“拒绝所有”网络安全组,而不是请求 Citrix 创建和修改 NSG。使用 PowerShell 命令 Set-Item 编辑托管单元的自定义属性,以包含参数 NsgForPreparation 来提供“拒绝所有”网络安全安全组。

先决条件

配置服务主体所需的以下权限:

  • Microsoft.Network/networkSecurityGroups/join/action:将网络安全组关联到子网或网络接口
  • Microsoft.Network/networkSecurityGroups/read:获取网络安全组
  • Microsoft.Network/networkSecurityGroups/securityRules/read:获取规则

添加预创建的“拒绝所有”网络安全组

要添加预创建的“拒绝所有”网络安全组,请在托管单元上按如下方式设置自定义属性:

  1. 使用 Remote PowerShell SDK 打开 PowerShell 窗口。
  2. 运行以下命令:

    Add-PSSnapin citrix*.
    cd XDHyp:\HostingUnits\
    Dir
    <!--NeedCopy-->
    
  3. 选择一个托管单元以检索详细信息:

    Get-Item "XDHyp:\HostingUnits\<hostingunitname>"
    <!--NeedCopy-->
    
  4. 将 CustomProperties 复制到记事本,并追加属性设置 <Property xsi:type="StringProperty” Name="NsgForPreparation” Value="{ResourceGroupName}/{NetworkSecurityGroupName}"/>。例如:

    <CustomProperties xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`" xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`"><Property xsi:type=`"StringProperty`" Name=`"NsgForPreparation`" Value=`"{ResourceGroupName}/{NetworkSecurityGroupName}`"/></CustomProperties>
    <!--NeedCopy-->
    
  5. 在 PowerShell 窗口中,为修改后的自定义属性分配一个变量。例如:

    $customProperty = "<CustomProperties xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`" xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`"><Property xsi:type=`"StringProperty`" Name=`"NsgForPreparation`" Value=`"{ResourceGroupName}/{NetworkSecurityGroupName}`"/></CustomProperties>"
    <!--NeedCopy-->
    
  6. 运行 $cred = Get-Credential。如果出现提示,请提供连接凭据。凭据是 Azure 应用程序 ID 和密码。
  7. 运行以下命令。

    Set-Item -PSPath XDHyp:\HostingUnits\<hostingunitname> -CustomProperties $customProperty -username $cred.username -Securepassword $cred.password
    <!--NeedCopy-->
    

    重要:

    如果您收到一条消息,指出 SubscriptionId 缺失,请将自定义属性中的所有双引号 (“) 替换为反引号后跟双引号 (`”)。

  8. 运行 dir 以验证更新后的 CustomProperties 设置。

注意:

更新需要一分钟以上才能反映。

检索网络安全组详细信息

要检索网络安全组详细信息,首先检索包含网络安全组的资源组,然后根据资源组名称检索网络安全组。

  1. 检索包含网络安全组的资源组。例如:

    Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["networksecuritygroup"]}'
    <!--NeedCopy-->
    
  2. 根据资源组名称检索网络安全组。例如:

    Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType securitygroup -MaxRecords 5 -AdditionalDataFilter '{"location": ["eastus", "westus"], "resourcegroup":["resourcegroupname"]}'
    <!--NeedCopy-->
    

筛选空资源组

在创建计算机目录期间选择主映像、计算机配置文件或准备好的映像时,使用 PowerShell 命令 Get-HypInventoryItem 筛选空资源组。

示例:

  • 检索页面中的最大记录数:

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5
     <!--NeedCopy-->
    
  • 检索页面中的最大记录数,并筛选以查找具有特定资源的资源容器。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["vm", "manageddisk", "snapshot", "imageversion", "storageaccount"]}'
     <!--NeedCopy-->
    
  • 使用 skip 直接指示页面,并筛选以查找具有特定资源的资源容器。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -skip 20 -AdditionalDataFilter '{"containedresourcetypes": ["vm", "manageddisk", "snapshot", "imageversion", "storageaccount"]}'
     <!--NeedCopy-->
    
  • 使用令牌检索下一页,并筛选以查找具有特定资源的资源容器。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["vm", "manageddisk", "snapshot", "imageversion", "storageaccount"]}' -ContinuationToken 'ew0KICAiJGlkIjogIjEiLA0KICAiTWF3Um93cyI6IDUsDQogICJSb3dzVG9Ta2lwIjogMjUsDQogICJLdXN0b0NsdXN0ZXJVcmwiOiAiaHR0cHM6Ly9hcmctbmV1LTEzLXNmLmFyZy5jb3JlLndpbmRvd3MubmV0Ig0KfQ=='
     <!--NeedCopy-->
    
  • 检索所有带有 Citrix 内部标签的资源组,并使用 MaxRecords 限制最大记录数。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5
     <!--NeedCopy-->
    
  • 筛选带有 Citrix 内部标签的计算机配置文件(主映像),并使用 MaxRecords 限制最大记录数。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["vm", "templatespecversion"]}'
     <!--NeedCopy-->
    
  • 筛选带有 Citrix 内部标签的准备好的映像,并使用 MaxRecords 限制最大记录数。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["manageddisk", "snapshot", "imageversion"]}'
     <!--NeedCopy-->
    
  • 筛选带有 Citrix 内部标签的计算机配置文件(准备好的映像),并使用 MaxRecords 限制最大记录数。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["vm", "templatespecversion"]}'
     <!--NeedCopy-->
    
  • 筛选带有 Citrix 内部标签的映像,并使用 MaxRecords 和位置限制最大记录数。

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 5 -AdditionalDataFilter '{"containedresourcetypes": ["manageddisk", "snapshot", "imageversion", "storageaccount"], "location": ["eastus", "westus"]}'
     <!--NeedCopy-->
    
  • 检索所有资源组,不考虑标签 CitrixResource

     Get-HypInventoryItem -LiteralPath "XDHyp:\HostingUnits\ctx04con01unit01" -ResourceType resourceGroup -MaxRecords 50 -AdditionalDataFilter '{"containedresourcetypes": ["manageddisk", "snapshot", "imageversion", "storageaccount"]}' -Force $true
     <!--NeedCopy-->
    

所需的 Azure 权限

本部分详细介绍了 Azure 所需的最低权限一般权限

最低权限

最低权限提供了更好的安全控制。但是,如果只授予最低权限,则需要额外权限的新功能将失败。本部分列出了按操作划分的最低权限。

创建主机连接

使用从 Azure 获取的信息添加主机连接。

"Microsoft.Network/virtualNetworks/read",
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/disks/read",
"Microsoft.Resources/providers/read",
"Microsoft.Resources/subscriptions/locations/read",
"Microsoft.Resources/tenants/read",
"Microsoft.Network/networkSecurityGroups/join/action",
"Microsoft.Network/networkSecurityGroups/read",
"Microsoft.Network/networkSecurityGroups/securityRules/read"
<!--NeedCopy-->

VM 的电源管理

打开或关闭计算机实例的电源。

"Microsoft.Compute/virtualMachines/read",
"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Compute/virtualMachines/start/action",
"Microsoft.Compute/virtualMachines/restart/action",
"Microsoft.Insights/diagnosticsettings/delete",
"Microsoft.Insights/diagnosticsettings/read",
"Microsoft.Insights/diagnosticsettings/write",
<!--NeedCopy-->

创建、更新或删除 VM

创建计算机目录,然后添加、删除、更新计算机,并删除计算机目录。

以下是当主映像是与主机连接位于同一区域的托管磁盘或快照时所需的最低权限列表。

"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Resources/deployments/validate/action",
"Microsoft.Resources/tags/read",
"Microsoft.Resources/tags/write",
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/virtualMachines/write",
"Microsoft.Compute/virtualMachines/delete",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Compute/snapshots/read",
"Microsoft.Compute/snapshots/write",
"Microsoft.Compute/snapshots/delete",
"Microsoft.Compute/snapshots/beginGetAccess/action",
"Microsoft.Compute/snapshots/endGetAccess/action",
"Microsoft.Compute/disks/read",
"Microsoft.Compute/disks/write",
"Microsoft.Compute/disks/delete",
"Microsoft.Compute/disks/beginGetAccess/action",
"Microsoft.Compute/disks/endGetAccess/action",
"Microsoft.Compute/locations/publishers/artifacttypes/types/versions/read",
"Microsoft.Compute/skus/read",
"Microsoft.Compute/virtualMachines/extensions/read",
"Microsoft.Compute/virtualMachines/extensions/write",
"Microsoft.Features/providers/features/read",
"Microsoft.Network/virtualNetworks/read",
"Microsoft.Network/virtualNetworks/subnets/join/action",
"Microsoft.Network/virtualNetworks/subnets/read",
"Microsoft.Network/networkSecurityGroups/read",
"Microsoft.Network/networkSecurityGroups/write",
"Microsoft.Network/networkSecurityGroups/delete",
"Microsoft.Network/networkSecurityGroups/join/action",
"Microsoft.Network/networkInterfaces/read",
"Microsoft.Network/networkInterfaces/write",
"Microsoft.Network/networkInterfaces/delete",
"Microsoft.Network/networkInterfaces/join/action",
"Microsoft.Network/locations/usages/read",
"Microsoft.Compute/capacityReservationGroups/capacityReservations/read",
"Microsoft.Compute/capacityReservationGroups/deploy/action"
<!--NeedCopy-->

根据最低权限,您需要以下额外权限才能使用以下功能:

  • 如果主映像是与主机连接位于同一区域的存储帐户中的 VHD:

     "Microsoft.Storage/storageAccounts/read",
     "Microsoft.Storage/storageAccounts/listKeys/action",
     <!--NeedCopy-->
    
  • 如果主映像是 Azure 计算库(以前称为共享映像库)中的 ImageVersion:

     "Microsoft.Compute/galleries/read",
     "Microsoft.Compute/galleries/images/read",
     "Microsoft.Compute/galleries/images/versions/read",
     <!--NeedCopy-->
    
  • 如果主映像是托管磁盘、快照或 VHD,并且位于与主机连接区域不同的区域:

     "Microsoft.Storage/storageAccounts/read",
     "Microsoft.Storage/storageAccounts/listKeys/action",
     "Microsoft.Storage/storageAccounts/write",
     "Microsoft.Storage/storageAccounts/delete",
     "Microsoft.Storage/checknameavailability/read",
     "Microsoft.Storage/locations/usages/read",
     "Microsoft.Storage/skus/read",
     <!--NeedCopy-->
    
  • 如果您使用 Citrix 托管的资源组:

     "Microsoft.Resources/subscriptions/resourceGroups/write",
     "Microsoft.Resources/subscriptions/resourceGroups/delete",
     <!--NeedCopy-->
    
  • 如果您将主映像放置在共享租户或订阅的 Azure 计算库(以前称为共享映像库)中:

     "Microsoft.Compute/galleries/write",
     "Microsoft.Compute/galleries/images/write",
     "Microsoft.Compute/galleries/images/versions/write",
     "Microsoft.Compute/galleries/read",
     "Microsoft.Compute/galleries/images/read",
     "Microsoft.Compute/galleries/images/versions/read",
     "Microsoft.Compute/galleries/delete",
     "Microsoft.Compute/galleries/images/delete",
     "Microsoft.Compute/galleries/images/versions/delete",
     "Microsoft.Resources/subscriptions/read",
     <!--NeedCopy-->
    
  • 如果您使用 Azure 专用主机支持:

     "Microsoft.Compute/hostGroups/read",
     "Microsoft.Compute/hostGroups/write",
     "Microsoft.Compute/hostGroups/hosts/read",
     <!--NeedCopy-->
    
  • 如果您使用带客户管理的密钥 (CMK) 的服务器端加密 (SSE):

     "Microsoft.Compute/diskEncryptionSets/read",
     <!--NeedCopy-->
    
  • 如果您使用 ARM 模板(计算机配置文件)部署 VM:

     "Microsoft.Resources/deployments/write",
     "Microsoft.Resources/deployments/operationstatuses/read",
     "Microsoft.Resources/deployments/read",
     "Microsoft.Resources/deployments/delete",
     "Microsoft.Insights/DataCollectionRuleAssociations/Read",
     "Microsoft.Insights/dataCollectionRules/read",
     <!--NeedCopy-->
    
  • 如果您使用 Azure 模板规范作为计算机配置文件:

     "Microsoft.Resources/templateSpecs/read",
     "Microsoft.Resources/templateSpecs/versions/read",
     <!--NeedCopy-->
    

使用非托管磁盘创建、更新和删除计算机

以下是当主映像是 VHD 并使用管理员提供的资源组时所需的最低权限列表:

"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Resources/tags/read",
"Microsoft.Resources/tags/write",
"Microsoft.Storage/storageAccounts/delete",
"Microsoft.Storage/storageAccounts/listKeys/action",
"Microsoft.Storage/storageAccounts/read",
"Microsoft.Storage/storageAccounts/write",
"Microsoft.Storage/checknameavailability/read",
"Microsoft.Storage/locations/usages/read",
"Microsoft.Storage/skus/read",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Compute/virtualMachines/delete",
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/virtualMachines/write",
"Microsoft.Resources/deployments/validate/action",
"Microsoft.Network/networkInterfaces/delete",
"Microsoft.Network/networkInterfaces/join/action",
"Microsoft.Network/networkInterfaces/read",
"Microsoft.Network/networkInterfaces/write",
"Microsoft.Network/networkSecurityGroups/delete",
"Microsoft.Network/networkSecurityGroups/join/action",
"Microsoft.Network/networkSecurityGroups/read",
"Microsoft.Network/networkSecurityGroups/write",
"Microsoft.Network/virtualNetworks/subnets/read",
"Microsoft.Network/virtualNetworks/read",
"Microsoft.Network/virtualNetworks/subnets/join/action",
"Microsoft.Network/locations/usages/read",
<!--NeedCopy-->

成本管理

以下是检索 VM 定价所需的最低权限:

"Microsoft.Consumption/pricesheets/read"
<!--NeedCopy-->

一般权限

“参与者”角色拥有管理所有资源的完全访问权限。这组权限不会阻止您获取新功能。

以下权限集提供了最佳的未来兼容性,尽管它包含的权限比当前功能集所需的权限更多:

"Microsoft.Compute/diskEncryptionSets/read",
"Microsoft.Compute/disks/beginGetAccess/action",
"Microsoft.Compute/disks/delete",
"Microsoft.Compute/disks/endGetAccess/action",
"Microsoft.Compute/disks/read",
"Microsoft.Compute/disks/write",
"Microsoft.Compute/galleries/delete",
"Microsoft.Compute/galleries/images/delete",
"Microsoft.Compute/galleries/images/read",
"Microsoft.Compute/galleries/images/versions/delete",
"Microsoft.Compute/galleries/images/versions/read",
"Microsoft.Compute/galleries/images/versions/write",
"Microsoft.Compute/galleries/images/write",
"Microsoft.Compute/galleries/read",
"Microsoft.Compute/galleries/write",
"Microsoft.Compute/hostGroups/hosts/read",
"Microsoft.Compute/hostGroups/read",
"Microsoft.Compute/hostGroups/write",
"Microsoft.Compute/snapshots/beginGetAccess/action",
"Microsoft.Compute/snapshots/delete",
"Microsoft.Compute/snapshots/endGetAccess/action",
"Microsoft.Compute/snapshots/read",
"Microsoft.Compute/snapshots/write",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Compute/virtualMachines/delete",
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/virtualMachines/restart/action",
"Microsoft.Compute/virtualMachines/start/action",
"Microsoft.Compute/virtualMachines/write",
"Microsoft.Compute/locations/publishers/artifacttypes/types/versions/read",
"Microsoft.Compute/skus/read",
"Microsoft.Compute/virtualMachines/extensions/read",
"Microsoft.Compute/virtualMachines/extensions/write",
"Microsoft.Network/networkInterfaces/delete",
"Microsoft.Network/networkInterfaces/join/action",
"Microsoft.Network/networkInterfaces/read",
"Microsoft.Network/networkInterfaces/write",
"Microsoft.Network/networkSecurityGroups/delete",
"Microsoft.Network/networkSecurityGroups/join/action",
"Microsoft.Network/networkSecurityGroups/read",
"Microsoft.Network/networkSecurityGroups/write",
"Microsoft.Network/virtualNetworks/subnets/read",
"Microsoft.Network/virtualNetworks/read",
"Microsoft.Network/virtualNetworks/subnets/join/action",
"Microsoft.Network/locations/usages/read",
"Microsoft.Resources/deployments/operationstatuses/read",
"Microsoft.Resources/deployments/read",
"Microsoft.Resources/deployments/validate/action",
"Microsoft.Resources/deployments/write",
"Microsoft.Resources/deployments/delete",
"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Resources/subscriptions/resourceGroups/write",
"Microsoft.Resources/subscriptions/resourceGroups/delete",
"Microsoft.Resources/providers/read",
"Microsoft.Resources/subscriptions/locations/read",
"Microsoft.Resources/subscriptions/read",
"Microsoft.Resources/tags/read",
"Microsoft.Resources/tags/write",
"Microsoft.Resources/tenants/read",
"Microsoft.Resources/templateSpecs/read",
"Microsoft.Resources/templateSpecs/versions/read",
"Microsoft.Storage/storageAccounts/delete",
"Microsoft.Storage/storageAccounts/listKeys/action",
"Microsoft.Storage/storageAccounts/read",
"Microsoft.Storage/storageAccounts/write",
"Microsoft.Storage/checknameavailability/read",
"Microsoft.Storage/locations/usages/read",
"Microsoft.Storage/skus/read",
"Microsoft.Features/providers/features/read",
"Microsoft.Insights/DataCollectionRuleAssociations/Read",
"Microsoft.Insights/dataCollectionRules/read",
"Microsoft.Insights/diagnosticsettings/delete",
"Microsoft.Insights/diagnosticsettings/read",
"Microsoft.Insights/diagnosticsettings/write",
"Microsoft.Compute/capacityReservationGroups/capacityReservations/read",
"Microsoft.Consumption/pricesheets/read",
"Microsoft.Network/networkSecurityGroups/join/action",
"Microsoft.Network/networkSecurityGroups/read",
"Microsoft.Network/networkSecurityGroups/securityRules/read",
"Microsoft.Compute/capacityReservationGroups/deploy/action"
<!--NeedCopy-->

配置所需的 Azure 主机连接权限

您可以轻松配置服务主体或 Azure 中与主机连接关联的用户帐户执行所有 MCS 操作所需的最低权限,方法是使用 ARM 模板。此 ARM 模板可自动执行以下操作:

  • 创建具有操作所需最低权限的 Azure 角色。
  • 在订阅级别将此角色分配给现有 Azure 服务主体。

您可以使用 Azure 门户或 PowerShell 命令部署此 ARM 模板。有关详细信息,请参阅 ARM Template for Citrix Virtual Apps and Desktops Operations

验证主机连接上的权限

您可以验证主机连接上的权限,以执行与创建和管理 MCS 计算机目录相关的任务。此实现可帮助您提前找出不同场景(例如创建、删除和更新 VM、VM 的电源管理)所需的缺失权限,从而避免在关键时刻受阻。

您可以使用 PowerShell 命令 Test-HypHypervisorConnection 验证主机连接上的权限。该命令的结果被捕获为一个列表,列表中的每个项目都分为三个部分。

  • 类别:用户可以执行以创建和管理 MCS 计算机目录的操作或任务。
  • 纠正措施:管理员必须执行的步骤,以解决用户缺失权限差异。
  • 缺失权限:类别的缺失权限列表。

要验证权限,请执行以下操作:

  1. 创建到 Azure 的主机连接。
  2. 从 Delivery Controller™ 主机打开 PowerShell 窗口。
  3. 运行 asnp citrix* 以加载 Citrix 特定的 PowerShell 模块。
  4. 运行以下命令以验证您是否具有测试连接所需的权限。

    Test-HypHypervisorConnection -LiteralPath "XDHyp:\Connections\AzureCon"
    <!--NeedCopy-->
    

    SPN 所需的角色级别权限:

    • Microsoft.Authorization/roleDefinitions/read(在订阅级别或资源组级别,如果提供了资源组)
    • Microsoft.Authorization/roleAssignments/read(在订阅级别或资源组级别,如果提供了资源组)

    SPN 所需的 API 级别权限:

    Microsoft.Graph:

    • Application.Read.All
    • Directory.Read.All
    • ServicePrincipalEndpoint.Read.All
  5. 添加查找权限所需的缺失权限后,运行以下命令以验证您是否在各个类别中拥有权限。

    示例:

    要测试订阅级别需要更高级别授权的连接:

    Test-HypHypervisorConnection -LiteralPath XDHyp:\Connections\ AzureCon -SecurePassword $password -UserName 922e65d5-38ae-4cf5-xxxx-xxxxxxxxx
     <!--NeedCopy-->
    

    示例:

    要测试资源组级别不需要高级别授权的连接:

    Test-HypHypervisorConnection -LiteralPath XDHyp:\Connections\testles -CustomProperties $customProperties | Format-List
    <!--NeedCopy-->
    

    注意:

    CustomProperties 参数用于提供资源组级别,因为资源组是连接特定信息。

    示例:

    要测试资源组级别具有更高级别授权的连接:

    Test-HypHypervisorConnection -LiteralPath XDHyp:\Connections\testles -SecurePassword $password -UserName 922e65d5-38ae-4cf5-832b-54122196b7dd -CustomProperties $customProperties
    <!--NeedCopy-->
    

有关权限的信息,请参阅所需的 Azure 权限

后续步骤

更多信息