PowerShell-Grundlagen für Windows-Admins
PowerShell-Grundlagen für Windows-Admins: Cmdlet-Prinzip, Pipeline mit Objekten, Discovery, Execution Policy, erstes Skript, Module und Fehlerbehandlung auf Windows Server 2022/2025.
Geprüft am 30.09.2026 · für PowerShell 7.6.6

Diese Anleitung vermittelt die PowerShell-Grundlagen für Windows-Admins zur Verwaltung von Windows Server 2022/2025: das Cmdlet-Prinzip Verb-Nomen, die objektbasierte Pipeline, Discovery über Get-Help und Get-Command, die Execution Policy, ein erstes Skript mit Parametern, Module aus der PowerShell Gallery und Fehlerbehandlung mit try/catch. Darauf bauen die Anleitungen zu Active Directory, Hyper-V und DHCP auf.
Voraussetzungen
- Windows Server 2022 oder 2025 (On-Premises) mit administrativem Konto. Windows PowerShell 5.1 ist ab Server 2016 bzw. Windows 10/11 bereits vorinstalliert.
- Eine als Administrator gestartete Konsole für systemweite Einstellungen (z. B.
Set-ExecutionPolicy -Scope LocalMachineoderUpdate-Help). - Optional Internetzugang für PowerShell 7, Hilfeinhalte (
Update-Help) und Module aus der PSGallery (benötigt TLS 1.2 oder höher). - Für die weiterführenden Themen die passenden Rollen/Features bzw. RSAT-Tools (AD, Hyper-V, DHCP).
Schritt 1: Version prüfen und PowerShell 7 installieren
Klären Sie zuerst, womit Sie arbeiten. Windows PowerShell 5.1 (powershell.exe) basiert auf dem .NET Framework und erhält nur noch Sicherheitsfixes. PowerShell 7 (pwsh.exe) basiert auf aktuellem .NET und läuft parallel zu 5.1. Prüfen Sie die Version in beiden Konsolen:
# Version pruefen (zeigt PSVersion: 5.1 in powershell.exe, 7.x in pwsh.exe)
$PSVersionTable
GUI-Weg: Tippen Sie ins Startmenü PowerShell. Der Eintrag Windows PowerShell ist 5.1; nach der Installation erscheint zusätzlich PowerShell 7. Per Rechtsklick auf Als Administrator ausführen öffnen Sie eine erhöhte Sitzung (Titelleiste zeigt Administrator).
PowerShell-Weg: Auf Server 2025 mit Desktop Experience nutzen Sie winget, sonst das MSI. winget ist auf Server 2022 (und älter) sowie Server Core nicht verfügbar, dort verwenden Sie MSI oder ZIP.
# PowerShell 7 installieren auf Windows Server 2025 (winget nur mit Desktop Experience)
winget search --id Microsoft.PowerShell --exact
winget install --id Microsoft.PowerShell --source winget # MSIX (ab 7.6 Default)
winget install --id Microsoft.PowerShell --source winget --installer-type wix # klassisches MSI
# PowerShell 7 still via MSI (empfohlen fuer Server/Enterprise, Beispiel mit allen Optionen)
msiexec.exe /package PowerShell-7.6.6-win-x64.msi /quiet ADD_PATH=1 ENABLE_PSREMOTING=1 USE_MU=1 ENABLE_MU=1
PowerShell 7 landet unter $Env:ProgramFiles\PowerShell\7. Aktuell (September 2026) ist 7.6.6 die LTS-Version, 7.5.11 die letzte stabile Version der Vorgängerlinie. 5.1 und 7 haben getrennte Modulpfade und Profile: Ein in 5.1 installiertes Modul ist in 7 nicht automatisch sichtbar.
Verifizieren: pwsh -Command '$PSVersionTable.PSVersion' gibt 7.6.x aus, powershell.exe weiterhin 5.1.
Schritt 2: Das Cmdlet-Prinzip Verb-Nomen verstehen
Jeder PowerShell-Befehl (Cmdlet) folgt dem Schema Verb-Nomen, etwa Get-Service (lesen), Set-ExecutionPolicy (setzen), New-Item (anlegen) oder Stop-Process (stoppen). Cmdlets sind nicht case-sensitive, get-service funktioniert also genauso.
# Zugelassene Verben anzeigen (Microsoft empfiehlt nur diese fuer eigene Funktionen)
Get-Verb
Verwenden Sie die freigegebene Verbenliste (Get, Set, New, Remove, Start, Stop, ...) auch in eigenen Skripten. Das hält den Code konsistent und auffindbar.
Verifizieren: Get-Verb | Measure-Object liefert eine Anzahl von über 90 zugelassenen Verben, get-service in Kleinschreibung listet die Dienste.
Schritt 3: Befehle selbst finden mit Get-Command, Get-Help und Get-Member
Auswendiglernen ist nicht nötig. Drei Discovery-Cmdlets reichen: Get-Command findet Befehle, Get-Help erklärt sie, Get-Member zeigt die Eigenschaften und Methoden eines Objekts.
# Discovery / Hilfe
Get-Command -Verb Get -Noun Service # Befehle finden
Get-Help Get-Service -Examples # Beispiele anzeigen
Get-Help Get-Service -Online # Online-Doku im Browser
Update-Help -Scope AllUsers # Hilfeinhalte laden (als Admin)
Get-Service | Get-Member # Eigenschaften/Methoden eines Objekts
Wichtig: Ohne vorheriges Update-Help liefert Get-Help nur eine knappe Stub-Hilfe. Update-Help -Scope AllUsers braucht Adminrechte und ist bei MSIX-Installationen von PowerShell 7 nicht möglich; nutzen Sie in dem Fall -Online. Mit Get-Member ermitteln Sie die echten Eigenschaftsnamen eines Objekts, darauf kommt es im nächsten Schritt an.
Verifizieren: Get-Help Get-Service -Examples zeigt nach Update-Help nummerierte Beispiele, Get-Service | Get-Member listet unter anderem die Eigenschaft Status.
Schritt 4: Die Pipeline arbeitet mit Objekten, nicht mit Text
Der zentrale Unterschied zu cmd oder Bash: Die PowerShell-Pipeline reicht echte .NET-Objekte von einem Cmdlet zum nächsten weiter, nicht formatierten Text. Erst die Anzeige am Ende formatiert die Objekte zu lesbaren Spalten. Deshalb filtern und sortieren Sie nach echten Eigenschaften, nicht nach Textpositionen.
Die wichtigsten Pipeline-Cmdlets sind Where-Object (filtern), Select-Object (Eigenschaften oder die ersten N wählen), Sort-Object (sortieren) und ForEach-Object (pro Objekt eine Aktion). Dazu kommen Measure-Object und Group-Object.
# Pipeline mit Objekten: Dienste filtern, Eigenschaften waehlen, sortieren
Get-Service | Where-Object { $_.Status -eq 'Running' } |
Sort-Object DisplayName |
Select-Object -First 10 Name, DisplayName, Status
# ForEach-Object: pro Objekt eine Aktion
Get-Process | Where-Object CPU -gt 100 | ForEach-Object { "$($_.Name): $($_.CPU)" }
In den Skriptblöcken steht $_ für das aktuell durchlaufende Objekt. Welche Eigenschaften ein Objekt hat, verrät Get-Member; verlassen Sie sich nicht auf die Spalten der Bildschirmausgabe.
Verifizieren: Das Beispiel mit Where-Object { $_.Status -eq 'Running' } gibt höchstens zehn Dienste aus, alle mit Status Running, alphabetisch nach DisplayName sortiert.
Schritt 5: Variablen, Arrays und Hashtables
Variablen beginnen mit $. Datentypen erzwingen Sie, indem Sie den Typ in eckigen Klammern voranstellen. Eine Sammlung legen Sie als Array an, Schlüssel-Wert-Paare als Hashtable. Achten Sie auf die Anführungszeichen: doppelte interpolieren Variablen, einfache nehmen den Inhalt wörtlich.
# Variablen, Array, Hashtable
[int]$port = 443
$server = 'SRV01'
$liste = @('SRV01','SRV02','SRV03')
$config = @{ Name = $server; Port = $port; Aktiv = $true }
"Server $($config.Name) auf Port $($config.Port)"
Array-Elemente lesen Sie per Index ($liste[0]), Hashtable-Werte per Schlüssel ($config.Name). Für Ausdrücke innerhalb von Strings nutzen Sie die Subexpression $(...), weil "$config.Name" sonst nur $config auflöst und .Name als Text anhängt.
Verifizieren: Die letzte Zeile des Beispiels gibt Server SRV01 auf Port 443 aus.
Schritt 6: Execution Policy richtig setzen
Die Execution Policy regelt, welche .ps1-Skripte laufen dürfen. Sie ist eine Schutzvorkehrung gegen versehentliches Ausführen, keine Sicherheitsgrenze. Der empfohlene Wert ist RemoteSigned: lokal erstellte Skripte laufen, aus dem Internet geladene .ps1 brauchen eine gültige Signatur oder müssen per Unblock-File freigegeben werden. RemoteSigned ist auf Windows-Clients und -Servern bereits der Standard.
# Execution Policy anzeigen und (typisch) auf RemoteSigned setzen
Get-ExecutionPolicy -List
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser # ohne Adminrechte
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine # als Admin, alle Nutzer
# Heruntergeladenes Skript entsperren (Mark-of-the-Web entfernen)
Unblock-File -Path .\MeinSkript.ps1
Vorrang der Scopes (höchster zuerst): MachinePolicy, UserPolicy, Process, CurrentUser, LocalMachine. GUI/GPO-Weg: Eine Gruppenrichtlinie unter Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell\Turn on Script Execution überschreibt jede lokale Set-ExecutionPolicy. Prüfen Sie das, wenn Ihre Einstellung nicht greift.
Verifizieren: Get-ExecutionPolicy gibt RemoteSigned aus, und ein lokal erstelltes Skript startet ohne Fehlermeldung.
Schritt 7: Ihr erstes Skript mit Parametern
Mit dem param()-Block am Anfang machen Sie es wiederverwendbar und übergeben Werte beim Aufruf. [Parameter(Mandatory)] erzwingt eine Eingabe, optionale Parameter bekommen einen Standardwert.
# Erstes Skript mit Parametern (Datei z.B. Get-DiskFree.ps1)
param(
[Parameter(Mandatory)][string]$ComputerName,
[int]$MinFreeGB = 10
)
Get-CimInstance -ClassName Win32_LogicalDisk -ComputerName $ComputerName |
Where-Object { ($_.FreeSpace/1GB) -lt $MinFreeGB } |
Select-Object DeviceID, @{N='FreeGB';E={[math]::Round($_.FreeSpace/1GB,1)}}
# Aufruf: .\Get-DiskFree.ps1 -ComputerName SRV01 -MinFreeGB 20
Der Ausdruck @{N='FreeGB';E={...}} ist eine berechnete Eigenschaft (Name/Expression), mit der Sie eigene Spalten erzeugen. Speichern Sie die Datei, wechseln Sie in der Konsole in den Ordner und rufen Sie das Skript mit vorangestelltem .\ auf.
Verifizieren: .\Get-DiskFree.ps1 -ComputerName localhost -MinFreeGB 100000 listet alle lokalen Laufwerke mit Spalte FreeGB; ohne -ComputerName fragt das Skript den Wert ab.
Schritt 8: Module nachladen aus der PSGallery
Funktionalität kommt über Module. Viele liefert Microsoft als Rolle/RSAT mit, weitere holen Sie aus der PowerShell Gallery (PSGallery), dem offiziellen Repository. Install-Module installiert systemweit nach $env:ProgramFiles\WindowsPowerShell\Modules (Adminrechte) oder mit -Scope CurrentUser in Ihr Benutzerprofil.
# Module / PSGallery
Find-Module -Name PSWindowsUpdate -Repository PSGallery
Install-Module -Name PSWindowsUpdate -Scope CurrentUser # fragt ggf. wegen Untrusted
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted # PSGallery dauerhaft vertrauen
Get-InstalledModule ; Update-Module -Name PSWindowsUpdate
# Modern (PSResourceGet 3.x)
Find-PSResource -Name Az -Repository PSGallery
Install-PSResource -Name Az -Scope CurrentUser -TrustRepository
Die PSGallery ist standardmäßig als Untrusted registriert, deshalb fragt Install-Module nach. Pakete stammen von der Community und werden von Microsoft nicht geprüft; prüfen Sie unbekannte Module vorher mit Save-Module. Außerdem braucht der Zugriff TLS 1.2. Der moderne Nachfolger von PowerShellGet 2.x ist Microsoft.PowerShell.PSResourceGet mit Find-PSResource/Install-PSResource.
Verifizieren: Get-InstalledModule PSWindowsUpdate zeigt Name und Version des Moduls.
Schritt 9: Fehlerbehandlung mit try/catch/finally
try/catch/finally fängt nur terminierende Fehler. Viele Cmdlets erzeugen nicht-terminierende Fehler - die laufen am catch vorbei, solange Sie nicht -ErrorAction Stop setzen (oder global $ErrorActionPreference='Stop').
# Fehlerbehandlung try/catch/finally (mit -ErrorAction Stop, damit catch greift)
try {
Get-Content 'C:\fehlt.txt' -ErrorAction Stop
}
catch [System.IO.FileNotFoundException] {
Write-Warning "Datei nicht gefunden: $($_.Exception.Message)"
}
catch {
Write-Error "Allgemeiner Fehler: $($_.Exception.Message)"
}
finally {
Write-Host 'Aufraeumen erledigt.'
}
Im catch-Block steht der Fehler in $_ bzw. $Error[0]. Über catch [System.IO.FileNotFoundException] fangen Sie typspezifisch, ein allgemeines catch am Ende deckt den Rest ab. Der finally-Block läuft immer und eignet sich zum Aufräumen.
Verifizieren: Das Beispiel gibt eine Warnung „Datei nicht gefunden“ aus und danach „Aufräumen erledigt.“.
Schritt 10: Admin-Module als Brücke zu den vertiefenden Themen
Die Grundlagen aus den Schritten 1 bis 9 wenden Sie direkt auf die Server-Rollen an. Die Admin-Module installieren Sie als Windows-Feature/RSAT und laden sie dann mit Import-Module.
# Admin-Module (Bezug zu weiterfuehrenden Anleitungen)
Install-WindowsFeature -Name RSAT-AD-PowerShell # AD-Cmdlets auf Server
Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0' # auf Win10/11
Import-Module ActiveDirectory ; Get-ADUser -Filter *
Import-Module Hyper-V ; Get-VM
Import-Module DhcpServer ; Get-DhcpServerv4Scope
AD-Cmdlets (Get-ADUser, New-ADUser), Hyper-V (Get-VM, New-VM, Start-VM) und DHCP (Get-DhcpServerv4Scope, Add-DhcpServerv4Scope) laufen unter PowerShell 5.1 nativ. Unter PowerShell 7 nutzen Sie bei einigen Windows-spezifischen Modulen die Kompatibilitätsschicht: Import-Module ActiveDirectory -UseWindowsPowerShell. Die konkreten Abläufe stehen in den verlinkten Anleitungen am Ende.
Verifizieren: Get-Module -ListAvailable ActiveDirectory,Hyper-V,DhcpServer listet die installierten Module.
Troubleshooting
- Skript startet nicht:
Get-ExecutionPolicy -Listprüfen. Sind alle ScopesUndefined, gilt auf ClientsRestricted, auf ServernRemoteSigned.RemoteSignedim passenden Scope setzen. - Set-ExecutionPolicy mit Zugriffsfehler:
-Scope LocalMachinebraucht eine Administrator-Konsole,-Scope CurrentUsernicht. - Policy greift nicht: Die GPO Turn on Script Execution überschreibt lokale Einstellungen, sichtbar in den Scopes MachinePolicy/UserPolicy.
- Install-Module schlägt fehl: Die PSGallery ist Untrusted (bestätigen oder
-Force) und braucht TLS 1.2. In älteren Sessions hilft[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12. - Modul aus 5.1 fehlt in PowerShell 7: Beide nutzen getrennte Modulpfade. Installieren Sie das Modul in 7 erneut oder laden Sie es per
Import-Module -UseWindowsPowerShell. - winget nicht gefunden: Auf Server 2022 und Server Core fehlt
winget; MSI oder ZIP nutzen.
Häufige Fragen
Brauche ich PowerShell 7, oder reicht 5.1?
Für die meisten Admin-Aufgaben reicht 5.1. PowerShell 7 bringt neue Sprachfeatures, läuft parallel und nutzt für einige Windows-Module die Kompatibilitätsschicht.
Warum filtert PowerShell nicht wie grep auf Text?
Weil die Pipeline Objekte weiterreicht, filtern Sie nach Eigenschaften (Schritt 4).
Welche Execution Policy ist sicher und praktisch?
RemoteSigned (Schritt 6). Für Einzelfälle genügt pwsh.exe -ExecutionPolicy Bypass -File ... für diese eine Sitzung, nie dauerhaft Bypass oder Unrestricted.
Wieso wird mein catch-Block nie erreicht?
Der Fehler ist nicht-terminierend. Setzen Sie -ErrorAction Stop am Cmdlet (Schritt 9).
Wie finde ich heraus, welches Cmdlet ich brauche?
Mit Get-Command, Get-Help -Examples und Get-Member (Schritt 3).
Fazit
Verb-Nomen-Prinzip, objektbasierte Pipeline und die Discovery-Cmdlets Get-Command, Get-Help und Get-Member bilden das Fundament für die Verwaltung von Windows Server 2022/2025 per PowerShell. Setzen Sie die Execution Policy auf RemoteSigned, schreiben Sie parametrierte .ps1-Skripte, laden Sie Module gezielt nach und sichern Sie kritische Stellen mit try/catch ab. Danach folgen die Module für Active Directory, Hyper-V und DHCP.
Weiterführende Anleitungen und Quellen
Vertiefende Anleitungen zu den Admin-Modulen:
- Active Directory: Domäne einrichten sowie Benutzer und OUs anlegen: nutzt das Modul
ActiveDirectorymitNew-ADUserundGet-ADUser. - Hyper-V: Virtuelle Maschine erstellen und mit Checkpoints arbeiten: nutzt das Modul
Hyper-VmitNew-VMundStart-VM. - DHCP- und DNS-Rolle auf dem Windows Server konfigurieren: nutzt das Modul
DhcpServermitAdd-DhcpServerv4Scope. - Alle Anleitungen der Kategorie Windows Server
Quellen (Microsoft Learn):


