# PowerShell Mastery: Effiziente Client-Administration

TL;DR / Management Summary PowerShell ist kein einfacher Befehlszeilen-Interpreter, sondern eine objektorientierte Shell und Scripting-Umgebung. Im Gegensatz zur cmd.exe reicht PowerShell keine Textstrings weiter, sondern echte .NET Objekte. Für Senior Admins ist PowerShell das primäre Werkzeug für die Inventarisierung, Fehlerbehebung und Automatisierung über 500+ Clients hinweg. Wer PowerShell nicht beherrscht, ist im modernen Windows-Enterprise chancenlos.


# 1. Einführung & Konzepte

Objekte statt Text.

In der alten Welt (CMD) mussten wir den Output von dir mühsam mit findstr parsen. In PowerShell nutzen wir Properties.

# Das Prinzip: Verb-Noun

Befehle folgen immer dem gleichen Schema: Get-Service, Stop-Process, Set-Content.

# Die Pipeline (|)

Der wichtigste Operator. Er reicht das Objekt an den nächsten Befehl weiter.

# Beispiel: Finde alle Chrome-Prozesse und beende sie
Get-Process chrome | Stop-Process

# 2. Arbeiten mit Objekten

Filtern und Sortieren.

# Where-Object (?)

Filtern Sie Datenmengen effizient:

# Zeigt alle Dienste an, die auf 'Automatic' stehen, aber nicht laufen
Get-Service | Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" }

# Select-Object

Wählen Sie nur die relevanten Spalten:

# Listet die 10 größten Dateien auf C: auf
Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue | Sort-Object Length -Descending | Select-Object -First 10 Name, @{Name="MB";Expression={$_.Length / 1MB}}

# 3. Deep Dive: Skripting & Sicherheit

Vom Befehl zum Werkzeug.

# Execution Policy

Verhindert das versehentliche Ausführen von Schad-Skripten.

# Empfehlung für Admins: RemoteSigned
Set-ExecutionPolicy RemoteSigned

# Profile

Passen Sie Ihre Shell an. Die Datei $PROFILE wird bei jedem Start geladen.

# Beispiel: Custom Prompt im Profil
function prompt { "🚀 [$(whoami)] $(Get-Location) > " }

# 4. Day-2 Operations: Remote-Verwaltung

Administration vom Sofa aus.

# PowerShell Remoting (WinRM)

Ermöglicht die Ausführung von Befehlen auf Remote-PCs (Artikel 473).

# Führt einen Befehl auf 10 Rechnern gleichzeitig aus
Invoke-Command -ComputerName (Get-Content "C:\PCs.txt") -ScriptBlock { Get-Hotfix -Description "Security Update" }

# 5. Troubleshooting & “War Stories”

Wenn die Shell rot sieht.

# Top 3 Fehlerbilder

  1. Symptom: Skript läuft manuell, aber nicht als Scheduled Task.

    • Ursache: Der Task läuft als SYSTEM oder ohne geladenes User-Profil.
    • Lösung: Nutzen Sie absolute Pfade (z.B. C:\Scripts\log.txt statt .\log.txt).
  2. Symptom: “Die Datei ‘…’ kann nicht geladen werden, da die Ausführung von Skripts deaktiviert ist”.

    • Lösung: powershell -ExecutionPolicy Bypass -File script.ps1.
  3. Symptom: Langsames Get-ChildItem auf Netzwerk-Shares.

    • Lösung: Nutzen Sie -Filter statt Where-Object, um die Filterung am Server (Quelle) durchzuführen.

# “War Story”: Der “Silent” Formatierer

Ein Admin schrieb ein Script, um temporäre Dateien zu löschen. Er nutzte Remove-Item $Path\* -Recurse. Das Problem: Durch einen Tippfehler war $Path leer. PowerShell interpretierte dies als Remove-Item \* -Recurse im aktuellen Arbeitsverzeichnis, was (da er es als Admin im System32-Ordner testete) fast das gesamte Betriebssystem löschte. Lehre: Nutzen Sie bei zerstörerischen Befehlen immer den Parameter -WhatIf zum Testen!


# 6. Monitoring & Reporting

Inventarisierung via Script.

# Der “Health-Report” Einzeiler

Erstellen Sie einen schnellen Bericht über Ihre Clients:

$Report = [PSCustomObject]@{
    ComputerName = $env:COMPUTERNAME
    Uptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
    DiskFree = (Get-Volume C).SizeRemaining / 1GB
    DefenderStatus = (Get-MpComputerStatus).RealTimeProtectionEnabled
}
$Report | Export-Csv "C:\Temp\Health.csv" -NoTypeInformation

# 7. Fazit & Empfehlung

PowerShell ist die wichtigste Sprache für Windows-Admins.


# Anhang: Cheatsheet

Aufgabe Befehl
Befehl suchen Get-Command *network*
Properties sehen `Get-Service
Hilfe anzeigen help Get-Service -ShowWindow
JSON Export `…
Variablen $MyVar = "Value"

# Referenzen