Auf einem verwalteten Firmen-Notebook flackerte regelmässig ein schwarzes Konsolenfenster auf, und das System wurde träge. Windows bietet kein Gesamtbild, denn Taskplaner, Autostart, Dienste, Defender und Eventlog muss man einzeln durchsuchen. Der Artikel beschreibt ein Audit-Skript, das zwölf Bereiche nur lesend erfasst und jedem auffälligen Task Risikogründe zuordnet, sowie ein Bereinigungsskript mit WhatIf, Schutzliste und Restore. Ursache im Ausgangsfall war ein selbst angelegter geplanter Task. Treffer sind Hinweise, keine Malware-Bestätigung.
Inhalt 11 Abschnitte
- Auf einen Blick
- Das Problem: Kein Gesamtbild in Windows
- Aufbau: Audit und Bereinigung getrennt
- Die Heuristik: warum ein Task auffällt
- Die Bereinigung mit Schutzliste und Rückgängig
- Einsatz in sieben Schritten
- Typische Fehler
- Grenzen
- Einordnung: Was das für Admins und Helpdesk-Teams heisst
- Fazit
- Änderungshistorie

Alle 3 Stunden blitzt ein schwarzes Konsolenfenster auf, und das Notebook wird träge. Im Ausgangsfall war die Ursache ein geplanter Task, den jemand selbst angelegt hatte, mit -WindowStyle Hidden. Das Fenster erscheint trotzdem kurz.
Auf einen Blick
- Zwei Skripte statt Handarbeit. Ein Audit sammelt zwölf Bereiche nur lesend, ein zweites deaktiviert auffällige Tasks kontrolliert.
- Das Audit beendet nichts und löscht nichts. Es schreibt je Bereich eine CSV, eine Zusammenfassung und ein Manifest mit SHA256 je Datei.
- Das Bereinigungsskript kennt
-WhatIf, eine Schutzliste und-RestoreFromLog. Jede Änderung steht in einer CSV und lässt sich zurücknehmen. - Treffer sind Hinweise, keine Malware-Bestätigung. Ein
rundll32in einem System-Task ist normal.
Das Problem: Kein Gesamtbild in Windows
Auf einem verwalteten Firmen-Notebook erschien regelmässig ein schwarzes Konsolenfenster, und das System reagierte langsamer. Windows bietet für solche Fälle kein Gesamtbild. Taskplaner, Autostart, Dienste, Defender und Eventlog durchsucht man einzeln, und jedes Fenster zeigt nur einen Ausschnitt.
Im Ausgangsfall endete die Suche bei einem geplanten Task. Er startete alle drei Stunden ein PowerShell-Skript mit -WindowStyle Hidden. Der Parameter versteckt das Fenster, aber nicht vollständig: Es blitzt beim Start kurz auf. Der Task war eine Altlast. Solche Altlasten fallen in keiner Inventarliste auf.
Aufbau: Audit und Bereinigung getrennt
Die Lösung besteht aus zwei Skripten mit klar getrennten Rollen.
| Skript | Aufgabe | Verhalten |
|---|---|---|
Laptop-Audit.ps1 |
Erfasst zwölf Bereiche |
Nur lesend, beendet und löscht nichts |
Disable-SuspiciousTasks.ps1 |
Deaktiviert auffällige Tasks |
Ändert, unterstützt -WhatIf, schützt kritische Tasks |
Das Audit sammelt zwölf Bereiche und legt je eine CSV im Ordner Log\v<Version>_<Zeitstempel>\ ab: geplante Tasks, Taskplaner-Events, Prozesse (zwei Messungen, daraus das CPU-Prozent), TCP-Verbindungen, DNS-Cache, Dienste, Autostarts (Run, RunOnce und Startup-Ordner), installierte Software, mögliche Fernwartungs- und Überwachungstools, WMI-Persistenz, Defender-Status und System-Warnungen. Dazu kommen 00-Summary.md, 00-RunMetadata.json und 00-Manifest.csv. Eine Datei LATEST.txt zeigt auf den letzten Lauf.
Fernwartungssoftware verdient besondere Aufmerksamkeit, denn sie ist ein beliebtes Angriffsziel. Wie schnell das zum Problem wird, zeigt der Artikel N-able N-central: kritische Lücke wird bereits ausgenutzt. Der Abgleich im Audit läuft allerdings nur über Namen, deshalb erscheinen auch legitime Agenten der eigenen IT in der Liste.
Die Heuristik: warum ein Task auffällt
Die Funktion Get-RiskReasons vergibt Gründe nach einfachen Mustern. Sie sucht PowerShell und sogenannte LOLBins (Programme von Windows, die Angreifer missbrauchen), Obfuskation und Download-Aufrufe, Benutzer- und Temp-Pfade sowie versteckte Fenster. Die Liste der LOLBAS-Projekte beschreibt viele dieser Programme.
function Get-RiskReasons { param([string]$Text, [bool]$Hidden) $r = [System.Collections.Generic.List[string]]::new() if ($Text -match '(?i)\bpowershell(\.exe)?\b|\bpwsh(\.exe)?\b') { $r.Add('PowerShell') } if ($Text -match '(?i)\b(cmd|wscript|cscript|mshta|rundll32|regsvr32)(\.exe)?\b') { $r.Add('Script/LOLBin') } if ($Text -match '(?i)-enc(odedcommand)?\b|frombase64string|downloadstring|invoke-webrequest|\biwr\b|\biex\b') { $r.Add('Obfuscation/Download') } if ($Text -match '(?i)\\AppData\\|\\Temp\\|\\Downloads\\|\\Users\\Public\\') { $r.Add('Benutzer-/Temp-Pfad') } if ($Hidden -or $Text -match '(?i)windowstyle\s+hidden') { $r.Add('Verstecktes Fenster') } $r -join '; ' }
Das Ergebnis steht in der Spalte RiskReasons. Wer nur diese Funktion braucht, bekommt mit Get-ScheduledTask und einer Schleife über alle Tasks bereits eine brauchbare Liste. Die Gründe sind Hinweise zum Nachsehen, kein Urteil.
Die Bereinigung mit Schutzliste und Rückgängig
Das zweite Skript liest Kandidaten aus der letzten Audit-CSV oder macht einen Live-Scan. Es kennt drei Modi: Standard (Safe), -IncludeMicrosoftSystem und -DisableAllFlagged -Force. Der Standardmodus erfasst nur Tasks im Wurzelordner mit PowerShell sowie versteckte PowerShell-Tasks aus Benutzerpfaden.
# Kritische Windows-/MDM-Pfade nie anfassen $protected = @( '^\\Microsoft\\Windows\\CertificateServicesClient\\', '^\\Microsoft\\Windows\\Workplace Join\\', '^\\Microsoft\\Windows\\EnterpriseMgmt\\', '^\\Microsoft\\Intune\\', '^\\Microsoft\\Windows\\BitLocker', '^\\Microsoft\\Windows\\WindowsUpdate\\', '^\\Microsoft\\Windows\\UpdateOrchestrator\\' ) if ($RestoreFromLog) { Import-Csv $RestoreFromLog | Where-Object Action -eq 'Disabled' | ForEach-Object { if ($PSCmdlet.ShouldProcess("$($_.TaskPath)$($_.TaskName)", 'Enable')) { Enable-ScheduledTask -TaskPath $_.TaskPath -TaskName $_.TaskName | Out-Null } } return }
Die Schutzliste hält Tasks heraus, ohne die ein verwaltetes Gerät nicht mehr funktioniert: Zertifikatsdienste, Workplace Join, die Geräteverwaltung, Intune, BitLocker und Windows Update. Jede Änderung landet in DisabledTasks.csv. Mit -RestoreFromLog aktiviert das Skript alle Tasks wieder. Der Modus -DisableAllFlagged -Force ist für verwaltete Geräte tabu, denn er kann Enrollment, Zertifikate und Lizenzprüfung brechen.
Einsatz in sieben Schritten
- PowerShell als Administrator öffnen und in den Skriptordner wechseln, etwa
C:\Tools\LaptopAudit. - Das Audit starten:
.\Laptop-Audit.ps1, optional mit-HoursBack 72 -PerformanceSampleSeconds 20. Log\<Lauf>\00-Summary.mdlesen: auffällige und stündliche Tasks, mögliche Überwachungstools, Top-CPU und -RAM.- Die Details in den CSV-Dateien prüfen, vor allem die Spalte
RiskReasons. - Probelauf mit
.\Disable-SuspiciousTasks.ps1 -WhatIf. - Danach ohne
-WhatIfausführen. - Bei Bedarf zurück:
.\Disable-SuspiciousTasks.ps1 -RestoreFromLog ".\Log\DisableTasks\<Lauf>\DisabledTasks.csv".
Die wichtigsten Parameter fasst die Tabelle zusammen.
| Skript | Parameter | Standard | Bedeutung |
|---|---|---|---|
Audit |
-HoursBack |
48 (1 bis 720) |
Zeitraum für Events |
Audit |
-PerformanceSampleSeconds |
10 (1 bis 120) |
Abstand der zwei Prozessmessungen |
Audit |
-OutputPath |
Log\v<Version>_<Zeit> |
Zielordner |
Bereinigung |
-IncludeMicrosoftSystem |
aus |
Auch geflaggte Microsoft-Tasks, ausser der Schutzliste |
Bereinigung |
-RestoreFromLog |
keiner |
Tasks wieder aktivieren |
Typische Fehler
- Ohne Administratorrechte gestartet: Viele Bereiche erscheinen nur als Warnung. Das Bereinigungsskript verlangt Admin zwingend.
- Viele Treffer bei Microsoft-Tasks:
rundll32in System-Tasks ist normal. Nicht jeder Treffer ist ein Fund. takeown /D Jgegen/D Y: Der Parameter hängt von der Systemsprache ab, beide Varianten gehören ins Skript.- Legitime Agenten in der Liste: MDM, Virenschutz und Fernwartung der eigenen IT erscheinen als mögliche Überwachungstools.
Grenzen
TCP-Verbindungen sind eine Momentaufnahme, denn Windows führt keine Verbindungshistorie. Das Audit prüft keine Dateiinhalte und gleicht nicht mit Threat Intelligence ab. Das CPU-Prozent ist eine Näherung aus zwei Messpunkten. Die Zusammenfassung enthält Computername, Benutzer und Pfade und gehört vor dem Teilen bereinigt.
Einordnung: Was das für Admins und Helpdesk-Teams heisst
Für Helpdesk und Admins ersetzt das Audit die halbe Stunde Klicken durch Taskplaner, Autostart und Dienste. Der Gewinn liegt im Nachweis: Manifest, Metadaten und Log zeigen, was gefunden und was geändert wurde. Wichtig ist die Grenze zwischen Hinweis und Befund. Wer nach dem Audit pauschal löscht, riskiert ein Gerät, das sich nicht mehr verwalten lässt. Die Schutzliste und der Rückgängig-Weg sind deshalb der Hauptwert des zweiten Skripts. Auf Geräten mit Intune lohnt sich zuerst die Rücksprache mit dem Team, das die Richtlinien pflegt.
Fazit
Ein Audit mit zwölf Bereichen macht sichtbar, was ein Windows-Notebook im Hintergrund erledigt. Die Bereinigung bleibt sicher, solange eine Schutzliste kritische Tasks ausnimmt und ein Log den Weg zurück zeigt. Lies zuerst die Zusammenfassung, teste mit -WhatIf und entscheide danach, was du deaktivierst.
Quellen: ScheduledTasks-Modul bei Microsoft Learn, LOLBAS-Projekt. Beispiele gekürzt und anonymisiert. Zuletzt geprüft: 24. Oktober 2026.
Geschrieben von Andreas Brauckmann
Änderungshistorie
- — Artikel veröffentlicht: Laptop-Audit für Windows mit Bereinigung per Schutzliste.