Was ist PowerShell?
PowerShell ist die zentrale Befehlszeilen- und Skriptsprache zur Automatisierung der Windows-Administration. Im Gegensatz zur klassischen Eingabeaufforderung (cmd.exe) arbeitet PowerShell nicht mit reinem Text, sondern mit Objekten auf Basis des .NET-Frameworks. Jeder Befehl liefert strukturierte Objekte zurück, die über die Pipeline weiterverarbeitet werden können.
Es gibt zwei parallele Versionen, die sich gegenseitig nicht beeinflussen:
- Windows PowerShell 5.1 – fest in Windows integriert, basiert auf dem klassischen .NET Framework. Bleibt für ältere Module relevant.
- PowerShell 7.x – plattformübergreifend (Windows, Linux, macOS), basiert auf .NET, wird separat installiert und läuft als
pwsh.exeneben der 5.1. Aktuelle LTS-Linie ist 7.4/7.6.
powershell.exe) und PowerShell 7 (pwsh.exe) laufen Side-by-Side. Eine in einer Version gesetzte Execution Policy hat keine Auswirkung auf die andere – beide Engines verwalten ihre Richtlinien getrennt.
Cmdlets – das Verb-Substantiv-Prinzip
Befehle in PowerShell heißen Cmdlets (gesprochen „command-lets"). Sie folgen immer dem Schema Verb-Substantiv, z.B. Get-Process, Stop-Service oder New-Item. Diese strikte Namenskonvention macht Befehle erratbar.
| Verb | Bedeutung | Beispiel-Cmdlet |
|---|---|---|
| Get | Abrufen / Anzeigen | Get-Service, Get-ChildItem |
| Set | Ändern / Konfigurieren | Set-ExecutionPolicy, Set-Location |
| New | Erstellen | New-Item, New-LocalUser |
| Remove | Löschen / Entfernen | Remove-Item, Remove-Service |
| Start / Stop | Starten / Anhalten | Start-Service, Stop-Process |
| Export / Import | Aus-/Einlesen | Export-Csv, Import-Csv |
Hilfe finden: Get-Help & Get-Command
Die zwei wichtigsten Cmdlets für Einsteiger sind Get-Command (Befehle finden) und Get-Help (Befehle verstehen). Kombiniert mit Get-Member erschließt sich jedes Cmdlet selbsterklärend.
# Alle Cmdlets mit einem bestimmten Substantiv finden
Get-Command -Noun Service # Alles rund um Dienste
Get-Command -Verb Get *Net* # Get-Cmdlets, die "Net" enthalten
# Hilfe zu einem Cmdlet (Hilfedateien zuerst aktualisieren)
Update-Help # Hilfe aus dem Internet laden (als Admin)
Get-Help Get-Process -Full # Vollständige Hilfe
Get-Help Get-Process -Examples # Nur Beispiele
Get-Help Get-Process -Online # Im Browser öffnen
# Eigenschaften und Methoden eines Objekts anzeigen
Get-Process | Get-Member # Welche Properties hat ein Prozess-Objekt?Die Pipeline
Das Herzstück von PowerShell ist die Pipeline (|). Sie übergibt die Objekte eines Cmdlets an das nächste – nicht nur Text. Dadurch lassen sich Daten filtern, sortieren und formatieren, ohne sie neu parsen zu müssen.
# Prozesse nach Arbeitsspeicher sortieren, Top 5 anzeigen
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, Id, WS
# Nur laufende Dienste mit Autostart, nach Namen sortiert
Get-Service | Where-Object { $_.Status -eq 'Running' } | Sort-Object DisplayName
# Ergebnis als CSV exportieren
Get-Service | Where-Object Status -eq 'Stopped' | Export-Csv C:\Temp\dienste.csv -NoTypeInformation$_ (bzw. $PSItem) steht in der Pipeline für das jeweils aktuelle Objekt. Where-Object filtert, Select-Object wählt Spalten/Anzahl, Sort-Object sortiert.
Execution Policy
Die Execution Policy ist ein Sicherheitsmechanismus, der steuert, ob und welche Skripte (.ps1) ausgeführt werden dürfen. Sie ist keine echte Sicherheitsgrenze, sondern ein Schutz vor versehentlichem Ausführen. PowerShell 7 (ab 7.4) verwendet unter Windows standardmäßig RemoteSigned.
| Richtlinie | Verhalten |
|---|---|
| Restricted | Keine Skripte erlaubt (Standard bei Windows Client älterer Versionen) |
| RemoteSigned | Lokale Skripte ohne Signatur erlaubt; aus dem Internet nur signiert (Standard auf Servern & PS7) |
| AllSigned | Alle Skripte müssen signiert sein |
| Unrestricted | Alle Skripte erlaubt (nur Warnung bei Internet-Quellen) – nicht empfohlen |
| Bypass | Keine Blockierung, keine Warnung – nur für automatisierte Aufgaben |
# Aktuelle effektive Richtlinie anzeigen
Get-ExecutionPolicy
Get-ExecutionPolicy -List # Richtlinie je Scope (MachinePolicy, UserPolicy, Process, CurrentUser, LocalMachine)
# Richtlinie nur für den aktuellen Benutzer setzen (kein Admin nötig)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserHäufige Admin-Cmdlets
| Aufgabe | Cmdlet |
|---|---|
| Dienste verwalten | Get-Service, Start-Service, Stop-Service, Restart-Service |
| Prozesse verwalten | Get-Process, Stop-Process |
| Ereignisprotokolle | Get-WinEvent, Get-EventLog |
| Dateisystem | Get-ChildItem, Copy-Item, Remove-Item, Test-Path |
| Netzwerk | Test-NetConnection, Get-NetIPAddress, Resolve-DnsName |
| Lokale Konten | Get-LocalUser, New-LocalUser, Add-LocalGroupMember |
| Remoteverwaltung | Enter-PSSession, Invoke-Command, New-PSSession |
| System-Info | Get-ComputerInfo, Get-CimInstance |
Remoting – Befehle auf Remote-Servern
Mit PowerShell Remoting (WS-Management/WinRM) werden Befehle auf entfernten Servern ausgeführt – essenziell bei Server Core ohne GUI.
# WinRM auf dem Zielserver einmalig aktivieren
Enable-PSRemoting -Force
# Interaktive Sitzung auf einem Remote-Server öffnen
Enter-PSSession -ComputerName SRV01 -Credential (Get-Credential)
# Einen Befehl auf mehreren Servern parallel ausführen
Invoke-Command -ComputerName SRV01, SRV02 -ScriptBlock { Get-Service DNS }Vom Befehl zum Skript: Variablen, Schleifen, Bedingungen
Cmdlets entfalten ihre Stärke erst in kleinen Skripten. Das folgende Praxisbeispiel prüft eine Liste von Servern auf Erreichbarkeit und schreibt das Ergebnis in eine CSV – ein typischer Admin-Einzeiler, der zum Skript wächst.
# Liste der zu prüfenden Server
$server = 'SRV01','SRV02','SRV03'
$ergebnis = foreach ($s in $server) {
$online = Test-Connection -ComputerName $s -Count 1 -Quiet
[PSCustomObject]@{
Server = $s
Online = if ($online) { 'Ja' } else { 'Nein' }
Geprüft = Get-Date -Format 'yyyy-MM-dd HH:mm'
}
}
# Ergebnis tabellarisch anzeigen und exportieren
$ergebnis | Format-Table -AutoSize
$ergebnis | Export-Csv C:\Temp\serverstatus.csv -NoTypeInformation -Encoding UTF8
# Nur nicht erreichbare Server hervorheben
$ergebnis | Where-Object Online -eq 'Nein' | ForEach-Object {
Write-Warning "Server $($_.Server) ist NICHT erreichbar!"
}[PSCustomObject]@{...} erzeugt man eigene Objekte mit definierten Spalten – ideal für saubere Reports per Export-Csv oder ConvertTo-Html. Der Doppelpunkt-Trick $($_.Server) wertet Eigenschaften innerhalb von Zeichenketten aus.