# Batch & VBScript: Überleben und Migration von Legacy-Code
TL;DR / Management Summary Trotz der Dominanz von PowerShell begegnen uns in Enterprise-Umgebungen ständig Batch-Dateien (
.bat/.cmd) und VBScripts (.vbs). Sie sind oft Teil von uralten Login-Skripten oder Hersteller-Installationspaketen. Ein Senior Admin beherrscht die Grundlagen, um diese Altlasten zu debuggen, härtet sie gegen Injektionen und führt sie methodisch in moderne PowerShell-Workflows über.
# 1. Einführung & Relevanz
Warum sind sie noch da?
- Batch: Schnell, einfach, kein Overhead. Perfekt für simple Datei-Operationen beim Booten.
- VBScript (WSH): Bietet COM-Objekt-Unterstützung (ActiveX). Wurde früher für komplexe AD-Abfragen und Excel-Automatisierung genutzt.
# Der ‘Killer’-Nachteil
Beide Sprachen haben keine native Unterstützung für JSON, REST-APIs oder moderne Error-Handling-Mechanismen (Try-Catch).
# 2. Batch Scripting für Admins
Die Kunst der cmd.exe.
# Häufigste Nutzung: Logon-Scripts
@echo off
:: Netzlaufwerk verbinden, falls nicht vorhanden
if not exist P: net use P: \\server\projekte /persistent:no
:: Zeit-Sync
net time \\DC01 /set /yes
# Stolperstein: Fehlercodes
Batch kennt nur den %ERRORLEVEL%.
robocopy C:\Source D:\Dest
if %ERRORLEVEL% GEQ 8 echo "Schwerwiegender Fehler!"
# 3. VBScript: Die COM-Welt
Windows Script Host (WSH).
VBScript war der Vorläufer von PowerShell für administrative Aufgaben.
# Beispiel: User-Info auslesen
Set objNetwork = CreateObject("WScript.Network")
WScript.Echo "User: " & objNetwork.UserName
WScript.Echo "Domain: " & objNetwork.UserDomain
# 4. Deep Dive: Sicherheit & Hardening
Das Risiko alter Shells.
Legacy-Skripte sind oft Einfallstore für Angreifer, da sie keine Signatur-Pflicht (wie PowerShell Execution Policy) haben.
# 1. Deaktivierung des WSH
In Hochsicherheitsumgebungen sollten Sie den Windows Script Host komplett deaktivieren, um .vbs Malware (z.B. Emotet-Downloader) zu stoppen.
- GPO:
Benutzerkonfiguration -> Administrative Vorlagen -> Windows-Komponenten -> Windows Script Host -> Zugriff deaktivieren.
# 2. Migration als Härtung
Ersetzen Sie Batch-Loops durch PowerShell Foreach-Schleifen. PowerShell validiert Typen und verhindert viele klassische Logik-Fehler.
# 5. Troubleshooting & “War Stories”
Wenn die alte Welt brennt.
# Top 3 Fehlerbilder
-
Symptom: Batch-Skript bricht bei Sonderzeichen im Pfad ab.
- Ursache: Fehlendes Quoting oder falsches Encoding (ANSI vs. UTF-8).
- Lösung: Pfade immer in
"..."setzen und Skript als ANSI speichern (Legacy CMD Support).
-
Symptom: VBScript meldet “Objekt konnte nicht erstellt werden”.
- Ursache: Fehlende 32-Bit/64-Bit Kompatibilität der COM-Komponente.
- Lösung: Skript mit
C:\Windows\SysWOW64\cscript.exe(32-Bit) starten.
-
Symptom: Skript läuft lokal, aber nicht via GPO.
- Ursache: Relative Pfade oder fehlende Berechtigungen auf
netlogon.
- Ursache: Relative Pfade oder fehlende Berechtigungen auf
# “War Story”: Die endlose Drucker-Schleife
Ein altes VBScript-Login-Skript sollte Drucker mappen. Durch eine Änderung in Windows 10 (Treiber-Signierung) fragte der Treiber beim Mappen nach Admin-Rechten. Das Ergebnis: Bei jedem Login poppten 10 UAC-Fenster auf. Die User klickten sie weg, das Skript startete von vorn. 2000 User riefen gleichzeitig beim Helpdesk an. Lösung: Wir ersetzten das 500-Zeilen VBScript durch eine einzige GPO-Präferenz (Artikel 425). Lehre: Nutzen Sie jede Chance, Legacy-Skripte durch native Betriebssystem-Funktionen zu ersetzen.
# 6. Monitoring & Audit
Was treiben die Skripte?
Aktivieren Sie das Process Command Line Logging (Event ID 4688), um zu sehen, mit welchen Parametern cmd.exe oder cscript.exe aufgerufen werden. So finden Sie versteckte Schad-Skripte.
# 7. Fazit & Empfehlung
Batch und VBScript sind im Wartungsmodus.
- Empfehlung: Schreiben Sie keine neuen Skripte in Batch oder VBScript. Nutzen Sie ausschließlich PowerShell.
- Wahl: Nutzen Sie Batch nur noch für extrem einfache
.cmdWrapper, um eine Umgebungsvariable zu setzen und dann PowerShell zu starten.
# Anhang: Cheatsheet (Migration)
| Aufgabe | Batch (Alt) | PowerShell (Neu) |
|---|---|---|
| Datei kopieren | copy src dest |
Copy-Item src dest |
| Verzeichnis erstellen | md folder |
New-Item -Type Directory folder |
| Dienst stoppen | net stop service |
Stop-Service service |
| String Suche | findstr "text" file |
Select-String "text" file |
| Variable setzen | set VAR=VAL |
$VAR = "VAL" |