feat: Get-YesterdayCitrixRegistration.ps1 - Task Scheduler Vortag-Aufgaben, Hostname extrahieren, Citrix Registration Check

This commit is contained in:
buiaca 2026-07-29 23:42:50 +02:00
parent 786ab05ae3
commit b8dfb51c20

View File

@ -1,24 +1,26 @@
<# <#
.SYNOPSIS .SYNOPSIS
Liest SCCM-App-Deployments vom Vortag aus, extrahiert Hostnames aus den Namen Liest Windows Task Scheduler Aufgaben vom Vortag aus.
und prüft in Citrix, ob die jeweiligen VDAs registriert (eingeschaltet + registriert) sind. Aus dem Aufgaben-Namen (Format: HOSTNAME_User) wird der Hostname extrahiert
Ergebnisse werden in ein Log geschrieben. und in Citrix geprueft, ob die Maschine Registered ist (eingeschaltet + registriert).
Ergebnisse werden in ein CSV-Log geschrieben.
.DESCRIPTION .DESCRIPTION
1. Holt alle App-Deployments vom Vortag (oder seit dem letzten Lauf). 1. Holt alle Task Scheduler Aufgaben vom Vortag (Execution Time).
2. Extrahiert den Hostnamen aus dem Deployment-Namen (erste Bestandteile vor Bindestrich/Trennzeichen). 2. Extrahiert den Hostnamen aus dem Aufgaben-Namen (erster Teil vor '_').
3. Queryt Citrix Broker, ob die Maschine registered ist. 3. Queryt Citrix Broker, ob die Maschine Registered und PowerState On ist.
4. Schreibt Ergebnisse in ein CSV-Log unter \\server\share\Logs\ oder lokal. 4. Schreibt Ergebnisse in ein CSV-Log und ein Text-Log.
.EXAMPLE
.\Get-YesterdayCitrixRegistration.ps1
.NOTES .NOTES
Datei: Get-YesterdayCitrixRegistration.ps1 Datei: Get-YesterdayCitrixRegistration.ps1
Autor: alin Autor: alin
Umgebung: SCCM + Citrix VDA; Citrix Broker PowerShell SDK vorausgesetzt. Umgebung: Windows mit Task Scheduler + Citrix VDA
Ort: Hermes/ (gemäss Gitea-Konvention) Ort: Hermes/ (gemäss Gitea-Konvention)
#> #>
[CmdletBinding()] [CmdletBinding()]
param( param(
[string]$LogPath = "C:\Logs\CitrixRegistration", [string]$LogPath = "C:\Logs\CitrixRegistration",
[string]$SCCMServer = "sccm-server",
[string]$CitrixSiteServer = "citrix-site-server", [string]$CitrixSiteServer = "citrix-site-server",
[int]$DaysBack = 1 [int]$DaysBack = 1
) )
@ -35,15 +37,7 @@ function Write-Log {
Add-Content -Path $LogFile -Value $entry -Encoding UTF8 Add-Content -Path $LogFile -Value $entry -Encoding UTF8
} }
# --- Pfade + SCCM-Modul laden --- # --- Citrix Broker 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 { try {
Import-Module Citrix.Broker.Admin.V2 -ErrorAction Stop Import-Module Citrix.Broker.Admin.V2 -ErrorAction Stop
Write-Log "Citrix Broker-Modul geladen." Write-Log "Citrix Broker-Modul geladen."
@ -52,66 +46,67 @@ try {
exit 1 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 --- # --- Vortag berechnen ---
$Yesterday = (Get-Date).AddDays(-$DaysBack).Date $Yesterday = (Get-Date).AddDays(-$DaysBack).Date
$Tomorrow = $Yesterday.AddDays(1) $Tomorrow = $Yesterday.AddDays(1)
Write-Log "Pruefe Deployments vom $Yesterday" Write-Log "Pruefe Aufgaben vom Vortag ($Yesterday)"
# --- SCCM App-Deployments vom Vortag holen --- # --- Task Scheduler Aufgaben vom Vortag holen ---
$Deployments = Get-CMApplicationDeployment | # Alle Aufgaben abfragen und nach letzter Ausfuehrung filtern
Where-Object { $_.CollectionName -and $_.LastModificationTime -ge $Yesterday -and $_.LastModificationTime -lt $Tomorrow } | $AllTasks = Get-ScheduledTask | Where-Object { $_.State -ne 'Disabled' }
Select-Object -Unique -Property Name, CollectionName, LastModificationTime $YesterdayTasks = @()
if (-not $Deployments -or @($Deployments).Count -eq 0) { foreach ($Task in $AllTasks) {
Write-Log "Keine neuen Deployments vom $Yesterday gefunden." "WARNING" try {
# Auch ohne Deployments beenden und Log schreiben $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 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 = @() $Results = @()
foreach ($Deployment in $Deployments) { foreach ($Task in $YesterdayTasks) {
$deploymentName = $Deployment.Name $taskName = $Task.TaskName
# Hostname-Extraktion: typischer Format "HOSTNAME - Beschreibung" oder "HOSTNAME_Beschreibung" # Hostname-Extraktion: Format "HOSTNAME_User" -> erster Teil vor dem ersten '_'
# Verschiedene Trennzeichen durchprobieren $hostname = ($taskName -split '_')[0]
$hostname = $null
if ($deploymentName -match '^([A-Za-z0-9_-]+)[\s_\-]\s*') { if (-not $hostname -or $hostname -eq $taskName) {
$hostname = $Matches[1] Write-Log "Konnte keinen Hostnamen aus Aufgaben-Namen '$taskName' extrahieren." "WARN"
}
elseif ($deploymentName -match '^([A-Za-z0-9_-]+)$') {
$hostname = $deploymentName
}
if (-not $hostname) {
Write-Log "Konnte keinen Hostnamen aus Deployment-Namen '$deploymentName' extrahieren." "WARN"
continue continue
} }
Write-Log "Pruefe Maschine: $hostname (Deployment: $deploymentName)" Write-Log "Pruefe Maschine: $hostname (Aufgabe: $taskName)"
# --- Citrix Registrierungsstatus pruefen --- # --- Citrix Registrierungsstatus pruefen ---
$citrixStatus = @{ $citrixStatus = @{
MachineName = $hostname TaskName = $taskName
DeploymentName = $deploymentName Hostname = $hostname
CheckTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" LastRun = $Task.LastRun.ToString('yyyy-MM-dd HH:mm:ss')
IsRegistered = $false CheckTime = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
IsPoweredOn = $false IsRegistered = $false
PowerState = "Unknown" IsPoweredOn = $false
RegistrationState = "Unknown" PowerState = 'Unknown'
RegistrationState = 'Unknown'
SessionState = 'Unknown'
} }
try { try {
@ -119,9 +114,11 @@ foreach ($Deployment in $Deployments) {
if ($brokerMachine) { if ($brokerMachine) {
$citrixStatus.IsRegistered = $true $citrixStatus.IsRegistered = $true
$citrixStatus.RegistrationState = 'Registered'
Write-Log " -> REGISTRIERT: Ja" Write-Log " -> REGISTRIERT: Ja"
} else { } else {
Write-Log " -> REGISTRIERT: Nein (Maschine nicht in Citrix gefunden)" "WARN" Write-Log " -> REGISTRIERT: Nein (Maschine nicht in Citrix gefunden)" "WARN"
$citrixStatus.RegistrationState = 'NotRegistered'
} }
# PowerState pruefen # PowerState pruefen
@ -130,9 +127,15 @@ foreach ($Deployment in $Deployments) {
$citrixStatus.IsPoweredOn = ($powerState -eq 'On') $citrixStatus.IsPoweredOn = ($powerState -eq 'On')
Write-Log " -> PowerState: $powerState" Write-Log " -> PowerState: $powerState"
# SessionState pruefen (zusaetzliche Info)
if ($brokerMachine.SessionState) {
$citrixStatus.SessionState = $brokerMachine.SessionState
Write-Log " -> SessionState: $($brokerMachine.SessionState)"
}
} catch { } catch {
Write-Log " -> FEHER bei Citrix-Abfrage fuer $hostname : $_" "ERROR" Write-Log " -> FEHLER bei Citrix-Abfrage fuer $hostname : $_" "ERROR"
$citrixStatus.RegistrationState = "Error" $citrixStatus.RegistrationState = 'Error'
} }
$Results += [PSCustomObject]$citrixStatus $Results += [PSCustomObject]$citrixStatus
@ -140,21 +143,23 @@ foreach ($Deployment in $Deployments) {
# --- CSV schreiben --- # --- CSV schreiben ---
if ($Results.Count -gt 0) { 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)" Write-Log "CSV-Log geschrieben: $CsvFile ($($Results.Count) Eintraege)"
} else { } else {
Write-Log "Keine Ergebnisse zum Schreiben." "WARNING" Write-Log "Keine Ergebnisse zum Schreiben." "WARNING"
} }
# --- Zusammenfassung --- # --- Zusammenfassung ---
$registered = ($Results | Where-Object { $_.IsRegistered -eq $true }).Count $registered = ($Results | Where-Object { $_.IsRegistered -eq $true }).Count
$notRegistered = ($Results | Where-Object { $_.IsRegistered -eq $false -and $_.RegistrationState -ne "Error" }).Count $notRegistered = ($Results | Where-Object { $_.IsRegistered -eq $false -and $_.RegistrationState -ne 'Error' }).Count
$errors = ($Results | Where-Object { $_.RegistrationState -eq "Error" }).Count $errors = ($Results | Where-Object { $_.RegistrationState -eq 'Error' }).Count
$poweredOn = ($Results | Where-Object { $_.IsPoweredOn -eq $true }).Count
Write-Log "=== ZUSAMMENFASSUNG ===" Write-Log "=== ZUSAMMENFASSUNG ==="
Write-Log " Gesamt geprueft: $(@($Results).Count)" Write-Log " Gesamt geprueft: $(@($Results).Count)"
Write-Log " Registriert: $registered" Write-Log " Registriert + PoweredOn: $poweredOn"
Write-Log " Nicht registriert: $notRegistered" Write-Log " Registriert + Aus: $($registered - $poweredOn)"
Write-Log " Fehler: $errors" Write-Log " Nicht registriert: $notRegistered"
Write-Log " Fehler: $errors"
Write-Log "Log-Datei: $LogFile" Write-Log "Log-Datei: $LogFile"
Write-Log "CSV-Datei: $CsvFile" Write-Log "CSV-Datei: $CsvFile"