Manuell angestoßenes, gate-basiertes Patching von Windows-Servern (2016/2019/2022/2025) über PowerShell-Remoting (WinRM), OnPrem, pro Kunde getrennt.
Source of Truth ist
CLAUDE.md– Grundregeln, Gate-Mechanik, Ablauf. Diese README ist der Quickstart für den Operator.
- Nichts Schreibendes läuft ohne explizite Gate-Freigabe (
jaeintippen). - Kein automatischer Reboot. Reboots werden vorgeschlagen, dann freigegeben.
- Keine Credentials in Code, Inventory oder Logs. Abfrage zur Laufzeit.
- Ein Kunde pro Lauf.
clients/undlogs/sind gitignored.
Operator-Maschine: PowerShell 5.1 oder 7.x, aktive VPN zum Kunden (manuell),
WinRM-Client-Dienst läuft. Optional Microsoft.PowerShell.SecretManagement.
Zielserver: WinRM erreichbar (5985/5986), Operator hat lokale Admin-Rechte,
PSWindowsUpdate-Modul installiert.
Pro Kunde ein Ordner clients/<kunde>/ mit:
config.json– sieheclients/musterkunde/config.json(updateSource, winrmPort, useSSL, maxParallel, minFreeGB, excludeKB)inventory.csv– Spalten:hostname,rolle,reihenfolge,wartungsfenster(niedrigereihenfolgezuerst; DCs hohe Nummer = zuletzt;rolle=DCwird beim Reboot zwingend einzeln behandelt)
Erst VPN manuell aufbauen, dann die Schritte der Reihe nach. Alle Schritte loggen in
denselben Lauf-Ordner logs/<kunde>/<datum_zeit>/ (Schritt 00 eröffnet ihn neu).
cd scripts
.\00_Setup.ps1 -Client musterkunde # read-only: Voraussetzungen
.\01_TestConnectivity.ps1 -Client musterkunde # read-only: WinRM erreichbar?
.\02_Precheck.ps1 -Client musterkunde # read-only -> GATE 1
.\03_ScanUpdates.ps1 -Client musterkunde # read-only: was steht an?
.\04_InstallUpdates.ps1 -Client musterkunde # SCHREIBT -> GATE 2
.\05_Reboot.ps1 -Client musterkunde # SCHREIBT -> GATE 3
.\06_PostCheck.ps1 -Client musterkunde # read-only: Verifikation + Report-UseSecretStore– Credential ausGet-Secret -Name patch-<kunde>stattGet-Credential.-AutoConfirm– Gates automatisch bestätigen. Nur für Tests/Trockenläufe, nie produktiv.05_Reboot.ps1 -RebootTimeoutSec 900– Wartezeit auf WinRM-Rückkehr nach Reboot.
logs/<kunde>/<datum_zeit>/
run.log # zeitgestempeltes Gesamtprotokoll
connectivity.json # 01
precheck.json # 02
updates_<server>.json, scan_summary.json # 03
install_<server>.json, reboot_pending.json # 04
reboot_results.json # 05
postcheck.json, report.html # 06 <- Abschlussbericht
# einmalig pro Kunde
Set-Secret -Name "patch-musterkunde" -Secret (Get-Credential)
# danach Schritte mit -UseSecretStore aufrufenEin fehlerhafter Server killt den Lauf nicht – er wird als FEHLER markiert und im
Report rot ausgewiesen. Kommt ein Server nach Reboot nicht zurück: Warnung, kein
automatischer Zweit-Reboot – manuell prüfen.