PowerShell health-check scripts for Citrix Virtual Apps and Desktops (CVAD / XenApp / XenDesktop), built to be called by a monitoring agent (Nagios, Icinga, PRTG, Checkmk …) with Nagios-style exit codes.
Checks: site version, Citrix license server and license inventory, RDS license server on the workers, VDA/worker inventory, StoreFront replication state, Windows event log thresholds.
PS> .\Get-EventError.ps1 -EventId 7036 -Log System -Days 7 -Count 1
2
PS> $LASTEXITCODE
2
Exit codes: 0 OK · 1 Warning · 2 Critical · 3 Unknown (snap-in missing, read error, missing parameters)
git clone https://github.com/feiglein74/Citrix_CVAD-Monitoring-Check.git
cd Citrix_CVAD-Monitoring-Check
# on a Delivery Controller (Citrix PowerShell snap-ins required)
.\Get-CitrixVersion.ps1 # e.g. "CVAD 2203 LTSR"
.\Get-CitrixWorker.ps1 # all machines of the site as CSV (semicolon)
.\Get-CitrixRDS.ps1 # warning if workers use different RDS license servers
# on a StoreFront server: critical if configuration replication failed
.\Get-CitrixSFSync.ps1
# anywhere: critical if event 1000 occurs 10+ times within the last 4 hours
.\Get-EventError.ps1 -EventId 1000 -Log Application -Hours 4 -Count 10Point your monitoring agent at the script and evaluate the exit code (and stdout where noted).
Detailed documentation is in German.
PowerShell-Skripte für den Health-Check einer Citrix Virtual Apps and Desktops (CVAD) Umgebung. Die Skripte werden von einem Monitoring-Agent aufgerufen und liefern Status bzw. Informationen über stdout und Exit-Code.
- Windows PowerShell 5.1 (PowerShell 7 für
Get-EventError.ps1undGet-EventSourceReport.ps1ebenfalls möglich) - Citrix-Skripte: Ausführung auf einem Delivery Controller (Citrix-Snapins
Citrix.*) Get-CitrixSFSync.ps1: Ausführung auf einem StoreFront-ServerGet-CitrixLicense.ps1: Zugriff auf den Lizenzserver über Port 8083Get-CitrixRDS.ps1: PowerShell-Remoting (WinRM) zu allen Multisession-WorkernGet-CitrixSFSync.ps1: optional ModulCitrix.StoreFrontfür die Cluster-Erkennung (siehe unten)
Alle Skripte folgen dem Nagios/Icinga/PRTG-Schema:
| Code | Bedeutung |
|---|---|
| 0 | OK |
| 1 | Warning |
| 2 | Critical |
| 3 | Unknown (Snapin fehlt, Fehler beim Auslesen, fehlende Parameter) |
Im Fehlerfall wird die Exception-Message mit ausgegeben (Ausnahme: Get-EventError.ps1, siehe unten).
| Skript | Läuft auf | Ausgabe | Exit-Code |
|---|---|---|---|
Get-CitrixVersion.ps1 |
DDC | Release-Name der Site, z.B. CVAD 2203 LTSR |
0 / 3 |
Get-CitrixLicServer.ps1 |
DDC | True <server> wenn der Lizenzserver der lokale Server ist, sonst False <server> |
0 / 3 (Info-Check) |
Get-CitrixLicense.ps1 |
DDC | Tabelle der Lizenzen (Produkt, Edition, Modell, Ablauf, Subscription Advantage, belegt/frei) | 0 / 3 |
Get-CitrixRDS.ps1 |
DDC | RDS-Lizenzserver aller Multisession-Worker; bei Abweichungen Liste pro Worker | 0 / 1 / 3 |
Get-CitrixWorker.ps1 |
DDC | Alle Maschinen der Site als CSV (;) |
0 / 3 |
Get-CitrixSFSync.ps1 |
StoreFront | Statuszeile + Tabellen der StoreFront-Replikation | 0 / 2 / 3 |
Get-EventError.ps1 |
beliebig | Nur der Statuscode (0–3) |
0 / 1 / 2 / 3 |
Get-EventSourceReport.ps1 |
beliebig | Bericht: Event-Quellen nach Häufigkeit | – |
Zählt das Vorkommen einer Event-ID in einem Zeitraum.
.\Get-EventError.ps1 -EventId 1000 -Log Application -Hours 4 -Count 10 -Warning 5| Parameter | Pflicht | Default | Beschreibung |
|---|---|---|---|
-EventId (Alias -event) |
ja | – | Event-ID(s) |
-Log |
ja | – | Application oder System |
-Month, -Days, -Hours |
nein | 0, 0, 4 | Zeitraum rückwärts ab jetzt |
-Count |
nein | 10 | ab dieser Anzahl Critical |
-Warning |
nein | 0 (aus) | ab dieser Anzahl Warning |
Ausgabe ist nur der Statuscode, weil der Agent stdout auswertet. Fehlende Pflichtparameter oder ein nicht lesbares Log ergeben 3.
.\Get-EventSourceReport.ps1 -Month 3 -Days 15System-Log: nur Einträge mit Level Error. Application-Log: alle Einträge. Beides gruppiert nach Quelle, absteigend nach Anzahl.
CSV mit ; als Trennzeichen, alle Felder in Anführungszeichen (ConvertTo-Csv). Mehrere Tags werden mit , verbunden.
"DeliveryGroup";"DNSName";"IPAddress";"SessionSupport";"InMaintenanceMode";"Tags";"PowerState";"RegistrationState"
"DG Office";"ctx-w01.example.local";"10.0.0.11";"MultiSession";"False";"Office,Pool1";"On";"Registered"
Liest auf allen registrierten Multisession-Workern den per Policy gesetzten RDS-Lizenzserver (HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services, Wert LicenseServers) und vergleicht ihn. Reihenfolge und Groß-/Kleinschreibung spielen keine Rolle.
| Ergebnis | Exit | Ausgabe |
|---|---|---|
| alle Worker gleich | 0 | nur der Lizenzserver (wie bisher) |
| abweichender oder fehlender Eintrag, Worker nicht erreichbar | 1 | WARNING - … + eine Zeile pro Worker |
| kein Worker registriert / erreichbar | 3 | Fehlermeldung |
Pro Worker wird höchstens 15 Sekunden auf den Verbindungsaufbau gewartet, die Abfrage läuft parallel.
Wertet die Konfigurations-Replikation der StoreFront-Servergruppe aus. Erste Zeile ist der Status, danach folgen Gesamtstatus und Status pro Server als Tabelle.
| Ergebnis | Exit |
|---|---|
letzte Replikation gesamt und auf allen Servern completed |
0 |
| StoreFront läuft nicht im Cluster (ein Server) | 0 |
Replikation gesamt oder auf mindestens einem Server nicht completed |
2 |
Die Cluster-Erkennung nutzt Get-STFServerGroup aus dem Modul Citrix.StoreFront. Ist das Modul nicht verfügbar, entfällt sie – ein einzelner StoreFront-Server ohne Replikation würde dann Critical melden.
Übersetzt die ProductVersion der Site in den Release-Namen, bekannt bis 7.48 (CVAD 2607). Neuere Versionen werden als Aktueller als CVAD 2607 (<version>) ausgegeben.
Grundlagen für Werte und Verhalten, die sich nicht aus dem Code selbst ergeben (Stand 10.10.2026):
| Thema | Verwendet in | Quelle |
|---|---|---|
Zuordnung ProductVersion (7.xx) → Release-Name |
Get-CitrixVersion.ps1 |
Carl Webster – Citrix product numbers and versions (Community-Tabelle, keine offizielle Citrix-Quelle) |
Versionsschema 7 YYMM ab CVAD 1808 |
Get-CitrixVersion.ps1 |
Citrix Docs – New product names and version numbers |
| 2507 ist ein LTSR-Release | Get-CitrixVersion.ps1 |
Citrix Docs – CVAD 2507 LTSR |
Get-ConfigSite (u.a. ProductVersion, LicenseServerName) |
Get-CitrixVersion.ps1, Get-CitrixLicServer.ps1, Get-CitrixLicense.ps1 |
Citrix SDK – Get-ConfigSite |
Status completed, Aufbau von ServerStates, Cluster-Erkennung über Get-STFServerGroup |
Get-CitrixSFSync.ps1 |
ControlUp – StoreFront Health Checker (Get-DSConfigurationReplicationState ist von Citrix nicht öffentlich dokumentiert) |
Get-STFServerGroup (Mitglieder der Servergruppe) |
Get-CitrixSFSync.ps1 |
Citrix StoreFront SDK – Get-STFServerGroup |
| Offiziell dokumentiertes Gegenstück zur Replikationsabfrage | Get-CitrixSFSync.ps1 |
Citrix StoreFront SDK – Get-STFServerGroupConfiguration |
MIT, siehe LICENSE.