<# .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"