diff --git a/Hermes/Get-YesterdayCitrixRegistration.ps1 b/Hermes/Get-YesterdayCitrixRegistration.ps1 index 6c4e107..2ee61b8 100644 --- a/Hermes/Get-YesterdayCitrixRegistration.ps1 +++ b/Hermes/Get-YesterdayCitrixRegistration.ps1 @@ -1,24 +1,26 @@ <# .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. + 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 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. + 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: SCCM + Citrix VDA; Citrix Broker PowerShell SDK vorausgesetzt. + Umgebung: Windows mit Task Scheduler + Citrix VDA 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 ) @@ -35,15 +37,7 @@ function Write-Log { 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 -} - +# --- Citrix Broker Modul laden --- try { Import-Module Citrix.Broker.Admin.V2 -ErrorAction Stop Write-Log "Citrix Broker-Modul geladen." @@ -52,66 +46,67 @@ try { 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" +Write-Log "Pruefe Aufgaben vom Vortag ($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 +# --- Task Scheduler Aufgaben vom Vortag holen --- +# Alle Aufgaben abfragen und nach letzter Ausfuehrung filtern +$AllTasks = Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' } +$YesterdayTasks = @() -if (-not $Deployments -or @($Deployments).Count -eq 0) { - Write-Log "Keine neuen Deployments vom $Yesterday gefunden." "WARNING" - # Auch ohne Deployments beenden und Log schreiben +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 "$($Deployments.Count) Deployment(s) vom Vortag gefunden." +Write-Log "$($YesterdayTasks.Count) Aufgabe(n) vom Vortag gefunden." -# --- Hostnames aus Deployment-Namen extrahieren --- +# --- Hostnames aus Aufgaben-Namen extrahieren --- $Results = @() -foreach ($Deployment in $Deployments) { - $deploymentName = $Deployment.Name +foreach ($Task in $YesterdayTasks) { + $taskName = $Task.TaskName - # Hostname-Extraktion: typischer Format "HOSTNAME - Beschreibung" oder "HOSTNAME_Beschreibung" - # Verschiedene Trennzeichen durchprobieren - $hostname = $null + # Hostname-Extraktion: Format "HOSTNAME_User" -> erster Teil vor dem ersten '_' + $hostname = ($taskName -split '_')[0] - 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" + if (-not $hostname -or $hostname -eq $taskName) { + Write-Log "Konnte keinen Hostnamen aus Aufgaben-Namen '$taskName' extrahieren." "WARN" continue } - Write-Log "Pruefe Maschine: $hostname (Deployment: $deploymentName)" + Write-Log "Pruefe Maschine: $hostname (Aufgabe: $taskName)" # --- 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" + 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 { @@ -119,9 +114,11 @@ foreach ($Deployment in $Deployments) { 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 @@ -130,9 +127,15 @@ foreach ($Deployment in $Deployments) { $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 " -> FEHER bei Citrix-Abfrage fuer $hostname : $_" "ERROR" - $citrixStatus.RegistrationState = "Error" + Write-Log " -> FEHLER bei Citrix-Abfrage fuer $hostname : $_" "ERROR" + $citrixStatus.RegistrationState = 'Error' } $Results += [PSCustomObject]$citrixStatus @@ -140,21 +143,23 @@ foreach ($Deployment in $Deployments) { # --- CSV schreiben --- if ($Results.Count -gt 0) { - $Results | Export-Csv -Path $CsvFile -NoTypeInformation -Encoding UTF8 -Delimiter ";" + $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 +$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: $registered" -Write-Log " Nicht registriert: $notRegistered" -Write-Log " Fehler: $errors" +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" \ No newline at end of file