
La sauvegarde de la configuration Parallels RAS est souvent négligée dans les projets — jusqu’au jour où elle manque. Parallels RAS stocke l’intégralité de sa configuration dans une base de données centralisée hébergée sur le Connection Broker : règles de publication, topologie de la farm, politiques de session, personnalisation de l’interface et bien plus encore.
Perdre cette configuration est donc critique. En effet, une panne du broker, une mise à jour ratée ou une reconstruction du serveur suffit. Il faut alors tout reconfigurer manuellement, ce qui peut représenter plusieurs heures de travail. Si vous n’êtes pas encore familier avec l’architecture d’un broker RAS, consultez d’abord l’article Lab Parallels RAS – Architecture physique et logique.
Pourquoi automatiser la sauvegarde configuration Parallels RAS ?
Le cmdlet Invoke-RASExportSettings est inclus dans le SDK PowerShell de Parallels RAS. Il permet d’exporter la configuration complète vers un fichier .dat2. Ce fichier est ensuite réimportable à tout moment via Invoke-RASImportSettings.Le script présenté dans cet article automatise cet export quotidiennement et gère la rétention des fichiers.
Architecture du script
L’authentification repose sur un compte de domaine dédié svc_rasexport, dont le mot de passe est chiffré localement dans un fichier de credentials via l’API SecureString de PowerShell. Les sauvegardes sont stockées sur un partage réseau dédié MSHOME-VEEAMRASBACKUP$, hébergé sur le serveur Veeam Backup & Replication.
Ce compte devra être root administrator sur la ferme RAS. Le script est conçu pour être exécuté depuis un des brokers.

$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
$LogFile = "$ScriptRootRASBackup_$(Get-Date -Format 'yyyy-MM').log"
$BackupShare = "MSHOME-VEEAMRASBACKUP$$(Get-Date -Format 'dd-MM-yyyy').dat2"
$BrokerFQDN = $env:COMPUTERNAME
$ServiceAccount = "svc_rasexport@$($env:USERDNSDOMAIN)"
$CredentialStore = "$ScriptRootsvc_rasexport.cred"
$EncryptionKey = (1..32)
$RetentionDays = 30
function Write-Log {
param([string]$Message, [string]$Level = "INFO")
$Entry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [$Level] $Message"
Add-Content -Path $LogFile -Value $Entry
switch ($Level) {
"ERROR" { Write-Host $Entry -ForegroundColor Red }
"WARN" { Write-Host $Entry -ForegroundColor Yellow }
default { Write-Host $Entry }
}
}
function Get-RASCredential {
if (-not (Test-Path $CredentialStore)) {
Write-Log "Credential store not found: $CredentialStore" "ERROR"
Write-Log "Run once to initialize: Read-Host -AsSecureString | ConvertFrom-SecureString -Key (1..32) | Set-Content '$CredentialStore'" "WARN"
exit 1
}
try {
$SecurePassword = Get-Content $CredentialStore | ConvertTo-SecureString -Key $EncryptionKey
return New-Object System.Management.Automation.PSCredential($ServiceAccount, $SecurePassword)
}
catch {
Write-Log "Failed to decrypt credential: $_" "ERROR"
exit 1
}
}
function Connect-RASBroker {
$Credential = Get-RASCredential
try {
Write-Log "Connecting to RAS broker $BrokerFQDN as $ServiceAccount"
New-RASSession -Server $BrokerFQDN -Username $Credential.UserName -Password $Credential.Password
Write-Log "RAS session established"
return $true
}
catch {
Write-Log "Failed to connect to RAS broker: $_" "ERROR"
return $false
}
}
function Invoke-RASBackup {
$BackupDir = Split-Path -Parent $BackupShare
if (-not (Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null
}
try {
Write-Log "Exporting RAS settings to $BackupShare"
Invoke-RASExportSettings $BackupShare
Write-Log "Export completed successfully"
}
catch {
Write-Log "Export failed: $_" "ERROR"
exit 1
}
finally {
Remove-RASSession -ErrorAction SilentlyContinue
Write-Log "RAS session closed"
}
}
function Invoke-BackupRetention {
$BackupDir = Split-Path -Parent $BackupShare
Get-ChildItem -Path $BackupDir -Filter "*.dat2" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$RetentionDays) } |
ForEach-Object {
Remove-Item $_.FullName -Force
Write-Log "Removed expired backup: $($_.Name)" "WARN"
}
}
Write-Log "Backup started"
if (Connect-RASBroker) {
Invoke-RASBackup
Invoke-BackupRetention
Write-Log "Backup completed"
} else {
Write-Log "Backup failed" "ERROR"
exit 1
}
Pour initialiser les credentials :
$CredentialStore = "$PSScriptRootsvc_rasexport.cred"
$EncryptionKey = (1..32)
Read-Host -AsSecureString -Prompt "Password for svc_rasexport" |
ConvertFrom-SecureString -Key $EncryptionKey |
Set-Content $CredentialStore
Write-Host "Credential store created: $CredentialStore"
Limitation connue : pas de support gMSA
Il n’est pas possible à ce jour d’utiliser un compte gMSA pour exécuter ce script. Le cmdlet New-RASSession attend un paramètre -Password de type SecureString explicite. Or, ce mécanisme est incompatible avec les comptes gMSA. Un compte de service classique reste donc la seule option viable. Un compte de service classique avec mot de passe chiffré reste donc la seule option viable.
Pour aller plus loin sur l’automatisation de l’administration RAS, consultez également les scripts PowerShell disponibles sur RAS Insider.
