feat: Get-YesterdayCitrixRegistration.ps1 - Task Scheduler Vortag-Aufgaben, Hostname extrahieren, Citrix Registration Check
This commit is contained in:
parent
786ab05ae3
commit
b8dfb51c20
@ -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')
|
||||||
|
CheckTime = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
|
||||||
IsRegistered = $false
|
IsRegistered = $false
|
||||||
IsPoweredOn = $false
|
IsPoweredOn = $false
|
||||||
PowerState = "Unknown"
|
PowerState = 'Unknown'
|
||||||
RegistrationState = "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,7 +143,7 @@ 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"
|
||||||
@ -148,12 +151,14 @@ if ($Results.Count -gt 0) {
|
|||||||
|
|
||||||
# --- 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 " Registriert + Aus: $($registered - $poweredOn)"
|
||||||
Write-Log " Nicht registriert: $notRegistered"
|
Write-Log " Nicht registriert: $notRegistered"
|
||||||
Write-Log " Fehler: $errors"
|
Write-Log " Fehler: $errors"
|
||||||
Write-Log "Log-Datei: $LogFile"
|
Write-Log "Log-Datei: $LogFile"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user