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:
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:
$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):
$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:
$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?
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator)
Profile auf dem Rechner:
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:
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
# 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:
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?
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:
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:
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):
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:
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:
# 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 |
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:
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) |