将会话录制资源部署到云订阅服务中
本文提供有关将会话录制资源部署到 Azure 订阅的信息。
您可以从会话录制服务中将以下会话录制资源部署到 Azure 订阅:
- 会话录制服务器
- 数据库
- 存储
- 负载均衡器
有两种方法可以将会话录制资源部署到 Azure 订阅:
-
使用主机连接连接到 Azure 订阅。创建主机连接需要您提供订阅信息。有关详细信息,请参阅本文后面的通过主机连接创建和部署站点。
-
如果您不想提供订阅信息,请创建 Azure 资源管理器模板 (ARM 模板),其中包含您要部署资源的方式和内容。有关详细信息,请参阅本文后面的通过 ARM 模板创建和部署站点。
通过主机连接创建和部署站点
本节将指导您完成通过主机连接创建和部署站点的过程,以及对以这种方式部署的站点可执行的以下操作:
- 向 Azure 上已部署的现有站点添加资源
- 更改允许访问负载均衡器的 IP 地址
- 查看使用 Azure 的实际成本
通过主机连接创建和部署站点
-
从会话录制服务的左侧导航中选择 配置 > 服务器管理。

-
在 服务器管理 页面上,单击 创建站点。随即显示 创建站点 页面。

-
选择通过主机连接创建和部署站点。主要步骤列在左侧导航中。

-
输入站点名称和描述,选择连接到您的 Azure 订阅的主机连接,并指定一个区域。
-
如果您没有现有的主机连接,请参阅本文后面的 添加主机连接 添加一个。
-
不支持 Azure 政府区域。
-
-
完成站点信息后,单击 Next 继续。
-
(可选)要获取 VM 和存储配置的建议,请提供有关您的录制需求的信息。
您可以通过单击 I’m good, skip this step 或在未选择任何内容的情况下单击 Next 来跳过此步骤。

当您从下拉列表中选择一个选项时,系统会根据您的选择显示一个建议。建议旁边有一个 reset 按钮。它允许您清除该部分中的选择和相应的建议。
-
转到 Azure 门户,在所选区域中创建新的虚拟网络,并在新虚拟网络与 VDA 连接到的虚拟网络之间设置虚拟网络对等互连。然后,在新虚拟网络中添加一个子网。在下方查找并输入子网 ID。

要保持专用网络中资源之间的连接,请选中“为存储和数据库创建专用终结点”复选框。
选中“为存储和数据库创建专用终结点”复选框后,请考虑以下因素,决定是否输入另一个子网 ID:
- 如果您不打算将会话录制服务器加入 Active Directory 域,则不需要子网,因此请将子网 ID 字段留空。
- 如果将子网 ID 字段留空,则表示您正在将会话录制服务器加入 Azure Active Directory 域。

-
将会话录制服务器创建为虚拟机 (VM)。

注意:
- 如果有建议数量,“VM 数量”字段将预填充该数量。根据需要更改数量。
- 估算成本基于标准定价,并且未将折扣纳入考量。您可以预期实际成本会低于估算值。
-
将会话录制服务器加入与 VDA 相同的域,并为会话录制服务器指定证书。
-
如果您的 VDA 连接到 Active Directory 域,请选中“将会话录制服务器加入 Active Directory 域”复选框并输入相关信息。选中“将会话录制服务器加入 Active Directory 域”复选框后,您将为混合方案配置部署,将本地 Active Directory 与 Azure AD 集成。
-
如果您的 VDA 连接到 Azure Active Directory (Azure AD) 域,请清除“将会话录制服务器加入 Active Directory 域”复选框。完成当前站点的创建后,请务必将会话录制服务器手动加入到相同的 Azure AD 域。请注意,纯 Azure AD 部署仅适用于会话录制 2402 及更高版本。


注意:
Since July 2023, Microsoft has renamed Azure Active Directory (Azure AD) to Microsoft Entra ID. In this document, any reference to Azure Active Directory, Azure AD, or AAD now refers to Microsoft Entra ID.
-
-
配置 Azure 存储帐户和文件共享以存储录制文件。有关定价信息,请参阅 Azure 文件存储定价。
配置 Azure 存储帐户和文件共享以存储录制文件(/zh-cn/session-recording/service/media/configure-azure-storage-account-and-file-shares-for-recording-storage.png)
-
在 Azure 中创建两个 SQL 数据库。一个用作会话录制数据库(命名为 sessionrecording),另一个用作管理员日志记录数据库(命名为 sessionrecordinglogging)。
在 Azure 中创建两个 SQL 数据库(/zh-cn/session-recording/service/media/create-two-sql-databases.png)
注意:
通过主机连接部署的现有站点添加资源(特别是会话录制服务器)时,您需要提供在站点创建期间设置的数据库管理员密码。
-
创建负载均衡器以在会话录制服务器之间分配工作负载。在“将负载均衡器的访问权限限制为仅以下地址”字段中输入 VDA 的 IP 地址或范围,并用逗号 (,) 分隔。有关定价信息,请参阅 负载均衡器定价。
创建负载均衡器(/zh-cn/session-recording/service/media/azure-load-balancer.png)
-
(可选)将标签应用于要创建的 Azure 资源。
将标签应用于 Azure 资源(/zh-cn/session-recording/service/media/applying-tags-to-azure-resources.png)
-
创建安全客户端,将会话录制服务器载入会话录制服务。
单击“创建客户端”以让 Citrix 代表您创建一个安全客户端。或者,您可以通过 Citrix Cloud™ 控制台的“身份和访问管理 > API 访问”选项卡创建安全客户端,然后填写以下信息。

-
查看要创建站点的摘要。如有需要,单击铅笔图标编辑您的设置,或单击按钮开始部署。

以下列出了部署过程的一些示例:
部署正在进行中:

在站点部署进行期间,您可以单击“查看状态”以查看进度。
部署失败:

如果在部署过程中发生错误,单击“查看状态”以查看错误详细信息。错误详细信息示例如下:

您可以单击“返回配置”或“取消部署”。如果单击“返回配置”,您将返回到“创建站点”页面,您可以在其中更改配置并重试。如果确定要取消部署,请按照向导删除站点以及为该站点创建的 Azure 资源。例如:

部署成功:
站点部署完成后,您可以展开站点并查看和管理其下创建的资源。“查看状态”按钮变为“设置”。Azure 图标可用于表示部署在 Azure 上的站点。 有关站点设置的信息,请参阅站点和服务器设置。

将资源添加到部署在 Azure 上的现有站点
对于您已通过主机连接部署在 Azure 上的现有站点,您可以向其添加资源,包括服务器和存储。为此,请完成以下步骤:
- 从会话录制服务的左侧导航栏中选择“配置 > 服务器管理”。
- 在“服务器管理”页面上,找到并展开目标站点。Azure 图标可用于表示部署在 Azure 上的站点。
-
单击“添加资源”。

-
在“添加资源”页面上,根据需要单击“添加服务器”和“添加存储”。

-
要添加服务器,请单击“添加服务器”,然后完成以下步骤:

- 指定要添加的服务器数量。
- 在“域”部分中单击“提供凭据”,以将新服务器加入与现有服务器相同的域。
- 在“管理员帐户”部分中单击“提供凭据”,以提供在站点创建期间设置的数据库管理员密码。此外,您需要为正在添加的服务器计算机上的管理员帐户设置密码。我们建议使用与站点创建期间设置的密码相同的密码。
- 点击“创建客户端”以将新服务器载入会话录制服务。
- 点击“开始部署”。
-
要添加用于存储录制文件的存储,请点击“添加存储”,然后相应地完成以下步骤:
-
如果您的站点是使用标准存储帐户创建的,系统会提示您指定要添加的文件共享数量。例如:
要为标准存储帐户添加的文件共享(/zh-cn/session-recording/service/media/file-shares-to-add-for-a-standard-storage.png)
-
如果您的站点是使用高级存储帐户创建的,您可以指定要添加的文件共享数量并自定义每个文件共享的容量。例如:
要为标准存储帐户添加的文件共享(/zh-cn/session-recording/service/media/file-shares-to-add-for-a-premium-storage.png)
-
点击“开始部署”。
注意:
- “开始部署”按钮在以下任一条件满足时可用:
- 至少已指定一台服务器,并且已配置域和安全客户端。
- 至少已指定一个文件共享。
- 当资源部署正在进行时,负载均衡器的“设置”按钮将被禁用。
-
添加资源的部署可能会失败,并且会话录制服务可能无法从您的订阅中删除这些资源。在这种情况下,系统会提供类似于以下的提示,供您采取措施:
清理资源失败(/zh-cn/session-recording/service/media/failed-to-clean-up-resources.png)
- “开始部署”按钮在以下任一条件满足时可用:
-
-
更改允许访问负载均衡器的 IP 地址
对于已通过主机连接部署在 Azure 上的现有站点,您可以更改允许访问负载均衡器的 IP 地址。为此,请完成以下步骤:
- 从会话录制服务的左侧导航中选择 配置 > 服务器管理。
- 在“服务器管理”页面上,找到并展开目标站点。Azure 图标可用于表示部署在 Azure 上的站点。
-
在“负载均衡器”部分中,单击“设置”按钮。
负载均衡器的设置按钮(/zh-cn/session-recording/service/media/settings-button-for-the-load-balancer.png)
-
在“负载均衡器”设置页面上,在“将负载均衡器的访问权限限制为仅以下地址”字段中输入您的 VDA 的新 IP 地址或范围,并用逗号 (,) 分隔。
设置哪些 VDA 可以访问负载均衡器(/zh-cn/session-recording/service/media/setting-which-vdas-can-access-the-load-balancer.png)
- 单击“保存”。
查看使用 Azure 的实际成本
对于已通过主机连接部署在 Azure 上的现有站点,单击成本金额以查看成本详细信息。例如:
使用 Azure 的成本(/zh-cn/session-recording/service/media/cost-for-using-azure.png)
成本分析(/zh-cn/session-recording/service/media/cost-analysis.png)
查看实际成本的提示:
- 当您将鼠标悬停在当月的面积图上时,将显示一个日期参考线和当天的叠加数据。
- 不同资源的历史成本由折线图表示。当数据至少有两个月时,折线图才可用。当您将鼠标悬停在折线图上时,会显示一个参考线和该月的成本明细叠加层。要仅查看特定资源的折线图,请将鼠标悬停在该资源上。
添加主机连接
要添加主机连接,请完成以下步骤:
-
在选中“通过主机连接创建和部署站点”的“创建站点”页面上,单击“添加连接”。或者,在“主机连接”页面上,单击“添加连接”。
要访问“创建站点”页面,请从 Session Recording 服务的左侧导航中选择“配置 > 服务器管理”,然后单击“创建站点”。

要访问“主机连接”页面,请从 Session Recording 服务的左侧导航中选择“配置 > 主机连接”:

-
在“添加连接”页面上,为新的主机连接指定名称和描述(可选)。输入您的 Azure 订阅 ID 以及有关您的应用程序注册的以下所需信息:
- 应用程序(客户端)ID
- 服务主体对象 ID(与应用程序关联的服务主体对象的 ID)
- 目录(租户)ID
- 客户端密码
- 密码过期日期

要查找您的 Azure 订阅 ID,请执行以下操作:
- 登录到 Azure 门户。
- 在“Azure 服务”部分下,选择“订阅”。
-
在列表中找到您的订阅,并复制第二列中显示的“订阅 ID”。

要获取有关应用程序注册的所需信息,请执行以下操作:
-
(如果您已注册应用程序,请跳过此步骤。)向 Azure AD 租户注册应用程序。必须注册应用程序才能将身份和访问管理功能委派给 Azure AD。
有两种方法可以注册应用程序。
方法 1:
-
复制以下 Citrix 提供的脚本并将其命名为(例如)AppRegistration.ps1:
<# .SYNOPSIS Copyright (c) Citrix Systems, Inc. All Rights Reserved. .DESCRIPTION Create Azure app registrations and give proper permissions for Citrix Session Recording service deployment .Parameter azureTenantID .Parameter azureSubscriptionID .Parameter appName .Parameter role #> [CmdletBinding()] Param( [Parameter(Mandatory = $true)] [String] $tenantId, [Parameter(Mandatory = $true)] [String] $subscriptionId, [Parameter(Mandatory = $true)] [String] $appName, [Parameter(Mandatory = $true)] [String] $role ) if ($role -ne "Citrix Session Recording service" -and $role -ne "Citrix Session Recording Deployment" -and $role -ne "Contributor") { throw [System.Exception] "Invalid role '$role', only support 'Citrix Session Recording service', 'Citrix Session Recording Deployment', and 'Contributor'." } try { Get-InstalledModule -Name "Az.Accounts" -ErrorAction Stop } catch { Install-Module -Name "Az.Accounts" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force } try { Get-InstalledModule -Name "Az.Resources" -ErrorAction Stop } catch { Install-Module -Name "Az.Resources" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force } Connect-AzAccount -TenantId $tenantId -Subscription $subscriptionId try { $azureAdApplication = Get-AzADApplication -DisplayName $appName if ($null -eq $azureAdApplication) { Write-Host "Create a new app registration for Citrix Session Recording" -ForegroundColor Green $azureAdApplication = New-AzADApplication -DisplayName $appName -AvailableToOtherTenants $false } else { Write-Host "App registration '$appName' already exists." -ForegroundColor Yellow } $azureAdApplicationServicePrincipal = Get-AzADServicePrincipal -DisplayName $appName if($null -eq $azureAdApplicationServicePrincipal) { $azureAdApplicationServicePrincipal = New-AzADServicePrincipal -AppId $azureAdApplication.AppId Write-Host "Create a service principal for app registration '$appName'" -ForegroundColor Green }else{ Write-Host "Service principal already exists for app registration '$appName'" -ForegroundColor Yellow } if ($role -eq "Citrix Session Recording service" -or $role -eq "Citrix Session Recording Deployment") { $rootPath = Get-Location $customRolePath = $(Join-Path -Path $rootPath -ChildPath "sessionrecording.json") | Resolve-Path $customRoleJson = Get-Content $customRolePath | ConvertFrom-Json $customRoleJson.AssignableScopes[0] = "/subscriptions/" + $subscriptionId $tmpCustomRolePath = Join-Path -Path $rootPath -ChildPath "sessionrecording_tmp.json" $roleDef = Get-AzRoleDefinition -Name $role if ($null -eq $roleDef) { try { $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath Write-Host "Create a custom role '$role'" -ForegroundColor Green New-AzRoleDefinition -InputFile $tmpCustomRolePath } catch { Write-Host "Failed to create custom role, error: $_" -ForegroundColor Red throw $_.Exception } } else { try { $customRoleJson | Add-Member -MemberType NoteProperty -Name 'id' -Value $($roleDef.Id) $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath Write-Host "Upadate the custom role '$role'" -ForegroundColor Green Set-AzRoleDefinition -InputFile $tmpCustomRolePath } catch { Write-Host "Failed to update custom role, error: $_" -ForegroundColor Red throw $_.Exception } } } $roleAssignment = Get-AzRoleAssignment -RoleDefinitionName $role -ObjectId $($azureAdApplicationServicePrincipal.Id) if ($null -eq $roleAssignment) { Write-Host "Assign role '$role' to app '$appName'" -ForegroundColor Green New-AzRoleAssignment -RoleDefinitionName $role -ApplicationId $azureAdApplication.AppId } else { Write-Host "Role '$role' already assigned to app '$appName'" -ForegroundColor Yellow } Write-Host "Tenant ID: $tenantId" -ForegroundColor Green Write-Host "Subscription ID: $subscriptionId" -ForegroundColor Green Write-Host "Application ID: $($azureAdApplication.AppId)" -ForegroundColor Green Write-Host "Service principal object ID: $($azureAdApplicationServicePrincipal.Id)" -ForegroundColor Green } catch { Write-Host "Failed to assign role assignment to this app, error: $_" -ForegroundColor Red Write-Host "Please make sure the current azure admin has permission to assign roles" -ForegroundColor Red } <!--NeedCopy--> -
复制以下自定义角色文件并将其命名为 sessionrecording.json。此自定义角色文件有助于为要注册的应用程序分配最低权限。
{ "name": "Citrix Session Recording service", "description": "This role has permissions which allow Citrix Session Recording service to deploy Session Recording resources using a host connection.", "assignableScopes": [ "/subscriptions/*" ], "actions": [ "Microsoft.Compute/availabilitySets/write", "Microsoft.Compute/virtualMachines/delete", "Microsoft.Compute/virtualMachines/extensions/read", "Microsoft.Compute/virtualMachines/extensions/write", "Microsoft.Compute/virtualMachines/read", "Microsoft.Compute/virtualMachines/runCommands/read", "Microsoft.Compute/virtualMachines/runCommands/write", "Microsoft.Compute/virtualMachines/write", "Microsoft.CostManagement/forecast/read", "Microsoft.CostManagement/query/read", "Microsoft.KeyVault/locations/deletedVaults/purge/action", "Microsoft.KeyVault/vaults/PrivateEndpointConnectionsApproval/action", "Microsoft.KeyVault/vaults/read", "Microsoft.KeyVault/vaults/secrets/read", "Microsoft.KeyVault/vaults/secrets/write", "Microsoft.KeyVault/vaults/write", "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action", "Microsoft.ManagedIdentity/userAssignedIdentities/read", "Microsoft.ManagedIdentity/userAssignedIdentities/write", "Microsoft.Network/dnsForwardingRulesets/forwardingRules/read", "Microsoft.Network/dnsForwardingRulesets/forwardingRules/write", "Microsoft.Network/dnsForwardingRulesets/read", "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/read", "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/write", "Microsoft.Network/dnsForwardingRulesets/write", "Microsoft.Network/dnsResolvers/outboundEndpoints/join/action", "Microsoft.Network/dnsResolvers/outboundEndpoints/read", "Microsoft.Network/dnsResolvers/outboundEndpoints/write", "Microsoft.Network/dnsResolvers/read", "Microsoft.Network/dnsResolvers/write", "Microsoft.Network/loadBalancers/backendAddressPools/join/action", "Microsoft.Network/loadBalancers/read", "Microsoft.Network/loadBalancers/write", "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/securityRules/read", "Microsoft.Network/networkSecurityGroups/securityRules/write", "Microsoft.Network/networkSecurityGroups/write", "Microsoft.Network/privateDnsZones/join/action", "Microsoft.Network/privateDnsZones/read", "Microsoft.Network/privateDnsZones/virtualNetworkLinks/read", "Microsoft.Network/privateDnsZones/virtualNetworkLinks/write", "Microsoft.Network/privateDnsZones/write", "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/read", "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/write", "Microsoft.Network/privateEndpoints/read", "Microsoft.Network/privateEndpoints/write", "Microsoft.Network/publicIPAddresses/join/action", "Microsoft.Network/publicIPAddresses/read", "Microsoft.Network/publicIPAddresses/write", "Microsoft.Network/virtualNetworks/join/action", "Microsoft.Network/virtualNetworks/read", "Microsoft.Network/virtualNetworks/subnets/join/action", "Microsoft.Network/virtualNetworks/subnets/read", "Microsoft.Resources/deployments/operationstatuses/read", "Microsoft.Resources/deployments/read", "Microsoft.Resources/deployments/write", "Microsoft.Resources/subscriptions/resourceGroups/delete", "Microsoft.Resources/subscriptions/resourceGroups/read", "Microsoft.Resources/subscriptions/resourceGroups/write", "Microsoft.Sql/servers/auditingSettings/write", "Microsoft.Sql/servers/databases/write", "Microsoft.Sql/servers/firewallRules/write", "Microsoft.Sql/servers/privateEndpointConnectionsApproval/action", "Microsoft.Sql/servers/read", "Microsoft.Sql/servers/write", "Microsoft.Storage/storageAccounts/PrivateEndpointConnectionsApproval/action", "Microsoft.Storage/storageAccounts/fileServices/shares/delete", "Microsoft.Storage/storageAccounts/fileServices/shares/read", "Microsoft.Storage/storageAccounts/fileServices/shares/write", "Microsoft.Storage/storageAccounts/listkeys/action", "Microsoft.Storage/storageAccounts/read", "Microsoft.Storage/storageAccounts/write" ], "NotActions": [], "DataActions": [], "NotDataActions": [] } <!--NeedCopy--> - 请将名为 AppRegistration.ps1 的文件和名为 sessionrecording.json 的文件放置在同一个目录中,以便后续操作。
- 根据需要运行以下任一命令。
要使用上述自定义角色文件 (sessionrecording.json) 创建应用程序并为其分配最低权限,请运行:
``` .\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Citrix Session Recording service" <!--NeedCopy--> ``` To create an application and assign it the Azure built-in **Contributor** role, run: ``` .\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Contributor" <!--NeedCopy--> ```方法 2:
前往 Azure 门户并自行注册应用程序。授予应用程序适当的权限。有关所需的最低权限,请参阅方法 1 中的 sessionrecording.json 文件。
-
-
单击应用程序的显示名称。
应用程序显示名称(/zh-cn/session-recording/service/media/application-display-name.png)
-
在概览页面上,找到应用程序(客户端)ID 和目录(租户)ID。单击本地目录中的托管应用程序旁边的链接,以查找与应用程序关联的服务主体对象的 ID。单击客户端凭据旁边的链接,以查找客户端密钥 ID 及其过期日期。
应用程序要点(/zh-cn/session-recording/service/media/application-essentials.png)
例如,与应用程序关联的服务主体对象的 ID:
服务主体对象 ID(/zh-cn/session-recording/service/media/service-principal-object-id.png)
例如,客户端密钥 ID 及其过期日期:
客户端密钥 ID 及其过期日期(/zh-cn/session-recording/service/media/client-secret-id-and-its-expiration-date.png)
-
单击保存以测试您指定的主机连接是否可用。
如果您指定的主机连接可用,您将返回到主机连接页面,并提示主机连接已成功添加。
会话录制服务分别使用错误和警告图标提醒您已过期和即将过期的客户端密钥。您可以单击相应的主机连接,然后在连接详细信息页面上单击更改密钥以更新客户端密钥及其过期日期。
更改密钥(/zh-cn/session-recording/service/media/change-secret.png)
通过 ARM 模板创建和部署站点
您可以创建 Azure 资源管理器模板 (ARM 模板) 以在 Azure 中部署会话录制资源。以下是实现此目标的主要步骤:
- 在会话录制服务中创建 ARM 模板。ARM 模板是一个 JavaScript 对象表示法 (JSON) 文件,其中包含您要部署的资源以及部署方式。
- 下载并解压缩 ARM 模板。在解压缩的模板文件夹中运行部署脚本,开始将模板中指定的资源部署到 Azure。
- 在 Azure 中检查部署进度。部署完成后,设置会话录制以使其正常运行。要设置会话录制,您需要指定要安装的会话录制服务器版本并上传 resourceInfo.json 文件。
具体的步骤如下所示:
-
从会话录制服务的左侧导航中选择 配置 > 服务器管理。

-
在“服务器管理”页面上,单击“创建站点”。“创建站点”页面随即出现。

-
选择“通过 ARM 模板创建和部署站点”。主要步骤列在左侧导航中。

-
输入站点名称和描述,然后单击“下一步”。
-
(可选)要获取 VM 和存储配置的建议,请提供有关您的录制需求的信息。
您可以通过单击“我很好,跳过此步骤”或在未选择任何内容的情况下单击“下一步”来跳过此步骤。

当您从下拉列表中选择一个选项时,系统会根据您的选择显示建议。建议旁边有一个“重置”按钮。它允许您清除该部分中的选择和相应的建议。
-
转到 Azure 门户,在您选择的区域中创建一个新的虚拟网络,并在新虚拟网络与您的 VDA 连接的虚拟网络之间设置虚拟网络对等互连。然后,在新虚拟网络中添加一个子网。在下方找到并输入子网 ID。

为了保持私有网络中资源之间的连接,请选中“为存储和数据库创建私有终结点”复选框。
选中“为存储和数据库创建私有终结点”复选框后,请考虑以下因素,决定是否输入另一个子网 ID:
- 如果您不打算将会话录制服务器加入 Active Directory 域,则不需要子网,因此请将子网 ID 字段留空。
- 如果您将子网 ID 字段留空,则表示您正在将会话录制服务器加入 Azure Active Directory 域。

-
(如果您已注册应用程序,请跳过此步骤。)向您的 Azure AD 租户注册一个应用程序。必须注册应用程序才能将身份和访问管理功能委派给 Azure AD。
有两种方法可以注册应用程序。
方法 1:
-
复制以下 Citrix 提供的脚本并将其命名为(例如)AppRegistration.ps1:
<# .SYNOPSIS Copyright (c) Citrix Systems, Inc. All Rights Reserved. .DESCRIPTION Create Azure app registrations and give proper permissions for Citrix Session Recording service deployment .Parameter azureTenantID .Parameter azureSubscriptionID .Parameter appName .Parameter role #> [CmdletBinding()] Param( [Parameter(Mandatory = $true)] [String] $tenantId, [Parameter(Mandatory = $true)] [String] $subscriptionId, [Parameter(Mandatory = $true)] [String] $appName, [Parameter(Mandatory = $true)] [String] $role ) if ($role -ne "Citrix Session Recording service" -and $role -ne "Citrix Session Recording Deployment" -and $role -ne "Contributor") { throw [System.Exception] "Invalid role '$role', only support 'Citrix Session Recording service', 'Citrix Session Recording Deployment', and 'Contributor'." } try { Get-InstalledModule -Name "Az.Accounts" -ErrorAction Stop } catch { Install-Module -Name "Az.Accounts" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force } try { Get-InstalledModule -Name "Az.Resources" -ErrorAction Stop } catch { Install-Module -Name "Az.Resources" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force } Connect-AzAccount -TenantId $tenantId -Subscription $subscriptionId try { $azureAdApplication = Get-AzADApplication -DisplayName $appName if ($null -eq $azureAdApplication) { Write-Host "Create a new app registration for Citrix Session Recording" -ForegroundColor Green $azureAdApplication = New-AzADApplication -DisplayName $appName -AvailableToOtherTenants $false } else { Write-Host "App registration '$appName' already exists." -ForegroundColor Yellow } $azureAdApplicationServicePrincipal = Get-AzADServicePrincipal -DisplayName $appName if($null -eq $azureAdApplicationServicePrincipal) { $azureAdApplicationServicePrincipal = New-AzADServicePrincipal -AppId $azureAdApplication.AppId Write-Host "Create a service principal for app registration '$appName'" -ForegroundColor Green }else{ Write-Host "Service principal already exists for app registration '$appName'" -ForegroundColor Yellow } if ($role -eq "Citrix Session Recording service" -or $role -eq "Citrix Session Recording Deployment") { $rootPath = Get-Location $customRolePath = $(Join-Path -Path $rootPath -ChildPath "sessionrecordingdeployment.json") | Resolve-Path $customRoleJson = Get-Content $customRolePath | ConvertFrom-Json $customRoleJson.AssignableScopes[0] = "/subscriptions/" + $subscriptionId $tmpCustomRolePath = Join-Path -Path $rootPath -ChildPath "sessionrecording_tmp.json" $roleDef = Get-AzRoleDefinition -Name $role if ($null -eq $roleDef) { try { $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath Write-Host "Create a custom role '$role'" -ForegroundColor Green New-AzRoleDefinition -InputFile $tmpCustomRolePath } catch { Write-Host "Failed to create custom role, error: $_" -ForegroundColor Red throw $_.Exception } } else { try { $customRoleJson | Add-Member -MemberType NoteProperty -Name 'id' -Value $($roleDef.Id) $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath Write-Host "Upadate the custom role '$role'" -ForegroundColor Green Set-AzRoleDefinition -InputFile $tmpCustomRolePath } catch { Write-Host "Failed to update custom role, error: $_" -ForegroundColor Red throw $_.Exception } } } $roleAssignment = Get-AzRoleAssignment -RoleDefinitionName $role -ObjectId $($azureAdApplicationServicePrincipal.Id) if ($null -eq $roleAssignment) { Write-Host "Assign role '$role' to app '$appName'" -ForegroundColor Green New-AzRoleAssignment -RoleDefinitionName $role -ApplicationId $azureAdApplication.AppId } else { Write-Host "Role '$role' already assigned to app '$appName'" -ForegroundColor Yellow } Write-Host "Tenant ID: $tenantId" -ForegroundColor Green Write-Host "Subscription ID: $subscriptionId" -ForegroundColor Green Write-Host "Application ID: $($azureAdApplication.AppId)" -ForegroundColor Green Write-Host "Service principal object ID: $($azureAdApplicationServicePrincipal.Id)" -ForegroundColor Green } catch { Write-Host "Failed to assign role assignment to this app, error: $_" -ForegroundColor Red Write-Host "Please make sure the current azure admin has permission to assign roles" -ForegroundColor Red } <!--NeedCopy--> -
复制以下自定义角色文件并将其命名为 sessionrecordingdeployment.json。此自定义角色文件有助于为要注册的应用程序分配最低权限。
{ "name": "Citrix Session Recording Deployment", "description": "This role has permissions which allow users to deploy Session Recording resources using an Azure Resource Manager template (ARM template). ", "assignableScopes": [ "/subscriptions/*" ], "actions": [ "Microsoft.Compute/availabilitySets/write", "Microsoft.Compute/virtualMachines/extensions/read", "Microsoft.Compute/virtualMachines/extensions/write", "Microsoft.Compute/virtualMachines/read", "Microsoft.Compute/virtualMachines/runCommands/read", "Microsoft.Compute/virtualMachines/runCommands/write", "Microsoft.Compute/virtualMachines/write", "Microsoft.ContainerInstance/containerGroups/read", "Microsoft.ContainerInstance/containerGroups/write", "Microsoft.KeyVault/vaults/PrivateEndpointConnectionsApproval/action", "Microsoft.KeyVault/vaults/read", "Microsoft.KeyVault/vaults/secrets/read", "Microsoft.KeyVault/vaults/secrets/write", "Microsoft.KeyVault/vaults/write", "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action", "Microsoft.ManagedIdentity/userAssignedIdentities/read", "Microsoft.ManagedIdentity/userAssignedIdentities/write", "Microsoft.Network/dnsForwardingRulesets/forwardingRules/read", "Microsoft.Network/dnsForwardingRulesets/forwardingRules/write", "Microsoft.Network/dnsForwardingRulesets/read", "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/read", "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/write", "Microsoft.Network/dnsForwardingRulesets/write", "Microsoft.Network/dnsResolvers/outboundEndpoints/join/action", "Microsoft.Network/dnsResolvers/outboundEndpoints/read", "Microsoft.Network/dnsResolvers/outboundEndpoints/write", "Microsoft.Network/dnsResolvers/read", "Microsoft.Network/dnsResolvers/write", "Microsoft.Network/loadBalancers/backendAddressPools/join/action", "Microsoft.Network/loadBalancers/write", "Microsoft.Network/networkInterfaces/join/action", "Microsoft.Network/networkInterfaces/read", "Microsoft.Network/networkInterfaces/write", "Microsoft.Network/networkSecurityGroups/join/action", "Microsoft.Network/networkSecurityGroups/read", "Microsoft.Network/networkSecurityGroups/securityRules/read", "Microsoft.Network/networkSecurityGroups/securityRules/write", "Microsoft.Network/networkSecurityGroups/write", "Microsoft.Network/privateDnsZones/join/action", "Microsoft.Network/privateDnsZones/read", "Microsoft.Network/privateDnsZones/virtualNetworkLinks/read", "Microsoft.Network/privateDnsZones/virtualNetworkLinks/write", "Microsoft.Network/privateDnsZones/write", "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/read", "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/write", "Microsoft.Network/privateEndpoints/read", "Microsoft.Network/privateEndpoints/write", "Microsoft.Network/publicIPAddresses/join/action", "Microsoft.Network/publicIPAddresses/read", "Microsoft.Network/publicIPAddresses/write", "Microsoft.Network/virtualNetworks/join/action", "Microsoft.Network/virtualNetworks/read", "Microsoft.Network/virtualNetworks/subnets/join/action", "Microsoft.Network/virtualNetworks/subnets/read", "Microsoft.Resources/deploymentScripts/read", "Microsoft.Resources/deploymentScripts/write", "Microsoft.Resources/deployments/operationstatuses/read", "Microsoft.Resources/deployments/read", "Microsoft.Resources/deployments/validate/action", "Microsoft.Resources/deployments/write", "Microsoft.Resources/subscriptions/resourceGroups/read", "Microsoft.Resources/subscriptions/resourceGroups/write", "Microsoft.Resources/templateSpecs/read", "Microsoft.Resources/templateSpecs/versions/read", "Microsoft.Resources/templateSpecs/versions/write", "Microsoft.Resources/templateSpecs/write", "Microsoft.Sql/servers/auditingSettings/write", "Microsoft.Sql/servers/databases/write", "Microsoft.Sql/servers/firewallRules/write", "Microsoft.Sql/servers/privateEndpointConnectionsApproval/action", "Microsoft.Sql/servers/read", "Microsoft.Sql/servers/write", "Microsoft.Storage/storageAccounts/PrivateEndpointConnectionsApproval/action", "Microsoft.Storage/storageAccounts/blobServices/containers/read", "Microsoft.Storage/storageAccounts/blobServices/containers/write", "Microsoft.Storage/storageAccounts/fileServices/shares/write", "Microsoft.Storage/storageAccounts/listkeys/action", "Microsoft.Storage/storageAccounts/read", "Microsoft.Storage/storageAccounts/write" ], "notActions": [], "dataActions": [], "notDataActions": [] } <!--NeedCopy--> - Put AppRegistration.ps1 and sessionrecordingdeployment.json in the same folder.
-
根据需要运行以下任一命令。
要使用上述自定义角色文件 (sessionrecordingdeployment.json) 创建应用程序并为其分配最低权限,请运行:
.\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Citrix Session Recording Deployment" <!--NeedCopy-->要创建应用程序并为其分配 Azure 内置的 参与者 角色,请运行:
.\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Contributor" <!--NeedCopy-->
方法 2:
转到 Azure 门户并自行注册应用程序。向应用程序授予适当的权限。有关所需的最低权限,请参阅方法 1 中的 sessionrecordingdeployment.json 文件。
-
-
指定您稍后将要安装的会话录制服务器的配置信息。

注意:
- 如果存在建议数量,则“VM 数量”字段将预填充该数量。根据需要更改数量。
- 估算成本基于标准定价,并且未将任何折扣纳入考量。您可以预期实际成本将低于估算值。
-
将会话录制服务器加入与 VDA 相同的域,并为会话录制服务器指定证书。
-
如果您的 VDA 连接到 Active Directory 域,请选中“将服务器加入 Active Directory 域”复选框并输入相关信息。
-
如果您的 VDA 连接到 Azure Active Directory (Azure AD) 域,请清除“将服务器加入 Active Directory 域”复选框。完成当前站点的创建后,请务必手动将会话录制服务器加入同一 Azure AD 域。请注意,纯 Azure AD 部署仅适用于 Session Recording 2402 及更高版本。


-
-
配置 Azure 存储帐户和文件共享以存储您的录制文件。有关定价信息,请参阅 Azure 文件存储定价。

-
在 Azure 中创建两个 SQL 数据库。一个用作会话录制数据库(命名为 sessionrecording),另一个用作管理员日志记录数据库(命名为 sessionrecordinglogging)。

-
创建负载均衡器以在会话录制服务器之间分配工作负载。在将负载均衡器的访问权限限制为仅以下地址字段中输入您的 VDA 的 IP 地址或范围,并用逗号 (,) 将它们隔开。有关定价信息,请参阅负载均衡器定价。

-
(可选)将标签应用于要创建的 Azure 资源。

-
创建安全客户端以将会话录制服务器载入会话录制服务。
单击创建客户端以让 Citrix 代表您创建安全客户端。或者,您可以通过 Citrix Cloud 控制台的身份和访问管理 > API 访问选项卡创建安全客户端,然后填写以下信息。

-
查看要创建的资源的摘要,如果需要,单击铅笔图标编辑您的设置。之后,单击下载模板。包含您要部署的资源的方式和内容的 AEM 模板将下载到您计算机上的下载文件夹中。您还可以在服务器管理页面上看到新创建的站点。

-
转到下载文件夹并解压缩 ARM 模板。打开解压缩的文件文件夹,在地址栏中键入 PowerShell,然后按 Enter。等待 PowerShell 窗口在该文件夹中打开。
-
运行名为 DeploySessionRecording.ps1 的 JavaScript 对象表示法 (JSON) 脚本。为提示的参数提供值。实际参数因您在创建模板时指定的设置而异。例如:


-
前往 Azure 门户,找到包含您的部署的资源组,然后检查部署进度。等待整个部署显示 成功。
Azure 中的部署进度(/zh-cn/session-recording/service/media/check-deployment-progress-in-azure.png)
-
返回会话录制服务的服务器管理页面。找到新创建的站点,您将看到一个可用的设置按钮。单击设置以设置会话录制,使其正常运行。
新站点旁边的设置按钮(/zh-cn/session-recording/service/media/setup-button.png)
检查设置会话录制的前提条件(/zh-cn/session-recording/service/media/checking-prerequisites-for-setting-up-session-recording.png)
要设置会话录制,您需要指定要安装的会话录制服务器版本并上传 resourceInfo.json 文件。
选择会话录制服务器版本(/zh-cn/session-recording/service/media/selecting-session-recording-server-version.png)
上传资源信息(/zh-cn/session-recording/service/media/uploading-resource-info.png)
输入您的数据库的凭据。
输入数据库的凭据(/zh-cn/session-recording/service/media/enter-the-credentials-for-databases.png)
单击开始启动。然后,您可以在服务器管理页面上检查设置进度。
设置进行中(/zh-cn/session-recording/service/media/setup-in-progress.png)
设置步骤(/zh-cn/session-recording/service/media/setup-steps.png)
您可以在服务器列表中查看单个服务器的安装进度。
单个服务器的安装进度(/zh-cn/session-recording/service/media/installation-progress-of-an-individual-server.png)
当所有会话录制服务器在列表中显示可用时,您的站点创建完成,并且指定的资源已部署到 Azure。
