<# .SYNOPSIS Liest Windows Task Scheduler Aufgaben vom Vortag aus. Aus dem Aufgaben-Namen (Format: HOSTNAME_User) wird der Hostname extrahiert und in Citrix geprueft, ob die Maschine Registered ist (eingeschaltet + registriert). Ergebnisse werden in ein CSV-Log geschrieben. .DESCRIPTION 1. Holt alle Task Scheduler Aufgaben vom Vortag (Execution Time). 2. Extrahiert den Hostnamen aus dem Aufgaben-Namen (erster Teil vor '_'). 3. Queryt Citrix Broker, ob die Maschine Registered und PowerState On ist. 4. Schreibt Ergebnisse in ein CSV-Log und ein Text-Log. .EXAMPLE .\Get-YesterdayCitrixRegistration.ps1 .NOTES Datei: Get-YesterdayCitrixRegistration.ps1 Autor: alin Umgebung: Windows mit Task Scheduler + Citrix VDA Ort: Hermes/ (gemäss Gitea-Konvention) #> [CmdletBinding()] param( [string]$LogPath = "C:\Logs\CitrixRegistration", [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 } # --- Citrix Broker Modul laden --- 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 } # --- Vortag berechnen --- $Yesterday = (Get-Date).AddDays(-$DaysBack).Date $Tomorrow = $Yesterday.AddDays(1) Write-Log "Pruefe Aufgaben vom Vortag ($Yesterday)" # --- Task Scheduler Aufgaben vom Vortag holen --- # Alle Aufgaben abfragen und nach letzter Ausfuehrung filtern $AllTasks = Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } $YesterdayTasks = @() foreach ($Task in $AllTasks) { try { $TaskInfo = $Task | Get-ScheduledTaskInfo -ErrorAction Stop # Letzte Ausfuehrung pruefen if ($TaskInfo.LastRunTime -ge $Yesterday -and $TaskInfo.LastRunTime -lt $Tomorrow) { $YesterdayTasks += [PSCustomObject]@{ TaskName = $Task.TaskName TaskPath = $Task.TaskPath LastRun = $TaskInfo.LastRunTime State = $Task.State } } } catch { # Aufgaben ohne History (nie gelaufen) ueberspringen } } if (@($YesterdayTasks).Count -eq 0) { Write-Log "Keine Aufgaben vom Vortag ($Yesterday) gefunden." "WARNING" exit 0 } Write-Log "$($YesterdayTasks.Count) Aufgabe(n) vom Vortag gefunden." # --- Hostnames aus Aufgaben-Namen extrahieren --- $Results = @() foreach ($Task in $YesterdayTasks) { $taskName = $Task.TaskName # Hostname-Extraktion: Format "HOSTNAME_User" -> erster Teil vor dem ersten '_' $hostname = ($taskName -split '_')[0] if (-not $hostname -or $hostname -eq $taskName) { Write-Log "Konnte keinen Hostnamen aus Aufgaben-Namen '$taskName' extrahieren." "WARN" continue } Write-Log "Pruefe Maschine: $hostname (Aufgabe: $taskName)" # --- Citrix Registrierungsstatus pruefen --- $citrixStatus = @{ TaskName = $taskName Hostname = $hostname LastRun = $Task.LastRun.ToString('yyyy-MM-dd HH:mm:ss') CheckTime = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' IsRegistered = $false IsPoweredOn = $false PowerState = 'Unknown' RegistrationState = 'Unknown' SessionState = 'Unknown' } try { $brokerMachine = Get-BrokerMachine -MachineName $hostname -ErrorAction Stop if ($brokerMachine) { $citrixStatus.IsRegistered = $true $citrixStatus.RegistrationState = 'Registered' Write-Log " -> REGISTRIERT: Ja" } else { Write-Log " -> REGISTRIERT: Nein (Maschine nicht in Citrix gefunden)" "WARN" $citrixStatus.RegistrationState = 'NotRegistered' } # PowerState pruefen $powerState = $brokerMachine.PowerState $citrixStatus.PowerState = $powerState $citrixStatus.IsPoweredOn = ($powerState -eq 'On') Write-Log " -> PowerState: $powerState" # SessionState pruefen (zusaetzliche Info) if ($brokerMachine.SessionState) { $citrixStatus.SessionState = $brokerMachine.SessionState Write-Log " -> SessionState: $($brokerMachine.SessionState)" } } catch { Write-Log " -> FEHLER 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 $poweredOn = ($Results | Where-Object { $_.IsPoweredOn -eq $true }).Count Write-Log "=== ZUSAMMENFASSUNG ===" Write-Log " Gesamt geprueft: $(@($Results).Count)" Write-Log " Registriert + PoweredOn: $poweredOn" Write-Log " Registriert + Aus: $($registered - $poweredOn)" Write-Log " Nicht registriert: $notRegistered" Write-Log " Fehler: $errors" Write-Log "Log-Datei: $LogFile" Write-Log "CSV-Datei: $CsvFile"