Zum Inhalt springen
sw
en

Tippe um zu suchen

Scripting & Automatisierung

PowerShell – Wichtige Befehle fuer den IT-Alltag

Die wichtigsten PowerShell-Befehle fuer IT-Allrounder: Systeminfo, Netzwerk, AD, Dienste, Scripting und Fehlersuche in der Praxis.

8 Min Lesezeit Fortgeschritten Zuletzt aktualisiert:

Warum PowerShell und nicht die GUI?

PowerShell ist keine Alternative zur grafischen Oberfläche – es ist das Werkzeug, das darunter liegt. Alles, was du in der Systemsteuerung, im Server-Manager oder im Active Directory Users and Computers machen kannst, geht auch per PowerShell. Und meistens schneller, reproduzierbar und automatisierbar.

Stell dir vor, du musst 50 neue AD-User anlegen. Per GUI brauchst du dafür einen halben Tag. Per PowerShell schreibst du einmal ein Skript, das eine CSV einliest, und erledigst es in zwei Minuten. Das ist der Unterschied.

Im KMU-Alltag reicht es oft, die richtigen Befehle zu kennen und bei Bedarf nachzuschlagen. Du musst kein Scripting-Profi sein – aber wer die grundlegenden Cmdlets beherrscht, ist deutlich schneller und kann auch mal um Mitternacht einen Dienst remote neu starten, ohne am Bildschirm zu sitzen.

Schnellstart: Die ersten Schritte

PowerShell öffnest du mit Win+R, dann powershell oder pwsh (für PS7). Für Admin-Befehle brauchst du eine erhöhte Konsole: Rechtsklick auf das PowerShell-Icon > “Als Administrator ausführen”.

Das wichtigste Hilfesystem kennst du, wenn du diese drei Befehle kennst:

# Hilfe zu einem Befehl anzeigen
Get-Help Get-Service -Full

# Alle Cmdlets zum Thema "Network" finden
Get-Command -Noun "Net*"

# Alle Befehle mit "user" im Namen
Get-Command *user*

# Hilfe-Datenbank aktualisieren (einmalig, als Admin)
Update-Help

Das Verb-Noun-Prinzip ist dein Freund: Get-, Set-, New-, Remove-, Start-, Stop-, Restart-. Wenn du weisst, was du tun willst, ergibt sich der Befehlsname oft von selbst.

Systeminformationen abfragen

Als erstes willst du wissen, womit du es zu tun hast. Diese Befehle liefern einen schnellen Überblick:

# Kompakte Systemübersicht
Get-ComputerInfo | Select-Object CsName, WindowsVersion, OsArchitecture, CsTotalPhysicalMemory

# Betriebssystem-Details (klassisch, auch in Skripten beliebt)
Get-WmiObject Win32_OperatingSystem | Select-Object Caption, Version, LastBootUpTime

# Wie lange läuft das System schon?
(Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime

# CPU-Info
Get-WmiObject Win32_Processor | Select-Object Name, NumberOfCores, MaxClockSpeed

# Festplattenplatz aller Laufwerke anzeigen
Get-PSDrive -PSProvider FileSystem | Select-Object Name, @{N="Frei GB";E={[math]::Round($_.Free/1GB,1)}}, @{N="Gesamt GB";E={[math]::Round(($_.Used+$_.Free)/1GB,1)}}

# Installierte Software auflisten
Get-Package | Select-Object Name, Version | Sort-Object Name

# Eventlog: Die letzten 20 Fehler im System-Log
Get-EventLog -LogName System -EntryType Error -Newest 20

Netzwerk-Diagnose

Netzwerkprobleme sind im IT-Support Tagesgeschäft. Diese Befehle ersetzt du nie wieder durch die GUI:

# Alle IP-Adressen anzeigen (wie ipconfig, aber als Objekt)
Get-NetIPAddress | Where-Object AddressFamily -eq "IPv4" | Select-Object InterfaceAlias, IPAddress, PrefixLength

# Netzwerkadapter-Status
Get-NetAdapter | Select-Object Name, Status, LinkSpeed, MacAddress

# Verbindungstest auf Port (viel besser als ping!)
Test-NetConnection -ComputerName server01 -Port 443
Test-NetConnection -ComputerName 192.168.1.1 -Port 3389  # RDP erreichbar?

# DNS-Abfrage
Resolve-DnsName google.com
Resolve-DnsName firma.ch -Type MX   # MX-Records abfragen
Resolve-DnsName firma.ch -Type TXT  # SPF-Record prüfen

# Routing-Tabelle
Get-NetRoute | Where-Object DestinationPrefix -eq "0.0.0.0/0"  # Default Gateway

# Offene TCP-Verbindungen anzeigen (wie netstat -ano)
Get-NetTCPConnection | Where-Object State -eq "Established" | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort

# DNS-Cache leeren
Clear-DnsClientCache

# IP-Konfiguration einer Netzwerkkarte setzen
New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 192.168.1.100 -PrefixLength 24 -DefaultGateway 192.168.1.1
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.168.1.10, 8.8.8.8

Active Directory verwalten

Voraussetzung: RSAT (Remote Server Administration Tools) muss installiert sein, damit das AD-Modul verfügbar ist.

# RSAT AD-Modul installieren (Windows 10/11, als Admin)
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

# Modul laden
Import-Module ActiveDirectory

# ===== USER =====
# Alle User anzeigen (mit Status)
Get-ADUser -Filter * | Select-Object Name, SamAccountName, Enabled | Sort-Object Name

# User suchen
Get-ADUser -Filter {SamAccountName -like "mmus*"} -Properties *

# User anlegen
New-ADUser `
  -Name "Max Muster" `
  -GivenName "Max" `
  -Surname "Muster" `
  -SamAccountName "mmuster" `
  -UserPrincipalName "mmuster@firma.local" `
  -Path "OU=Mitarbeiter,DC=firma,DC=local" `
  -AccountPassword (ConvertTo-SecureString "Start123!" -AsPlainText -Force) `
  -Enabled $true `
  -ChangePasswordAtLogon $true

# Passwort zurücksetzen
Set-ADAccountPassword -Identity "mmuster" -Reset -NewPassword (ConvertTo-SecureString "Neu123!" -AsPlainText -Force)
Set-ADUser -Identity "mmuster" -ChangePasswordAtLogon $true

# Konto entsperren
Unlock-ADAccount -Identity "mmuster"

# Alle gesperrten Accounts finden
Search-ADAccount -LockedOut | Select-Object Name, SamAccountName, LockedOut

# User deaktivieren (Offboarding)
Disable-ADAccount -Identity "mmuster"

# User in andere OU verschieben
Move-ADObject -Identity "CN=Max Muster,OU=Mitarbeiter,DC=firma,DC=local" -TargetPath "OU=Ehemalige,DC=firma,DC=local"

# ===== GRUPPEN =====
# User zu Gruppe hinzufügen
Add-ADGroupMember -Identity "IT-Team" -Members "mmuster"

# Mitglieder einer Gruppe anzeigen
Get-ADGroupMember -Identity "IT-Team" -Recursive | Select-Object Name, SamAccountName

# Gruppenmitgliedschaften eines Users
(Get-ADUser "mmuster" -Properties MemberOf).MemberOf

# ===== COMPUTER =====
# Computer in der Domain suchen
Get-ADComputer -Filter * | Select-Object Name, Enabled, LastLogonDate | Sort-Object LastLogonDate -Descending

# Inaktive Computer (90 Tage nicht eingeloggt) finden
$cutoff = (Get-Date).AddDays(-90)
Get-ADComputer -Filter {LastLogonDate -lt $cutoff} -Properties LastLogonDate | Select-Object Name, LastLogonDate

Dienste und Prozesse steuern

# ===== DIENSTE =====
# Alle Dienste anzeigen
Get-Service | Sort-Object Status, DisplayName | Select-Object DisplayName, Name, Status

# Alle gestoppten Dienste finden (die eigentlich laufen sollten)
Get-Service | Where-Object {$_.Status -eq "Stopped" -and $_.StartType -eq "Automatic"}

# Dienst starten / stoppen / neu starten
Start-Service   -Name "Spooler"
Stop-Service    -Name "Spooler"
Restart-Service -Name "Spooler" -Force

# Dienst-Starttyp ändern
Set-Service -Name "Spooler" -StartupType Automatic

# ===== PROZESSE =====
# Top 10 CPU-Fresser
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, Id, CPU, WorkingSet

# Prozess nach Name beenden
Stop-Process -Name "notepad" -Force

# Prozess nach ID beenden (aus Task-Manager kopieren)
Stop-Process -Id 1234 -Force

# Alle Instanzen eines Prozesses beenden
Get-Process -Name "chrome" | Stop-Process -Force

Dateisystem und Logs

# Ordnerinhalt rekursiv durchsuchen
Get-ChildItem -Path C:\Logs -Recurse -Filter "*.log"

# Grosse Dateien finden (über 100 MB)
Get-ChildItem -Path D:\ -Recurse -File |
  Where-Object Length -gt 100MB |
  Select-Object FullName, @{N="GB";E={[math]::Round($_.Length/1GB,2)}} |
  Sort-Object GB -Descending

# Dateien kopieren
Copy-Item -Path C:\Source -Destination D:\Backup -Recurse -Force

# Temporäre Dateien aufräumen
Remove-Item -Path C:\Windows\Temp\* -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path $env:TEMP\* -Recurse -Force -ErrorAction SilentlyContinue

# Ordnergrösse berechnen
Get-ChildItem -Path D:\Daten -Recurse |
  Measure-Object -Property Length -Sum |
  Select-Object @{N="Gesamt GB";E={[math]::Round($_.Sum/1GB,2)}}

# Eventlog nach Fehler durchsuchen (letzte 24h)
$since = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=$since} |
  Select-Object TimeCreated, Id, Message | Format-List

Software und Updates verwalten

# Installierte Software anzeigen (über Package-Manager)
Get-Package | Select-Object Name, Version, Source | Sort-Object Name

# WinGet: Paketmanager für Windows (Windows 10/11)
winget list                                          # Was ist installiert?
winget search "Visual Studio Code"                  # Paket suchen
winget install --id Microsoft.VisualStudioCode       # Installieren
winget upgrade --all                                 # Alle Pakete updaten

# Windows Updates mit PSWindowsUpdate (Modul zuerst installieren)
Install-Module PSWindowsUpdate -Force
Get-WindowsUpdate                                    # Verfügbare Updates anzeigen
Install-WindowsUpdate -AcceptAll -IgnoreReboot       # Installieren ohne Reboot
Install-WindowsUpdate -AcceptAll -AutoReboot         # Mit automatischem Neustart

# Windows Update Service Status
Get-Service -Name wuauserv

Remote-Verwaltung mit PowerShell Remoting

PowerShell Remoting (WinRM) erlaubt es, Befehle auf entfernten Rechnern auszuführen – ohne RDP-Session.

# WinRM aktivieren (auf dem Zielrechner, als Admin)
Enable-PSRemoting -Force

# Einzelnen Befehl remote ausführen
Invoke-Command -ComputerName server01 -ScriptBlock { Get-Service Spooler }

# Mehrere Computer gleichzeitig
Invoke-Command -ComputerName server01, server02, server03 -ScriptBlock {
  Get-EventLog -LogName System -EntryType Error -Newest 5
}

# Interaktive Remote-Session (wie SSH für Windows)
Enter-PSSession -ComputerName server01
# ... Befehle ausführen ...
Exit-PSSession

# Remote-Session mit anderen Credentials
$cred = Get-Credential
Enter-PSSession -ComputerName server01 -Credential $cred

Nützliche Einzeiler für den Alltag

Diese Snippets lösen konkrete Alltagsprobleme ohne langes Suchen:

# Druckspooler neu starten (klassisches Troubleshooting)
Stop-Service Spooler -Force; Remove-Item "$env:SystemRoot\System32\spool\PRINTERS\*" -Force -ErrorAction SilentlyContinue; Start-Service Spooler

# Alle Netzlaufwerke anzeigen
Get-PSDrive -PSProvider FileSystem | Where-Object Root -like "\\*"

# Netzlaufwerk verbinden
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\server\freigabe" -Persist

# Gespeicherte WLAN-Passwörter auslesen (als Admin)
netsh wlan show profiles | Select-String "Alle Benutzerprofile" | ForEach-Object {
  $ssid = $_ -replace ".*: ", ""
  netsh wlan show profile name=$ssid key=clear
}

# Lokalen Admin-Account aktivieren (z.B. bei Domänenproblemen)
Enable-LocalUser -Name "Administrator"
Set-LocalUser -Name "Administrator" -Password (ConvertTo-SecureString "Temp123!" -AsPlainText -Force)

# Alle TCP-Verbindungen auf Port 3389 sehen (wer macht RDP?)
Get-NetTCPConnection -LocalPort 3389 | Select-Object LocalAddress, RemoteAddress, State

# Zertifikate im lokalen Computer-Store anzeigen
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, NotAfter | Sort-Object NotAfter

# Laufzeit eines Skripts messen
Measure-Command { Get-ADUser -Filter * }

Troubleshooting mit PowerShell

# Fehler-Variablen auswerten
$Error[0]              # Letzter Fehler
$Error[0].Exception    # Exception-Objekt
$Error[0].InvocationInfo.Line  # Zeile, die den Fehler verursacht hat
$Error.Clear()         # Fehlerliste leeren

# Detaillierte Ausgabe aktivieren
$VerbosePreference = "Continue"
$DebugPreference    = "Continue"

# Befehl mit -ErrorAction steuern
Get-Item C:\nichtvorhanden -ErrorAction SilentlyContinue  # Fehler ignorieren
Get-Item C:\nichtvorhanden -ErrorAction Stop              # Fehler als Ausnahme behandeln

# Try/Catch für robuste Skripte
try {
    Get-ADUser -Identity "mmuster" -ErrorAction Stop
} catch {
    Write-Warning "User nicht gefunden: $_"
}

# Ausgabe in Datei schreiben (z.B. für Berichte)
Get-ADUser -Filter * | Select-Object Name, Enabled |
  Export-Csv -Path C:\Reports\users.csv -NoTypeInformation -Encoding UTF8

# Objekte als JSON exportieren (z.B. für Weiterverarbeitung)
Get-Process | Select-Object Name, Id, CPU | ConvertTo-Json | Out-File C:\Reports\processes.json

Verwandte Themen, die gut zu PowerShell passen:

Weiterlernen

Videos

YouTube
PowerShell Basics fuer Admins – Teil 1
YouTube
PowerShell Crashkurs Teil 1: Einstieg und Grundlagen

Kommentare

Frage, Verbesserungsvorschlag oder eigene Erfahrung zu diesem Artikel? Schreib einen Kommentar. Neue Beiträge erscheinen nach kurzer Moderation.

  • Lade Kommentare …
Kommentar schreiben