PowerShell-Befehlssammlung für Windows

Die wichtigsten PowerShell-Befehle für Support und Administration – Inventur, Netzwerk, DNS, Benutzer und Profile, Ereignisanzeige, Dienste, Datenträger, Drucker, BitLocker, Microsoft 365, Domäne und Fernwartung.

PowerShell-Befehlssammlung für Windows

PowerShell liefert Objekte statt Text – Ergebnisse lassen sich filtern, sortieren und exportieren. Diese Sammlung enthält die Befehle, die im Support- und Admin-Alltag immer wieder gebraucht werden.

Schnellübersicht

Thema Erste Befehle
Grundlagen Get-Help, Get-Command, Select-Object, Export-Csv
System und Inventur Get-ComputerInfo, Get-CimInstance
Netzwerk Get-NetIPConfiguration, Test-NetConnection
DNS Resolve-DnsName, Clear-DnsClientCache
Benutzer, Rechte, Profile Get-LocalUser, Get-LocalGroupMember
Ereignisanzeige Get-WinEvent, wichtige Ereignis-IDs
Dienste und Prozesse Get-Service, Get-Process
Datenträger Get-Volume, Get-PhysicalDisk
Drucker Get-Printer, Get-PrintJob
Microsoft 365 Connect-ExchangeOnline, Get-EXOMailbox
BitLocker Get-BitLockerVolume, Suspend-BitLocker
Windows Update Get-HotFix, Get-WindowsUpdateLog
Domäne und Fernwartung Test-ComputerSecureChannel, Invoke-Command

1. Grundlagen

Befehl Zweck
Get-Help <befehl> -Examples Beispiele zu einem Befehl
Get-Command *dns* Befehle finden, die „dns“ im Namen tragen
<befehl> | Get-Member welche Eigenschaften hat das Ergebnis?
$PSVersionTable PowerShell-Version
Get-ExecutionPolicy -List darf das System Skripte ausführen?
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser lokale Skripte für den eigenen Benutzer erlauben

Ergebnisse weiterverarbeiten:

powershell
Get-Service | Where-Object Status -eq 'Stopped'          # filtern
Get-Process | Sort-Object CPU -Descending                # sortieren
Get-Process | Select-Object -First 5 Name, Id, CPU       # Spalten und Anzahl wählen
Get-Service | Out-GridView                               # sortierbares Fenster (nur mit Desktop)
Get-Service | Export-Csv "$env:USERPROFILE\Desktop\dienste.csv" -NoTypeInformation -Encoding UTF8
Get-ComputerInfo | Out-File "$env:USERPROFILE\Desktop\info.txt"
Get-Process | Format-Table -AutoSize                     # nur zur Anzeige, am Ende der Pipeline

2. System und Inventur

Befehl Zweck
Get-ComputerInfo sehr ausführliche Systemdaten
Get-CimInstance Win32_OperatingSystem Version, Build, letzter Start, freier Speicher
Get-CimInstance Win32_BIOS BIOS-Version und Seriennummer
Get-CimInstance Win32_ComputerSystem Hersteller, Modell, Domäne, RAM
Get-CimInstance Win32_Processor CPU
Get-CimInstance Win32_LogicalDisk Laufwerke mit Größe und freiem Platz
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime letzter Neustart
Get-Package installierte Software (Windows PowerShell 5.1)

Kompakter Inventur-Block zum Kopieren:

powershell
$os  = Get-CimInstance Win32_OperatingSystem
$cs  = Get-CimInstance Win32_ComputerSystem
$bio = Get-CimInstance Win32_BIOS
[pscustomobject]@{
  Computer     = $env:COMPUTERNAME
  Benutzer     = $env:USERNAME
  Hersteller   = $cs.Manufacturer
  Modell       = $cs.Model
  Seriennr     = $bio.SerialNumber
  Windows      = $os.Caption
  Build        = $os.BuildNumber
  LetzterStart = $os.LastBootUpTime
  RAM_GB       = [math]::Round($cs.TotalPhysicalMemory / 1GB, 1)
  Domaene      = $cs.Domain
}

Installierte Software aus der Registry (schneller und vollständiger als Win32_Product):

powershell
$pfade = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
         'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
Get-ItemProperty $pfade -ErrorAction SilentlyContinue |
  Where-Object DisplayName |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName

3. Netzwerk

Befehl Zweck
Get-NetIPConfiguration übersichtliche IP-Konfiguration je Adapter
Get-NetIPAddress -AddressFamily IPv4 alle IPv4-Adressen
Get-NetAdapter Adapter, Status, Geschwindigkeit, MAC
Restart-NetAdapter -Name "Ethernet" 🔒 Adapter neu starten
Get-NetRoute -AddressFamily IPv4 Routingtabelle
Get-NetNeighbor ARP-Tabelle
Get-NetConnectionProfile Netzwerkprofil (Öffentlich/Privat/Domäne)
Set-NetConnectionProfile -InterfaceAlias "Ethernet" -NetworkCategory Private 🔒 Profil auf „Privat“ stellen
Get-NetFirewallProfile | Select Name, Enabled Status der Windows-Firewall
Get-SmbMapping verbundene Netzlaufwerke

Verbindung testen:

Befehl Zweck
Test-Connection 1.1.1.1 -Count 4 Ping
Test-NetConnection example.com -Port 443 ist ein bestimmter Port erreichbar?
Test-NetConnection example.com -TraceRoute Traceroute
Test-NetConnection -ComputerName <ip> -CommonTCPPort RDP Kurzform für RDP, SMB, HTTP, WINRM
Get-NetTCPConnection -State Established aktive Verbindungen
Get-NetTCPConnection -State Listen welche Ports lauschen lokal?
Invoke-WebRequest https://example.com -Method Head HTTP-Antwort eines Webservers

Mehrere Ports eines Hosts prüfen:

powershell
$ziel = '10.0.0.1'
22, 53, 80, 443, 3389 | ForEach-Object {
  [pscustomobject]@{ Port = $_; Offen = (Test-NetConnection $ziel -Port $_ -WarningAction SilentlyContinue).TcpTestSucceeded }
}

4. DNS

Befehl Zweck
Resolve-DnsName example.com Auflösung mit Details
Resolve-DnsName example.com -Server 1.1.1.1 gezielt einen anderen DNS-Server fragen
Resolve-DnsName example.com -Type MX bestimmte Record-Typen (MX, TXT, CNAME, SRV …)
Resolve-DnsName _ldap._tcp.<domäne> -Type SRV Domänencontroller per DNS finden
Get-DnsClientServerAddress -AddressFamily IPv4 eingetragene DNS-Server je Adapter
Get-DnsClientCache lokaler DNS-Cache
Clear-DnsClientCache DNS-Cache leeren

5. Benutzer, Rechte und Profile

Befehl Zweck
Get-LocalUser lokale Benutzer mit Status
Get-LocalUser <name> | Select * alle Details eines Kontos
Get-LocalGroupMember -SID S-1-5-32-544 Mitglieder der lokalen Admin-Gruppe – sprachunabhängig
Add-LocalGroupMember -SID S-1-5-32-544 -Member <name> 🔒 Benutzer zum lokalen Admin machen
Enable-LocalUser <name> · Disable-LocalUser <name> 🔒 Konto aktivieren/deaktivieren
Get-Acl C:\Pfad | Format-List NTFS-Berechtigungen
[Security.Principal.WindowsIdentity]::GetCurrent().Name aktueller Benutzer

Bin ich gerade Administrator?

powershell
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
  [Security.Principal.WindowsBuiltInRole]::Administrator)

Profile auf dem Rechner:

powershell
Get-CimInstance Win32_UserProfile |
  Where-Object { -not $_.Special } |
  Select-Object LocalPath, LastUseTime, Loaded, SID

Temporäres Profil – Ereignisse des Profildienstes (ID 1511) und .bak-Einträge:

powershell
Get-WinEvent -FilterHashtable @{
  LogName = 'Application'
  ProviderName = 'Microsoft-Windows-User Profiles Service'
  StartTime = (Get-Date).AddDays(-7)
} | Select-Object TimeCreated, Id, Message -First 20

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' |
  Select-Object PSChildName, @{n='Pfad'; e={ $_.GetValue('ProfileImagePath') }}

6. Ereignisanzeige

powershell
# Fehler und Warnungen im System-Log der letzten 24 Stunden
Get-WinEvent -FilterHashtable @{ LogName='System'; Level=1,2,3; StartTime=(Get-Date).AddHours(-24) } |
  Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message

# Die letzten 20 Fehler im Anwendungs-Log
Get-WinEvent -FilterHashtable @{ LogName='Application'; Level=2 } -MaxEvents 20

# Nach einer bestimmten Ereignis-ID suchen (unerwartetes Herunterfahren)
Get-WinEvent -FilterHashtable @{ LogName='System'; Id=41,6008 } -MaxEvents 10

# Wer oder was hat neu gestartet?
Get-WinEvent -FilterHashtable @{ LogName='System'; Id=1074 } -MaxEvents 10 |
  Select-Object TimeCreated, Message

# Fehlgeschlagene Anmeldungen (Administrator nötig)
Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4625 } -MaxEvents 20

# Verfügbare Logs mit Einträgen
Get-WinEvent -ListLog * | Where-Object RecordCount -gt 0 | Sort-Object RecordCount -Descending

Wichtige Ereignis-IDs:

ID Log Bedeutung
41 System Kernel-Power: Neustart ohne sauberes Herunterfahren (Absturz, Stromausfall, Einfrieren)
6008 System vorheriges Herunterfahren war unerwartet
1074 System Neustart/Herunterfahren ausgelöst – mit Prozess und Benutzer
7031 / 7034 System Dienst unerwartet beendet
1000 Application Anwendung abgestürzt (mit Programmname und Modul)
1001 Application Windows-Fehlerberichterstattung, oft mit Bluescreen-Bezug
1511 Application Anmeldung mit temporärem Profil
4624 Security erfolgreiche Anmeldung
4625 Security fehlgeschlagene Anmeldung
4740 Security (DC) Benutzerkonto gesperrt

7. Dienste und Prozesse

Befehl Zweck
Get-Service <name> Status eines Dienstes
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } Autostart-Dienste, die nicht laufen
Restart-Service <name> 🔒 Dienst neu starten
Set-Service <name> -StartupType Automatic 🔒 Starttyp ändern
Get-Process | Sort-Object CPU -Descending | Select -First 10 Top-Prozesse nach CPU-Zeit
Stop-Process -Name <name> -Force Prozess beenden
Get-ScheduledTask | Where-Object State -ne Disabled aktive geplante Aufgaben
Get-CimInstance Win32_StartupCommand Autostart-Einträge

Top 10 nach Arbeitsspeicher:

powershell
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 Name, Id,
  @{n='RAM_MB'; e={ [math]::Round($_.WS / 1MB) }}

Welcher Prozess belegt einen Port?

powershell
Get-NetTCPConnection -LocalPort 443 -State Listen |
  Select-Object LocalAddress, LocalPort, OwningProcess,
    @{n='Prozess'; e={ (Get-Process -Id $_.OwningProcess).ProcessName }}

8. Datenträger und Speicher

Befehl Zweck
Get-Volume Laufwerke, Dateisystem, Größe, freier Platz, Zustand
Get-PhysicalDisk physische Datenträger (SSD/HDD, Zustand)
Get-PhysicalDisk | Get-StorageReliabilityCounter 🔒 Temperatur, Lesefehler, Verschleiß (wenn geliefert)
Get-Disk · Get-Partition Datenträger und Partitionen
Repair-Volume -DriveLetter C -Scan 🔒 Dateisystem prüfen
Optimize-Volume -DriveLetter C -Verbose 🔒 TRIM (SSD) bzw. Defragmentierung (HDD)

Freier Platz in GB:

powershell
Get-Volume | Where-Object DriveLetter | Select-Object DriveLetter, FileSystemLabel,
  @{n='Groesse_GB'; e={ [math]::Round($_.Size / 1GB, 1) }},
  @{n='Frei_GB';    e={ [math]::Round($_.SizeRemaining / 1GB, 1) }}

Größte Ordner im Benutzerprofil finden:

powershell
Get-ChildItem $env:USERPROFILE -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
  [pscustomobject]@{
    Ordner = $_.Name
    GB = [math]::Round((Get-ChildItem $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue |
          Measure-Object Length -Sum).Sum / 1GB, 2)
  }
} | Sort-Object GB -Descending | Select-Object -First 10

Größte Dateien auf C: (dauert etwas):

powershell
Get-ChildItem C:\ -Recurse -File -Force -ErrorAction SilentlyContinue |
  Sort-Object Length -Descending | Select-Object -First 20 FullName,
    @{n='GB'; e={ [math]::Round($_.Length / 1GB, 2) }}

9. Drucker

Befehl Zweck
Get-Printer installierte Drucker mit Treiber und Port
Get-PrinterPort Druckeranschlüsse (IP-Adressen)
Get-PrinterDriver installierte Treiber
Get-PrintJob -PrinterName "DRUCKERNAME" Aufträge in der Warteschlange
Remove-PrintJob -PrinterName "DRUCKERNAME" -ID <nr> einzelnen Auftrag löschen
Restart-Service Spooler 🔒 Druckwarteschlange neu starten
Add-PrinterPort -Name "IP_10.0.0.50" -PrinterHostAddress 10.0.0.50 🔒 TCP/IP-Port anlegen
Add-Printer -Name "Büro" -DriverName "<treiber>" -PortName "IP_10.0.0.50" 🔒 Drucker anlegen
Test-NetConnection 10.0.0.50 -Port 9100 ist der Drucker per RAW/JetDirect erreichbar?

Alle Aufträge aller Drucker anzeigen:

powershell
Get-Printer | ForEach-Object { Get-PrintJob -PrinterName $_.Name } |
  Select-Object PrinterName, Id, DocumentName, UserName, JobStatus, SubmittedTime

10. Microsoft 365 und Exchange Online

Modul einrichten und verbinden:

powershell
# einmalig für den eigenen Benutzer
Install-Module ExchangeOnlineManagement -Scope CurrentUser

Connect-ExchangeOnline -UserPrincipalName admin@domain.tld
Befehl Zweck
Get-EXOMailbox -Identity user@domain.tld Postfach-Grunddaten
Get-EXOMailboxStatistics -Identity user@domain.tld | Select DisplayName, ItemCount, TotalItemSize Größe und Anzahl der Elemente
Get-MailboxPermission -Identity user@domain.tld Vollzugriff-Berechtigungen
Get-RecipientPermission -Identity user@domain.tld „Senden als“-Berechtigungen
Get-MailboxFolderPermission -Identity user@domain.tld:\Kalender Kalenderfreigaben (deutscher Ordnername)
Get-InboxRule -Mailbox user@domain.tld Posteingangsregeln – auch Weiterleitungen nach Kontoübernahmen prüfen
Get-EXOMailbox -ResultSize Unlimited | Select DisplayName, PrimarySmtpAddress, RecipientTypeDetails alle Postfächer
Get-MessageTraceV2 -RecipientAddress user@domain.tld -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) Nachrichtenablaufverfolgung
powershell
Disconnect-ExchangeOnline -Confirm:$false

11. BitLocker

Befehl Zweck
Get-BitLockerVolume 🔒 Status aller Laufwerke
(Get-BitLockerVolume -MountPoint C:).KeyProtector 🔒 Schutzvorrichtungen mit ID
Suspend-BitLocker -MountPoint C: -RebootCount 1 🔒 Schutz für den nächsten Neustart aussetzen
Resume-BitLocker -MountPoint C: 🔒 Schutz wieder aktivieren
BackupToAAD-BitLockerKeyProtector -MountPoint C: -KeyProtectorId <id> 🔒 Schlüssel in Entra ID sichern

Vor einem BIOS-/Firmware-Update:

powershell
Suspend-BitLocker -MountPoint "C:" -RebootCount 1
# BIOS-Update durchführen und neu starten, danach:
Get-BitLockerVolume -MountPoint "C:" | Select-Object MountPoint, VolumeStatus, ProtectionStatus

12. Windows Update

Befehl Zweck
Get-Service wuauserv, bits, cryptsvc, msiserver laufen die Update-Dienste?
Get-HotFix | Sort-Object InstalledOn -Descending | Select -First 10 zuletzt installierte Updates
Get-WindowsUpdateLog erzeugt WindowsUpdate.log auf dem Desktop
Get-WinEvent -LogName Microsoft-Windows-WindowsUpdateClient/Operational -MaxEvents 50 Update-Ereignisse
Repair-WindowsImage -Online -RestoreHealth 🔒 entspricht DISM /RestoreHealth

Den kompletten Reset der Update-Komponenten gibt es in der CMD-Sammlung.


13. Domäne und Fernwartung

Befehl Zweck
Test-ComputerSecureChannel 🔒 Vertrauensstellung zur Domäne intakt? (nur Windows PowerShell 5.1)
Test-ComputerSecureChannel -Repair -Credential <domäne\admin> 🔒 Vertrauensstellung reparieren, ohne den Rechner neu aufzunehmen
Enter-PSSession -ComputerName <rechner> interaktive Sitzung auf einem anderen Rechner (WinRM)
Invoke-Command -ComputerName pc1, pc2 { hostname; Get-Service Spooler } Befehle auf mehreren Rechnern
Restart-Computer -ComputerName <rechner> -Force anderen Rechner neu starten
Get-CimInstance Win32_ComputerSystem -ComputerName <rechner> | Select UserName wer ist dort angemeldet?
Test-WSMan <rechner> ist WinRM erreichbar?
Enable-PSRemoting -Force 🔒 WinRM auf dem Zielrechner einschalten

Mit Active-Directory-Modul (RSAT):

Befehl Zweck
Get-ADUser <name> -Properties LockedOut, LastLogonDate, PasswordLastSet Kontostatus
Search-ADAccount -LockedOut alle gesperrten Konten
Unlock-ADAccount <name> Konto entsperren
Get-ADPrincipalGroupMembership <name> | Select Name Gruppen eines Benutzers
Get-ADComputer -Filter * -Properties LastLogonDate | Sort LastLogonDate Computerkonten nach letzter Anmeldung

Typische Abläufe

Problem Reihenfolge
Rechner erfassen Inventur-Block → Get-Volume → installierte Software exportieren
Port nicht erreichbar Test-NetConnection <ziel> -Port <p> → Get-NetTCPConnection -State Listen auf dem Ziel → Firewall-Profil prüfen
System instabil Get-WinEvent mit ID 41/1000/1001 → Repair-WindowsImage → sfc /scannow
Drucker druckt nicht Get-PrintJob → Auftrag löschen → Restart-Service Spooler → Test-NetConnection <ip> -Port 9100
Konto gesperrt Search-ADAccount -LockedOut → ID 4740 auf dem DC → Unlock-ADAccount
Postfach voll Get-EXOMailboxStatistics → Archiv/Aufbewahrung prüfen (nach Freigabe)