From 786ab05ae39ed793ae5a03ce42de18b6011d18b7 Mon Sep 17 00:00:00 2001 From: buiaca Date: Wed, 29 Jul 2026 23:39:44 +0200 Subject: [PATCH] feat: Add Get-YesterdayCitrixRegistration.ps1 - SCCM deployments vom Vortag, Citrix Registration Check, CSV-Log --- Hermes/Get-YesterdayCitrixRegistration.ps1 | 160 +++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 Hermes/Get-YesterdayCitrixRegistration.ps1 diff --git a/Hermes/Get-YesterdayCitrixRegistration.ps1 b/Hermes/Get-YesterdayCitrixRegistration.ps1 new file mode 100644 index 0000000..6c4e107 --- /dev/null +++ b/Hermes/Get-YesterdayCitrixRegistration.ps1 @@ -0,0 +1,160 @@ +<# +.SYNOPSIS + Liest SCCM-App-Deployments vom Vortag aus, extrahiert Hostnames aus den Namen + und prüft in Citrix, ob die jeweiligen VDAs registriert (eingeschaltet + registriert) sind. + Ergebnisse werden in ein Log geschrieben. +.DESCRIPTION + 1. Holt alle App-Deployments vom Vortag (oder seit dem letzten Lauf). + 2. Extrahiert den Hostnamen aus dem Deployment-Namen (erste Bestandteile vor Bindestrich/Trennzeichen). + 3. Queryt Citrix Broker, ob die Maschine registered ist. + 4. Schreibt Ergebnisse in ein CSV-Log unter \\server\share\Logs\ oder lokal. +.NOTES + Datei: Get-YesterdayCitrixRegistration.ps1 + Autor: alin + Umgebung: SCCM + Citrix VDA; Citrix Broker PowerShell SDK vorausgesetzt. + Ort: Hermes/ (gemäss Gitea-Konvention) +#> + +[CmdletBinding()] +param( + [string]$LogPath = "C:\Logs\CitrixRegistration", + [string]$SCCMServer = "sccm-server", + [string]$CitrixSiteServer = "citrix-site-server", + [int]$DaysBack = 1 +) + +# --- Logging --- +$LogFile = Join-Path $LogPath "CitrixRegistration_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" +$CsvFile = Join-Path $LogPath "CitrixRegistration_$(Get-Date -Format 'yyyyMMdd').csv" + +function Write-Log { + param([string]$Message, [string]$Level = "INFO") + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $entry = "[$timestamp] [$Level] $Message" + Write-Host $entry + Add-Content -Path $LogFile -Value $entry -Encoding UTF8 +} + +# --- Pfade + SCCM-Modul laden --- +try { + Import-Module ConfigurationManager -ErrorAction Stop + Write-Log "SCCM-Modul geladen." +} catch { + Write-Log "SCCM-Modul konnte nicht geladen werden: $_" "ERROR" + exit 1 +} + +try { + Import-Module Citrix.Broker.Admin.V2 -ErrorAction Stop + Write-Log "Citrix Broker-Modul geladen." +} catch { + Write-Log "Citrix Broker-Modul konnte nicht geladen werden: $_" "ERROR" + exit 1 +} + +# SCCM Drive verbinden +$SiteCode = $(Get-PSDrive -PSProvider CMSite -ErrorAction SilentlyContinue | Select-Object -First 1).Name +if (-not $SiteCode) { + Write-Log "Kein SCCM-Site-Code gefunden. Bitte Site-Setup pruefen." "ERROR" + exit 1 +} +Set-Location "$($SiteCode):\" +Write-Log "SCCM-Site: $SiteCode" + +# --- Vortag berechnen --- +$Yesterday = (Get-Date).AddDays(-$DaysBack).Date +$Tomorrow = $Yesterday.AddDays(1) +Write-Log "Pruefe Deployments vom $Yesterday" + +# --- SCCM App-Deployments vom Vortag holen --- +$Deployments = Get-CMApplicationDeployment | + Where-Object { $_.CollectionName -and $_.LastModificationTime -ge $Yesterday -and $_.LastModificationTime -lt $Tomorrow } | + Select-Object -Unique -Property Name, CollectionName, LastModificationTime + +if (-not $Deployments -or @($Deployments).Count -eq 0) { + Write-Log "Keine neuen Deployments vom $Yesterday gefunden." "WARNING" + # Auch ohne Deployments beenden und Log schreiben + exit 0 +} + +Write-Log "$($Deployments.Count) Deployment(s) vom Vortag gefunden." + +# --- Hostnames aus Deployment-Namen extrahieren --- +$Results = @() + +foreach ($Deployment in $Deployments) { + $deploymentName = $Deployment.Name + + # Hostname-Extraktion: typischer Format "HOSTNAME - Beschreibung" oder "HOSTNAME_Beschreibung" + # Verschiedene Trennzeichen durchprobieren + $hostname = $null + + if ($deploymentName -match '^([A-Za-z0-9_-]+)[\s_\-]\s*') { + $hostname = $Matches[1] + } + elseif ($deploymentName -match '^([A-Za-z0-9_-]+)$') { + $hostname = $deploymentName + } + + if (-not $hostname) { + Write-Log "Konnte keinen Hostnamen aus Deployment-Namen '$deploymentName' extrahieren." "WARN" + continue + } + + Write-Log "Pruefe Maschine: $hostname (Deployment: $deploymentName)" + + # --- Citrix Registrierungsstatus pruefen --- + $citrixStatus = @{ + MachineName = $hostname + DeploymentName = $deploymentName + CheckTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + IsRegistered = $false + IsPoweredOn = $false + PowerState = "Unknown" + RegistrationState = "Unknown" + } + + try { + $brokerMachine = Get-BrokerMachine -MachineName $hostname -ErrorAction Stop + + if ($brokerMachine) { + $citrixStatus.IsRegistered = $true + Write-Log " -> REGISTRIERT: Ja" + } else { + Write-Log " -> REGISTRIERT: Nein (Maschine nicht in Citrix gefunden)" "WARN" + } + + # PowerState pruefen + $powerState = $brokerMachine.PowerState + $citrixStatus.PowerState = $powerState + $citrixStatus.IsPoweredOn = ($powerState -eq 'On') + Write-Log " -> PowerState: $powerState" + + } catch { + Write-Log " -> FEHER bei Citrix-Abfrage fuer $hostname : $_" "ERROR" + $citrixStatus.RegistrationState = "Error" + } + + $Results += [PSCustomObject]$citrixStatus +} + +# --- CSV schreiben --- +if ($Results.Count -gt 0) { + $Results | Export-Csv -Path $CsvFile -NoTypeInformation -Encoding UTF8 -Delimiter ";" + Write-Log "CSV-Log geschrieben: $CsvFile ($($Results.Count) Eintraege)" +} else { + Write-Log "Keine Ergebnisse zum Schreiben." "WARNING" +} + +# --- Zusammenfassung --- +$registered = ($Results | Where-Object { $_.IsRegistered -eq $true }).Count +$notRegistered = ($Results | Where-Object { $_.IsRegistered -eq $false -and $_.RegistrationState -ne "Error" }).Count +$errors = ($Results | Where-Object { $_.RegistrationState -eq "Error" }).Count + +Write-Log "=== ZUSAMMENFASSUNG ===" +Write-Log " Gesamt geprueft: $(@($Results).Count)" +Write-Log " Registriert: $registered" +Write-Log " Nicht registriert: $notRegistered" +Write-Log " Fehler: $errors" +Write-Log "Log-Datei: $LogFile" +Write-Log "CSV-Datei: $CsvFile" \ No newline at end of file