# Konfiguration Alle Einstellungen werden in der Datei `config.ini` vorgenommen, die sich im selben Verzeichnis wie das Script befindet. Als Vorlage dient `config.example.ini`. ## Übersicht aller Optionen ### [General] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `LogPath` | String | `C:\logs\windows-updater` | Verzeichnis für Log-Dateien (eine Datei pro Tag) | | `LogRetentionDays` | Integer | `365` | Anzahl Tage, nach denen alte Log-Dateien gelöscht werden | | `DryRun` | Boolean | `false` | Nur prüfen welche Updates verfügbar sind, ohne zu installieren. Kann per `-DryRun` Parameter überschrieben werden | | `UpdateType` | String | `All` | Art der Updates: `All` (alle Updates), `DefenderOnly` (nur Defender-Definitionsupdates). Kann per `-DefenderOnly` Parameter überschrieben werden | ### [WindowsUpdate] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `UseMicrosoftUpdate` | Boolean | `true` | Microsoft Update verwenden (inkl. Office, .NET, Treiber). Bei `false` nur Windows Update | | `ExcludeKBs` | String | *(leer)* | Kommagetrennte Liste von KB-Artikeln die übersprungen werden sollen (z.B. `KB1234567,KB7654321`) | | `ExcludeDrivers` | Boolean | `false` | Treiber-Updates ausschließen | | `RetryCount` | Integer | `3` | Anzahl Wiederholungsversuche für fehlgeschlagene Updates | ### [Winget] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `Enabled` | Boolean | `false` | Winget-Updates aktivieren (`winget upgrade --all`). Wird automatisch übersprungen, wenn winget nicht verfügbar ist | ### [Reboot] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `Enabled` | Boolean | `false` | Automatischen Neustart nach Updates aktivieren | | `Mode` | String | `immediate` | Neustart-Modus: `immediate` (sofort), `delayed` (verzögert), `scheduled` (geplante Uhrzeit) | | `DelayMinutes` | Integer | `5` | Verzögerung in Minuten (nur bei `Mode = delayed`) | | `ScheduledTime` | String | `03:00` | Uhrzeit im Format HH:mm (nur bei `Mode = scheduled`). Liegt die Uhrzeit in der Vergangenheit, wird der nächste Tag verwendet | ### [Notification] #### ntfy | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `NtfyEnabled` | Boolean | `false` | ntfy-Benachrichtigungen aktivieren | | `NtfyUrl` | String | `https://ntfy.sh` | URL des ntfy-Servers | | `NtfyTopic` | String | `windows-updates` | ntfy-Topic-Name | | `NtfyToken` | String | *(leer)* | Zugangs-Token (leer lassen wenn nicht benötigt) | | `NtfyPriority` | String | `default` | Priorität: `min`, `low`, `default`, `high`, `urgent` | #### E-Mail | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `EmailEnabled` | Boolean | `false` | E-Mail-Benachrichtigungen aktivieren | | `SmtpServer` | String | *(leer)* | SMTP-Server Adresse | | `SmtpPort` | Integer | `587` | SMTP-Port | | `SmtpUseSsl` | Boolean | `true` | SSL/TLS für SMTP verwenden | | `SmtpUsername` | String | *(leer)* | SMTP-Benutzername (leer für anonyme Authentifizierung) | | `SmtpPassword` | String | *(leer)* | SMTP-Passwort | | `EmailFrom` | String | *(leer)* | Absender-Adresse | | `EmailTo` | String | *(leer)* | Empfänger-Adresse(n), kommagetrennt | | `EmailHtmlReport` | Boolean | `true` | HTML-formatierten Report mit Update-Tabelle senden | #### Microsoft Teams | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `TeamsEnabled` | Boolean | `false` | Teams-Benachrichtigungen aktivieren | | `TeamsWebhookUrl` | String | *(leer)* | Webhook-URL für den Teams-Kanal | ### [NotificationEvents] Steuert, welche Ereignisse eine Benachrichtigung auslösen. Alle Ereignisse sind standardmäßig aktiviert. Details zu jedem Ereignis: siehe [Benachrichtigungen](notifications.md#benachrichtigungs-ereignisse). | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `NotifyOnModuleError` | Boolean | `true` | PSWindowsUpdate-Modul konnte nicht geladen werden | | `NotifyOnHookFailure` | Boolean | `true` | Pre-Update Hook fehlgeschlagen, Updates abgebrochen | | `NotifyOnNoUpdates` | Boolean | `true` | Keine Updates verfügbar | | `NotifyOnDryRun` | Boolean | `true` | Dry-Run Report mit verfügbaren Updates | | `NotifyOnUpdateComplete` | Boolean | `true` | Zusammenfassung nach Update-Installation | | `NotifyOnReboot` | Boolean | `true` | Neustart wird ausgeführt (immediate/delayed/scheduled) | | `NotifyOnRebootRequired` | Boolean | `true` | Neustart nötig, aber Auto-Reboot ist deaktiviert | | `NotifyOnScanError` | Boolean | `true` | Fehler beim Scannen nach Updates | | `NotifyOnServiceRestartFailure` | Boolean | `true` | Service-Watchdog konnte einen oder mehrere Dienste nicht starten | ### [ServiceWatchdog] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `Enabled` | Boolean | `false` | Service-Watchdog aktivieren: Dienste nach Updates neu starten, wenn kein Reboot erforderlich ist | | `Services` | String | *(leer)* | Kommagetrennte Liste von Windows-Dienstnamen (Service Name, nicht Display Name), z.B. `Spooler,W3SVC,MSSQLSERVER` | | `WaitSeconds` | Integer | `30` | Wartezeit in Sekunden, bis ein Dienst den Status "Running" erreicht hat | | `RetryCount` | Integer | `3` | Anzahl Neustartversuche pro Dienst | ### [Hooks] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `PreUpdateScript` | String | *(leer)* | Pfad zu einem PowerShell-Script, das VOR den Updates ausgeführt wird | | `AbortOnPreHookFailure` | Boolean | `false` | Update-Prozess abbrechen wenn das Pre-Hook-Script fehlschlägt | | `PostUpdateScript` | String | *(leer)* | Pfad zu einem PowerShell-Script, das NACH den Updates ausgeführt wird | ### [History] | Option | Typ | Standard | Beschreibung | |---|---|---|---| | `Enabled` | Boolean | `false` | Update-History-Tracking aktivieren | | `HistoryPath` | String | `C:\logs\windows-updater\update-history` | Basispfad für die History-Datei (Dateiendung wird automatisch gewählt: `.xlsx` wenn ImportExcel verfügbar, sonst `.csv`) | ## Kommandozeilen-Parameter Das Script unterstützt Parameter, die Config-Werte überschreiben. So kann dasselbe Script mit einer Config-Datei für verschiedene Einsatzzwecke verwendet werden. | Parameter | Überschreibt | Beschreibung | |---|---|---| | `-DefenderOnly` | `UpdateType` | Nur Windows Defender Definitionsupdates installieren | | `-DryRun` | `DryRun` | Nur prüfen, nicht installieren | | `-ConfigFile ` | *(Config-Pfad)* | Alternative Konfigurationsdatei verwenden | ### DefenderOnly-Modus im Detail Im DefenderOnly-Modus werden ausschließlich Updates der Kategorie "Definition Updates" (Windows Defender Signaturen) installiert. Folgende Funktionen werden dabei übersprungen: - **Winget-Updates** — nicht relevant für Defender-Signaturen - **Reboot-Handling** — Definitionsupdates erfordern keinen Neustart - **Service Watchdog** — kein Neustart von Diensten nötig - **Treiber-Ausschluss** (`ExcludeDrivers`) — nicht relevant, da nur Definitionsupdates geladen werden Pre-/Post-Update Hooks, Logging, History und Benachrichtigungen funktionieren normal. ## Boolean-Werte Folgende Werte werden als `true` erkannt (Groß-/Kleinschreibung egal): - `true`, `1`, `yes` Alles andere wird als `false` interpretiert. ## Beispiel-Konfigurationen ### Minimal (nur Windows Updates) ```ini [General] LogPath = C:\logs\windows-updater DryRun = false [WindowsUpdate] UseMicrosoftUpdate = true ``` ### Nur Defender-Updates (per Config) ```ini [General] LogPath = C:\logs\windows-updater DryRun = false UpdateType = DefenderOnly [WindowsUpdate] UseMicrosoftUpdate = true ``` ### Dual-Setup: Defender häufig + volle Updates monatlich Eine Config-Datei genügt. Die Unterscheidung erfolgt per Parameter: ```ini [General] LogPath = C:\logs\windows-updater DryRun = false # UpdateType = All (Standard, volle Updates) [WindowsUpdate] UseMicrosoftUpdate = true ExcludeDrivers = true RetryCount = 3 ``` Aufgabenplanung: ```powershell # Alle 4 Stunden: nur Defender-Updates powershell.exe -ExecutionPolicy Bypass -File "C:\scripts\windows-updater\windows-updater.ps1" -DefenderOnly # Einmal im Monat (z.B. erster Sonntag, 03:00): alle Updates powershell.exe -ExecutionPolicy Bypass -File "C:\scripts\windows-updater\windows-updater.ps1" ``` ### Mit E-Mail Benachrichtigung ```ini [General] LogPath = C:\logs\windows-updater DryRun = false [WindowsUpdate] UseMicrosoftUpdate = true ExcludeDrivers = true [Notification] EmailEnabled = true SmtpServer = smtp.example.com SmtpPort = 587 SmtpUseSsl = true SmtpUsername = user@example.com SmtpPassword = geheim123 EmailFrom = updater@example.com EmailTo = admin@example.com EmailHtmlReport = true [Reboot] Enabled = true Mode = delayed DelayMinutes = 10 ``` ### Vollständig mit ntfy und History ```ini [General] LogPath = C:\logs\windows-updater LogRetentionDays = 365 DryRun = false [WindowsUpdate] UseMicrosoftUpdate = true ExcludeKBs = KB1234567,KB7654321 ExcludeDrivers = true RetryCount = 3 [Winget] Enabled = true [Reboot] Enabled = true Mode = scheduled ScheduledTime = 03:00 [Notification] NtfyEnabled = true NtfyUrl = https://ntfy.mein-server.de NtfyTopic = windows-updates NtfyToken = tk_mein_token NtfyPriority = default EmailEnabled = true SmtpServer = smtp.example.com SmtpPort = 587 SmtpUseSsl = true SmtpUsername = user@example.com SmtpPassword = geheim123 EmailFrom = updater@example.com EmailTo = admin@example.com,ops@example.com EmailHtmlReport = true TeamsEnabled = true TeamsWebhookUrl = https://xxxxx.webhook.office.com/webhookb2/... [NotificationEvents] NotifyOnModuleError = true NotifyOnHookFailure = true NotifyOnNoUpdates = false NotifyOnDryRun = true NotifyOnUpdateComplete = true NotifyOnReboot = true NotifyOnRebootRequired = true NotifyOnServiceRestartFailure = true [ServiceWatchdog] Enabled = true Services = Spooler,W3SVC WaitSeconds = 30 RetryCount = 3 [Hooks] PreUpdateScript = C:\scripts\pre-update.ps1 AbortOnPreHookFailure = true PostUpdateScript = C:\scripts\post-update.ps1 [History] Enabled = true HistoryPath = C:\logs\windows-updater\update-history ```