
Parallels RAS bewaart zijn volledige configuratie in een centrale database op de Connection Broker: publicatieregels, farmtopologie, sessiebeleid, aanpassingen van de interface en meer. Raak je die configuratie kwijt — na een uitgevallen broker, een mislukte update of een volledige herbouw van een server —, dan moet je alles handmatig opnieuw instellen, wat bij een complexe omgeving uren kan kosten.
Met de cmdlet Invoke-RASExportSettings uit de PowerShell-SDK van Parallels RAS exporteer je de volledige configuratie naar een .dat2-bestand, dat je op elk moment kunt terugzetten met Invoke-RASImportSettings. Het script in dit artikel automatiseert die export dagelijks en regelt de bewaartermijn van de bestanden.
De authenticatie gebeurt met een apart domeinaccount svc_rasexport, waarvan het wachtwoord lokaal versleuteld wordt opgeslagen in een referentiebestand via de SecureString-API van PowerShell. De back-ups komen op een aparte netwerkshare \MSHOME-VEEAMRASBACKUP$ op de Veeam-back-upserver. Dit account heeft de rol RAS Administrator nodig in de RAS-farm — Power Administrator is niet genoeg. In dit voorbeeld draait het script rechtstreeks op een van de brokers.

$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
$LogFile = "$ScriptRootRASBackup_$(Get-Date -Format 'yyyy-MM').log"
$BackupShare = "\MSHOME-VEEAM\RASBACKUP$\$(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
}
Om het referentiebestand aan te maken, voer je het volgende script één keer interactief uit op de broker, met het account waaronder de geplande taak zal draaien:
$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"
Op dit moment kun je dit script niet met een gMSA-account uitvoeren. De cmdlet New-RASSession vereist een expliciete parameter -Password van het type SecureString, wat niet samengaat met het wachtwoordbeheer van gMSA-accounts. Een klassiek serviceaccount met een versleuteld wachtwoordbestand blijft de enige werkbare optie.
