使用 WEM API 和 Windows PowerShell 自动备份配置集
作为工作区环境管理 (WEM) 管理员,您可能需要定期备份配置集以防止设置丢失。 您可能希望触发备份,例如每 12 小时一次,并在本地自动管理备份文件。 使用 WEM 公共 API 和 Windows PowerShell,您可以实现该目标。
一般工作流程如下所示:
- 申请 Citrix Cloud API 客户端
- 编写 PowerShell 脚本来备份配置集
- 配置计划任务来运行脚本
必备条件
在开始之前,请确保您知道您的 Citrix 客户 ID 和相关的 API 基础 URL。
登录 Citrix Cloud,导航到 身份和访问管理 > API 访问,然后找到您的 Citrix 客户 ID。
API 基本 URL(包括 Citrix Auth API 基本 URL 和 WEM API 基本 URL)与您要连接的 Citrix Cloud 区域相关。 当您登录 Citrix Cloud 时确定区域。 您还可以在 账户设置中查询您的地区。
您可以通过查看下表找到 API 基本 URL。
地区 | Citrix Auth API 基本 URL | WEM API 基本 URL |
---|---|---|
美国(US) | api-us.cloud.com | api.wem.cloud.com |
欧洲联盟(EU) | api-eu.cloud.com | eu-api.wem.cloud.com |
亚太南部 (AP-S) | api-ap-s.cloud.com | aps-api.wem.cloud.com |
日本 (JP) | api.citrixcloud.jp | jp-api.wem.citrixcloud.jp |
有关 API 基本 URL 的更多信息,请参阅 开始使用 Citrix Cloud API 和 WEM API 概述。
申请 Citrix Cloud API 客户端
导航到 身份和访问管理 > API 访问。 输入您的安全客户端的名称,单击 创建客户端,并在本地保存安全客户端 ID 和客户端密钥。
编写 PowerShell 脚本来备份配置集
使用以下 PowerShell 脚本并将其保存为 Invoke-WEMConfigSetBackupAPI.ps1
。 请确保替换脚本开头的变量。
# replace the variables before running the script
$CitrixCustomerId = 'your-citrix-customer-id'
$CitrixAuthAPIBaseURL = 'api-us.cloud.com'
$CitrixWEMAPIBaseURL = 'api.wem.cloud.com'
$ClientId = 'your-api-client-id'
$ClientSecret = 'your-api-client-secret'
$ConfigSetsToBackUp = @('Default Site', 'MyConfigSet') # leave it empty if you want to back up all configuration sets
$FolderToSaveBackup = 'C:\ProgramData'
# get bearer token
$ErrorActionPreference = 'Stop'
$URL = "https://${CitrixAuthAPIBaseURL}/cctrustoauth2/${CitrixCustomerId}/tokens/clients"
$Body = "grant_type=client_credentials&client_id=${ClientId}&client_secret=${ClientSecret}"
$Response = Invoke-RestMethod -Method 'Post' -Uri $URL -Body $Body -ContentType 'application/x-www-form-urlencoded'
$BearerToken = $Response.access_token
if ([string]::IsNullOrEmpty($BearerToken))
{
throw 'Cannot retrieve bearer token.'
}
Write-Host "Retrieved bearer token successfully."
# back up WEM configuration sets
if (-not (Test-Path -Path $FolderToSaveBackup -PathType 'Container'))
{
throw 'The folder to save backup not exists.'
}
$Headers = @{
'Citrix-CustomerId' = $CitrixCustomerId
'Accept' = 'application/json'
'Authorization' = "CWSAUTH bearer=${BearerToken}"
}
if ($ConfigSetsToBackUp.Count -eq 0 -or $ConfigSetsToBackUp -eq $null)
{
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/sites"
$Response = Invoke-RestMethod -Method 'Get' -Uri $URL -Headers $Headers
$ConfigSetsToBackUp = $Response.items |% { $_.name }
}
$ConfigSetsToBackUp | ForEach-Object {
Write-Host "Backing up configuration set ""$_"""
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/sites/%24export?name=$_"
Write-Host "GET $URL"
$Response = Invoke-RestMethod -Method 'Get' -Uri $URL -Headers $Headers
$Timestamp = Get-Date -Format "yyyyMMddHHmmss"
$Response | ConvertTo-Json -Depth 10 | Out-File (Join-Path $FolderToSaveBackup "${_}-${Timestamp}.json")
}
<!--NeedCopy-->
有关承载令牌的更多信息,请参阅 开始使用 Citrix Cloud API。
有关使用 WEM API 备份配置集的更多信息,请参阅 导出 WEM 配置集 API。
注意:
每个承载令牌将在一小时后过期。 为了避免频繁调用 Citrix Cloud 身份验证 API 和 WEM API,请缓存承载令牌并在备份持续时间少于一小时时重复使用它。
如果遇到错误 504 Gateway Time-out,则很可能意味着您的配置集太大,导致备份时间超过 1 分钟的 API 超时。 在这种情况下,请尝试使用以下 PowerShell 脚本。 请注意,此脚本使用了当前未公开的 API,并且这些 API 将来可能会发生变化。
# replace the variables before running the script
$CitrixCustomerId = 'your-citrix-customer-id'
$CitrixAuthAPIBaseURL = 'api-us.cloud.com'
$CitrixWEMAPIBaseURL = 'api.wem.cloud.com'
$ClientId = 'your-api-client-id'
$ClientSecret = 'your-api-client-secret'
$ConfigSetsToBackUp = @('Default Site', 'MyConfigSet') # leave it empty if you want to back up all configuration sets
$FolderToSaveBackup = 'C:\ProgramData'
# get bearer token
$ErrorActionPreference = 'Stop'
$URL = "https://${CitrixAuthAPIBaseURL}/cctrustoauth2/${CitrixCustomerId}/tokens/clients"
$Body = "grant_type=client_credentials&client_id=${ClientId}&client_secret=${ClientSecret}"
$Response = Invoke-RestMethod -Method 'Post' -Uri $URL -Body $Body -ContentType 'application/x-www-form-urlencoded'
$BearerToken = $Response.access_token
if ([string]::IsNullOrEmpty($BearerToken))
{
throw 'Cannot retrieve bearer token.'
}
Write-Host "Retrieved bearer token successfully."
# back up WEM configuration sets
if (-not (Test-Path -Path $FolderToSaveBackup -PathType 'Container'))
{
throw 'The folder to save backup not exists.'
}
$Headers = @{
'Citrix-CustomerId' = $CitrixCustomerId
'Accept' = 'application/json'
'Authorization' = "CWSAUTH bearer=${BearerToken}"
}
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/sites"
$Response = Invoke-RestMethod -Method 'Get' -Uri $URL -Headers $Headers
$Sites = $Response.items
if ($ConfigSetsToBackUp -ne $null -and $ConfigSetsToBackUp.Count -gt 0)
{
$Sites = $Sites | Where-Object { $_.name -in $ConfigSetsToBackUp }
}
$Sites | ForEach-Object {
$Name = $_.name
Write-Host "Backing up configuration set `"$Name`""
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/export/site?async=true"
$FolderName = "BACKUPFOLDER-" + [Guid]::NewGuid().ToString()
$Body = @{
folderName = $FolderName
id = $_.id
name = $_.name
type = 'Configuration set'
} | ConvertTo-Json
$Response = Invoke-RestMethod -Method 'Post' -Uri $URL -Headers $Headers -Body $Body -ContentType 'application/json; charset=utf-8'
Write-Host "Waiting for the backup job to complete..."
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/export/site/recentJobs"
do
{
Start-Sleep -Seconds 5
$Response = Invoke-RestMethod -Method 'Get' -Uri $URL -Headers $Headers
$BackupJob = $Response.backup[0]
$IsOnGoing = $BackupJob.id -eq $_.id -and $BackupJob.status -eq 'Running'
} while ($IsOnGoing)
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/export/site/contentView?name=${FolderName}"
$Response = Invoke-RestMethod -Method 'Get' -Uri $URL -Headers $Headers
$Timestamp = Get-Date -Format "yyyyMMddHHmmss"
$Response | ConvertTo-Json -Depth 10 | Out-File (Join-Path $FolderToSaveBackup "${Name}-${Timestamp}.json") -Encoding utf8
$URL = "https://${CitrixWEMAPIBaseURL}/services/wem/export?prefix=site%2F${FolderName}%2F"
$Response = Invoke-RestMethod -Method 'Delete' -Uri $URL -Headers $Headers
}
<!--NeedCopy-->
配置计划任务来运行脚本
在可以访问 Citrix Cloud 的机器上,从 Windows 开始 菜单启动 任务计划程序
或从 Windows 命令提示符启动 taskschd.msc
。
您可以创建一个名为 WEM 计划任务
的文件夹。
在文件夹中,创建一个名为 launch Invoke-WEMConfigSetBackupAPI.ps1
的任务。 添加一个新的触发器 每 12 小时重复一次,持续 1 天 ,并添加一个启动脚本的新操作 Invoke-WEMConfigSetBackupAPI.ps1
。