# 2.2 PowerShell-Netzwerkdiagnose

PowerShell stellt Netzwerkdaten als strukturierte Objekte bereit. Dadurch lassen sich Informationen gezielt filtern, sortieren, vergleichen und exportieren.

Die Cmdlets dieser Seite gehören zu Windows-Modulen wie `NetAdapter`, `NetTCPIP`, `DnsClient` und `NetSecurity`. Sie sind für die Netzwerkdiagnose unter Windows vorgesehen.

---

**Kennzeichnungen**

| Kennzeichnung | Bedeutung |
|---|---|
| `[RO]` | Nur lesender Befehl; verändert keine Konfiguration |
| `[TEST]` | Führt einen aktiven Netzwerk- oder Verbindungstest aus |
| `[PRIV]` | Benötigt möglicherweise eine PowerShell mit Administratorrechten |
| `[CHANGE]` | Verändert einen Zustand oder eine Konfiguration |
| `[DISRUPT]` | Kann eine bestehende Verbindung oder einen Dienst unterbrechen |
| `[FILE]` | Schreibt Informationen in eine Datei |
| `[SENS]` | Ausgabe kann sensible System-, Netzwerk- oder Prozessdaten enthalten |

> Für die erste Diagnose möglichst mit `[RO]`-Befehlen beginnen. Veränderungen sollten erst erfolgen, wenn die Ursache ausreichend eingegrenzt und eine Rückfallmöglichkeit vorhanden ist.

---

<details>
<summary><strong>1. PowerShell und benötigte Netzwerkmodule prüfen</strong></summary>

Bevor ein Cmdlet verwendet wird, sollte geprüft werden, welche PowerShell-Version und welche Windows-Netzwerkmodule vorhanden sind.

| Aufgabe | PowerShell-Befehl |
|---|---|
| PowerShell-Version anzeigen | `[RO] $PSVersionTable` |
| Betriebssysteminformationen anzeigen | `[RO] Get-ComputerInfo \| Select-Object WindowsProductName, WindowsVersion, OsBuildNumber` |
| Netzwerkmodule suchen | `[RO] Get-Module -ListAvailable NetAdapter, NetTCPIP, DnsClient, NetSecurity` |
| Befehle eines Moduls auflisten | `[RO] Get-Command -Module NetTCPIP` |
| Hilfe zu einem Cmdlet anzeigen | `[RO] Get-Help Test-NetConnection -Full` |
| Verwendungsbeispiele anzeigen | `[RO] Get-Help Resolve-DnsName -Examples` |
| Syntax eines Cmdlets anzeigen | `[RO] Get-Command Get-NetAdapter -Syntax` |

**Typische Fehler**

| Meldung oder Beobachtung | Mögliche Bedeutung |
|---|---|
| `The term ... is not recognized` | Cmdlet oder Modul ist nicht vorhanden beziehungsweise nicht geladen |
| `Access denied` | Administratorrechte oder zusätzliche Berechtigungen erforderlich |
| Keine Ausgabe | Filter ist möglicherweise zu eng oder es existiert kein passendes Objekt |
| Einzelne Eigenschaften fehlen | Unterschiedliche Windows-, PowerShell- oder Modulversion |

</details>

---

<details>
<summary><strong>2. Netzwerkadapter und Verbindungsstatus prüfen</strong></summary>

`Get-NetAdapter` zeigt physische und virtuelle Netzwerkadapter einschließlich Status, Geschwindigkeit, MAC-Adresse und Schnittstellenindex.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Alle sichtbaren Netzwerkadapter anzeigen | `[RO] Get-NetAdapter` |
| Auch ausgeblendete Adapter anzeigen | `[RO] Get-NetAdapter -IncludeHidden` |
| Wichtige Eigenschaften auswählen | `[RO] Get-NetAdapter \| Select-Object Name, InterfaceDescription, Status, LinkSpeed, MacAddress, ifIndex` |
| Nur aktive Adapter anzeigen | `[RO] Get-NetAdapter \| Where-Object Status -eq "Up"` |
| Nicht aktive Adapter anzeigen | `[RO] Get-NetAdapter \| Where-Object Status -ne "Up"` |
| Adapter nach Status gruppieren | `[RO] Get-NetAdapter -IncludeHidden \| Group-Object Status` |
| Detailinformationen eines Adapters anzeigen | `[RO] Get-NetAdapter -Name "Ethernet" \| Format-List *` |
| Adapterstatistik anzeigen | `[RO] Get-NetAdapterStatistics` |
| Fehler- und Verwerfungszähler anzeigen | `[RO] Get-NetAdapterStatistics \| Select-Object Name, ReceivedPacketErrors, OutboundPacketErrors, ReceivedDiscardedPackets, OutboundDiscardedPackets` |
| Treiberinformationen anzeigen | `[RO] Get-NetAdapter \| Select-Object Name, DriverDescription, DriverVersion, DriverDate` |
| Verbindungstyp und Netzwerkprofil anzeigen | `[RO] Get-NetConnectionProfile` |

**Wichtige Eigenschaften**

| Eigenschaft | Bedeutung |
|---|---|
| `Status` | Betriebszustand des Adapters |
| `LinkSpeed` | Ausgehandelte Verbindungsgeschwindigkeit |
| `MacAddress` | Hardwareadresse des Netzwerkadapters |
| `ifIndex` | Schnittstellenindex für weitere Cmdlets |
| `ReceivedPacketErrors` | Fehlerhaft empfangene Pakete |
| `OutboundPacketErrors` | Fehler beim Senden |
| `ReceivedDiscardedPackets` | Empfangene, aber verworfene Pakete |
| `OutboundDiscardedPackets` | Zu sendende, aber verworfene Pakete |

**Hinweise zur Auswertung**

- `Status = Up` bedeutet nur, dass der Adapter aktiv und eine Verbindung erkannt wurde.
- Ein aktiver Adapter bestätigt nicht automatisch eine funktionierende IP-Konfiguration.
- Eine unerwartet niedrige `LinkSpeed` kann auf Kabel-, Port-, Treiber- oder Aushandlungsprobleme hinweisen.
- Steigende Fehler- oder Verwerfungszähler können auf Treiberprobleme, Überlastung oder eine gestörte Verbindung hinweisen.
- Virtuelle Adapter von VPN-, Hyper-V-, Container- oder Sicherheitssoftware müssen von physischen Adaptern unterschieden werden.

</details>

---

<details>
<summary><strong>3. IP-Konfiguration vollständig erfassen</strong></summary>

`Get-NetIPConfiguration` liefert eine zusammengefasste Ansicht der IP-Konfiguration. Für einzelne Eigenschaften stehen zusätzliche Cmdlets zur Verfügung.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Aktive IP-Konfiguration anzeigen | `[RO] Get-NetIPConfiguration` |
| Alle IP-Konfigurationen anzeigen | `[RO] Get-NetIPConfiguration -All` |
| Ausführliche Ausgabe erzeugen | `[RO] Get-NetIPConfiguration -All \| Format-List *` |
| IPv4-Adressen anzeigen | `[RO] Get-NetIPAddress -AddressFamily IPv4` |
| IPv6-Adressen anzeigen | `[RO] Get-NetIPAddress -AddressFamily IPv6` |
| Verwendbare IPv4-Adressen anzeigen | `[RO] Get-NetIPAddress -AddressFamily IPv4 \| Where-Object AddressState -eq "Preferred"` |
| Loopback- und APIPA-Adressen ausblenden | `[RO] Get-NetIPAddress -AddressFamily IPv4 \| Where-Object { $_.IPAddress -notlike "127.*" -and $_.IPAddress -notlike "169.254.*" }` |
| IP-Schnittstellen anzeigen | `[RO] Get-NetIPInterface` |
| IPv4-Schnittstellen nach Metrik sortieren | `[RO] Get-NetIPInterface -AddressFamily IPv4 \| Sort-Object InterfaceMetric` |
| Standardgateways anzeigen | `[RO] Get-NetRoute -DestinationPrefix "0.0.0.0/0"` |
| DNS-Serveradressen anzeigen | `[RO] Get-DnsClientServerAddress` |
| Nur IPv4-DNS-Server anzeigen | `[RO] Get-DnsClientServerAddress -AddressFamily IPv4` |
| DHCP-Status anzeigen | `[RO] Get-NetIPInterface \| Select-Object InterfaceAlias, AddressFamily, Dhcp, ConnectionState` |

**Wichtige Prüfpunkte**

| Prüffeld | Erwartung beziehungsweise Fehlerhinweis |
|---|---|
| IP-Adresse | Muss zum vorgesehenen Netzwerk passen |
| Präfixlänge | Muss zur Netzmaske des Netzwerks passen |
| Standardgateway | Muss im Regelfall aus dem lokalen Netz erreichbar sein |
| DNS-Server | Muss erreichbar und für die benötigten Zonen zuständig sein |
| DHCP | Muss zur vorgesehenen statischen oder dynamischen Konfiguration passen |
| InterfaceMetric | Niedrigerer Wert wird bei konkurrierenden Schnittstellen bevorzugt |
| `169.254.x.x` | Kann auf eine fehlgeschlagene DHCP-Zuweisung hinweisen |
| Mehrere Standardrouten | Können zu einem unerwarteten Verbindungsweg führen |

**Kompakte Bestandsaufnahme**

```powershell
Get-NetIPConfiguration -All |
    Select-Object InterfaceAlias,
                  InterfaceDescription,
                  NetProfile,
                  IPv4Address,
                  IPv6Address,
                  IPv4DefaultGateway,
                  DNSServer
```

</details>

---

<details>
<summary><strong>4. Erreichbarkeit und TCP-Ports testen</strong></summary>

`Test-NetConnection` kombiniert mehrere klassische Netzwerkprüfungen und liefert strukturierte Ergebnisse.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Grundlegende Erreichbarkeit testen | `[TEST] Test-NetConnection 192.0.2.10` |
| Detaillierte Ausgabe anzeigen | `[TEST] Test-NetConnection 192.0.2.10 -InformationLevel Detailed` |
| Standardgateway testen | `[TEST] Test-NetConnection 192.0.2.1 -InformationLevel Detailed` |
| Internet-IP testen | `[TEST] Test-NetConnection 1.1.1.1 -InformationLevel Detailed` |
| HTTPS-Port testen | `[TEST] Test-NetConnection example.com -Port 443 -InformationLevel Detailed` |
| SSH-Port testen | `[TEST] Test-NetConnection 192.0.2.10 -Port 22 -InformationLevel Detailed` |
| RDP-Port testen | `[TEST] Test-NetConnection 192.0.2.10 -Port 3389 -InformationLevel Detailed` |
| SMB-Port testen | `[TEST] Test-NetConnection 192.0.2.10 -Port 445 -InformationLevel Detailed` |
| Routenverfolgung durchführen | `[TEST] Test-NetConnection example.com -TraceRoute` |
| Nur boolesches Testergebnis ausgeben | `[TEST] Test-NetConnection example.com -Port 443 -InformationLevel Quiet` |

> Die Adressen `192.0.2.0/24`, `198.51.100.0/24` und `203.0.113.0/24` sind Dokumentationsnetze. Sie müssen in echten Prüfungen durch die tatsächlichen Zieladressen ersetzt werden.

**Wichtige Ergebnisfelder**

| Eigenschaft | Bedeutung |
|---|---|
| `ComputerName` | Angegebenes Ziel |
| `RemoteAddress` | Aufgelöste Zieladresse |
| `NameResolutionResults` | Ergebnisse der Namensauflösung |
| `SourceAddress` | Verwendete lokale Quelladresse |
| `InterfaceAlias` | Verwendete Netzwerkschnittstelle |
| `NetRoute` | Ausgewählte Route |
| `PingSucceeded` | Ergebnis des ICMP-Tests |
| `TcpTestSucceeded` | Ergebnis des TCP-Verbindungsversuchs |
| `RemotePort` | Getesteter Zielport |

**Interpretation**

| Ergebnis | Mögliche Bedeutung |
|---|---|
| `PingSucceeded = False`, TCP-Test erfolgreich | ICMP wird möglicherweise blockiert; der getestete Dienst ist trotzdem erreichbar |
| Namensauflösung schlägt fehl, IP-Test funktioniert | DNS-Problem wahrscheinlich |
| Gateway erreichbar, externes Ziel nicht erreichbar | Routing, Firewall, Provider oder Upstream-System prüfen |
| IP-Adresse erreichbar, TCP-Port nicht erreichbar | Dienst, Zielport oder Firewall prüfen |
| Falsches `InterfaceAlias` | Routingmetrik, VPN oder mehrere aktive Adapter prüfen |
| Falsche `SourceAddress` | IP-Konfiguration oder Routenauswahl prüfen |

</details>

---

<details>
<summary><strong>5. DNS-Auflösung gezielt untersuchen</strong></summary>

`Resolve-DnsName` erlaubt präzisere DNS-Abfragen als ein einfacher Verbindungstest.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Namen mit Standardeinstellungen auflösen | `[TEST] Resolve-DnsName example.com` |
| Nur DNS verwenden | `[TEST] Resolve-DnsName example.com -DnsOnly` |
| IPv4-Adresse abfragen | `[TEST] Resolve-DnsName example.com -Type A -DnsOnly` |
| IPv6-Adresse abfragen | `[TEST] Resolve-DnsName example.com -Type AAAA -DnsOnly` |
| Mailserver abfragen | `[TEST] Resolve-DnsName example.com -Type MX -DnsOnly` |
| Nameserver abfragen | `[TEST] Resolve-DnsName example.com -Type NS -DnsOnly` |
| TXT-Einträge abfragen | `[TEST] Resolve-DnsName example.com -Type TXT -DnsOnly` |
| Reverse-DNS-Abfrage durchführen | `[TEST] Resolve-DnsName 192.0.2.10 -Type PTR -DnsOnly` |
| Bestimmten DNS-Server verwenden | `[TEST] Resolve-DnsName example.com -Server 192.0.2.53 -DnsOnly` |
| Nur lokalen DNS-Cache abfragen | `[RO] Resolve-DnsName example.com -CacheOnly` |
| DNS-Cache anzeigen | `[RO] Get-DnsClientCache` |
| Cache nach einem Namen durchsuchen | `[RO] Get-DnsClientCache \| Where-Object Entry -like "*example.com*"` |
| Konfigurierte DNS-Server anzeigen | `[RO] Get-DnsClientServerAddress` |
| DNS-Clientkonfiguration anzeigen | `[RO] Get-DnsClient` |

**DNS-Vergleichstest**

```powershell
Resolve-DnsName example.com -DnsOnly
Resolve-DnsName example.com -Server 192.0.2.53 -DnsOnly
Resolve-DnsName example.com -Server 1.1.1.1 -DnsOnly
```

**Auswertung**

| Beobachtung | Mögliche Ursache |
|---|---|
| Interner DNS-Server antwortet nicht | DNS-Dienst, Firewall, Routing oder Erreichbarkeit prüfen |
| Externer DNS-Server funktioniert, interner nicht | Problem wahrscheinlich beim internen Resolver |
| Interne Namen funktionieren extern nicht | Normal, wenn die Zone nur intern vorhanden ist |
| Unterschiedliche Antworten verschiedener Resolver | Split-DNS, Cache, Replikationsverzug oder unterschiedliche Zonen |
| `NXDOMAIN` | Name existiert aus Sicht des verwendeten DNS-Servers nicht |
| `SERVFAIL` | DNS-Server konnte die Anfrage nicht erfolgreich verarbeiten |
| Timeout | DNS-Server nicht erreichbar, blockiert oder zu langsam |
| Auflösung funktioniert nur aus dem Cache | Aktuelle DNS-Kommunikation möglicherweise gestört |

> Öffentliche DNS-Server dürfen nicht unüberlegt zum Test interner Namen verwendet werden. Interne Hostnamen, Domänennamen und Strukturen können sensible Informationen darstellen.

</details>

---

<details>
<summary><strong>6. Routing und ausgewählten Netzwerkweg prüfen</strong></summary>

| Aufgabe | PowerShell-Befehl |
|---|---|
| Gesamte Routingtabelle anzeigen | `[RO] Get-NetRoute` |
| IPv4-Routen anzeigen | `[RO] Get-NetRoute -AddressFamily IPv4` |
| IPv6-Routen anzeigen | `[RO] Get-NetRoute -AddressFamily IPv6` |
| Standardroute anzeigen | `[RO] Get-NetRoute -DestinationPrefix "0.0.0.0/0"` |
| Routen nach Metrik sortieren | `[RO] Get-NetRoute -AddressFamily IPv4 \| Sort-Object RouteMetric` |
| Route einer Schnittstelle anzeigen | `[RO] Get-NetRoute -InterfaceAlias "Ethernet"` |
| Wahrscheinlich verwendete Route bestimmen | `[RO] Find-NetRoute -RemoteIPAddress 1.1.1.1` |
| Schnittstellenmetriken anzeigen | `[RO] Get-NetIPInterface -AddressFamily IPv4 \| Sort-Object InterfaceMetric` |
| Routenverfolgung durchführen | `[TEST] Test-NetConnection example.com -TraceRoute` |

**Wichtige Eigenschaften**

| Eigenschaft | Bedeutung |
|---|---|
| `DestinationPrefix` | Zielnetz der Route |
| `NextHop` | Nächster Router beziehungsweise Gateway |
| `InterfaceAlias` | Verwendete Netzwerkschnittstelle |
| `RouteMetric` | Metrik der einzelnen Route |
| `InterfaceMetric` | Metrik der Schnittstelle |
| `Publish` | Gibt an, ob die Route veröffentlicht wird |
| `Protocol` | Herkunft beziehungsweise Routingprotokoll der Route |

**Typische Fehlerbilder**

- Mehrere Standardrouten konkurrieren miteinander.
- Ein VPN installiert eine bevorzugte Route.
- Eine Route verwendet den falschen Adapter.
- Das Standardgateway befindet sich nicht im erwarteten lokalen Netz.
- Eine spezifischere Route überschreibt die allgemeine Standardroute.
- Eine niedrige Metrik führt zu einem unerwarteten Netzwerkweg.

</details>

---

<details>
<summary><strong>7. ARP- und IPv6-Nachbartabelle prüfen</strong></summary>

`Get-NetNeighbor` zeigt bekannte Nachbarn auf direkt angeschlossenen Netzen. Bei IPv4 entspricht dies funktional weitgehend der ARP-Tabelle; bei IPv6 werden Einträge des Neighbor Discovery Protocols angezeigt.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Gesamte Nachbartabelle anzeigen | `[RO] Get-NetNeighbor` |
| IPv4-Nachbarn anzeigen | `[RO] Get-NetNeighbor -AddressFamily IPv4` |
| IPv6-Nachbarn anzeigen | `[RO] Get-NetNeighbor -AddressFamily IPv6` |
| Nachbarn eines Adapters anzeigen | `[RO] Get-NetNeighbor -InterfaceAlias "Ethernet"` |
| Einträge nach Zustand sortieren | `[RO] Get-NetNeighbor \| Sort-Object State, InterfaceAlias` |
| Bestimmte IP-Adresse suchen | `[RO] Get-NetNeighbor -IPAddress 192.0.2.10` |
| Erreichbare Einträge anzeigen | `[RO] Get-NetNeighbor \| Where-Object State -eq "Reachable"` |
| Unvollständige Einträge anzeigen | `[RO] Get-NetNeighbor \| Where-Object State -eq "Incomplete"` |

**Wichtige Zustände**

| Zustand | Bedeutung |
|---|---|
| `Reachable` | Nachbar wurde kürzlich erfolgreich erreicht |
| `Stale` | Eintrag ist vorhanden, wurde aber länger nicht bestätigt |
| `Delay` | Erreichbarkeitsprüfung wird verzögert |
| `Probe` | Aktive Erreichbarkeitsprüfung läuft |
| `Incomplete` | Adressauflösung konnte noch nicht abgeschlossen werden |
| `Permanent` | Statischer beziehungsweise dauerhafter Eintrag |

**Fehlerhinweise**

- `Incomplete` kann auf ein nicht erreichbares Ziel, falsches VLAN, Layer-2-Probleme oder eine falsche IP-Konfiguration hinweisen.
- Wechselnde MAC-Adressen zu derselben IP-Adresse können auf doppelte IP-Adressen, Hochverfügbarkeit oder Sicherheitsprobleme hinweisen.
- Kein Eintrag bedeutet nicht automatisch einen Fehler. Möglicherweise wurde das Ziel noch nicht angesprochen oder befindet sich nicht im lokalen Netz.

</details>

---

<details>
<summary><strong>8. TCP-Verbindungen, offene Ports und Prozesse untersuchen</strong></summary>

`Get-NetTCPConnection` zeigt lokale TCP-Endpunkte und bestehende TCP-Verbindungen.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Alle TCP-Verbindungen anzeigen | `[RO] Get-NetTCPConnection` |
| Lauschende TCP-Ports anzeigen | `[RO] Get-NetTCPConnection -State Listen` |
| Bestehende Verbindungen anzeigen | `[RO] Get-NetTCPConnection -State Established` |
| Verbindungen zu einem Zielport suchen | `[RO] Get-NetTCPConnection -RemotePort 443` |
| Lokalen Port untersuchen | `[RO] Get-NetTCPConnection -LocalPort 443` |
| Nach Zustand gruppieren | `[RO] Get-NetTCPConnection \| Group-Object State` |
| Verbindungen sortiert anzeigen | `[RO] Get-NetTCPConnection \| Sort-Object State, LocalPort` |
| UDP-Endpunkte anzeigen | `[RO] Get-NetUDPEndpoint` |
| Prozess über PID ermitteln | `[RO] Get-Process -Id 1234` |

**Lauschende Ports mit Prozessnamen anzeigen**

```powershell
Get-NetTCPConnection -State Listen |
    Select-Object LocalAddress,
                  LocalPort,
                  OwningProcess,
                  @{
                      Name = "ProcessName"
                      Expression = {
                          (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName
                      }
                  } |
    Sort-Object LocalPort
```

**Bestehende Verbindungen mit Prozessnamen anzeigen**

```powershell
Get-NetTCPConnection -State Established |
    Select-Object LocalAddress,
                  LocalPort,
                  RemoteAddress,
                  RemotePort,
                  OwningProcess,
                  @{
                      Name = "ProcessName"
                      Expression = {
                          (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName
                      }
                  }
```

**Interpretation**

| Beobachtung | Mögliche Bedeutung |
|---|---|
| Erwarteter Port fehlt im Zustand `Listen` | Dienst läuft nicht, lauscht auf anderem Port oder konnte den Port nicht binden |
| Port lauscht nur auf `127.0.0.1` | Dienst ist nur lokal erreichbar |
| Port lauscht auf `0.0.0.0` | Dienst lauscht grundsätzlich auf allen IPv4-Schnittstellen |
| Port lauscht auf `::` | Dienst lauscht grundsätzlich auf IPv6 und möglicherweise abhängig von der Anwendung auch auf IPv4 |
| Viele Verbindungen im Zustand `SYN_SENT` | Ziel, Route, Dienst oder Firewall antwortet möglicherweise nicht |
| Viele Verbindungen im Zustand `TIME_WAIT` | Kann bei vielen kurzlebigen TCP-Verbindungen normal sein |
| Unerwarteter Prozess lauscht auf einem Port | Dienstzuordnung und Sicherheitslage prüfen |

> Eine Verbindung im Zustand `Listen` bestätigt nur, dass lokal ein Prozess auf dem Port wartet. Sie bestätigt nicht, dass der Port aus einem anderen Netz erreichbar ist.

</details>

---

<details>
<summary><strong>9. Windows-Firewall diagnostizieren</strong></summary>

Die Firewall sollte zunächst nur ausgelesen werden. Ein vollständiges Abschalten der Firewall ist kein geeigneter erster Diagnoseschritt.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Firewallprofile anzeigen | `[RO] Get-NetFirewallProfile` |
| Status der Profile kompakt anzeigen | `[RO] Get-NetFirewallProfile \| Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction` |
| Aktivierte Regeln anzeigen | `[RO] Get-NetFirewallRule -Enabled True` |
| Aktivierte Blockierungsregeln anzeigen | `[RO] Get-NetFirewallRule -Enabled True -Action Block` |
| Eingehende Regeln anzeigen | `[RO] Get-NetFirewallRule -Direction Inbound` |
| Regel anhand des Anzeigenamens suchen | `[RO] Get-NetFirewallRule -DisplayName "*Remote Desktop*"` |
| Portfilter anzeigen | `[RO] Get-NetFirewallPortFilter` |
| Regeln für lokalen Port 443 suchen | `[RO] Get-NetFirewallPortFilter \| Where-Object LocalPort -eq 443 \| Get-NetFirewallRule` |
| Regeln für TCP-Port 445 suchen | `[RO] Get-NetFirewallPortFilter \| Where-Object { $_.Protocol -eq "TCP" -and $_.LocalPort -eq 445 } \| Get-NetFirewallRule` |
| Adressfilter einer Regel anzeigen | `[RO] Get-NetFirewallRule -DisplayName "REGELNAME" \| Get-NetFirewallAddressFilter` |
| Portfilter einer Regel anzeigen | `[RO] Get-NetFirewallRule -DisplayName "REGELNAME" \| Get-NetFirewallPortFilter` |
| Anwendungsfilter einer Regel anzeigen | `[RO] Get-NetFirewallRule -DisplayName "REGELNAME" \| Get-NetFirewallApplicationFilter` |

**Warum zeigt `Get-NetFirewallRule` nicht alle Ports und Adressen direkt an?**

Windows speichert Bedingungen wie Ports, Programme und Adressen in zugeordneten Filterobjekten. Deshalb werden für eine vollständige Analyse zusätzlich folgende Cmdlets verwendet:

- `Get-NetFirewallPortFilter`
- `Get-NetFirewallAddressFilter`
- `Get-NetFirewallApplicationFilter`
- `Get-NetFirewallServiceFilter`
- `Get-NetFirewallInterfaceFilter`

**Sinnvolle Prüfreihenfolge**

1. Aktives Netzwerkprofil mit `Get-NetConnectionProfile` feststellen.
2. Firewallstatus des Profils mit `Get-NetFirewallProfile` prüfen.
3. Prüfen, ob der Dienst lokal auf dem erwarteten Port lauscht.
4. Passende eingehende oder ausgehende Regel suchen.
5. Port-, Adress-, Programm- und Profilfilter der Regel prüfen.
6. Verbindung von einem autorisierten Testsystem aus testen.

> Die Firewall nicht pauschal deaktivieren. Dadurch verändert sich die Sicherheitslage und das Testergebnis bildet die ursprüngliche Konfiguration nicht mehr korrekt ab.

</details>

---

<details>
<summary><strong>10. Diagnoseausgaben filtern, vergleichen und exportieren</strong></summary>

PowerShell-Ausgaben bestehen aus Objekten. Die Filterung sollte deshalb möglichst vor der Formatierung erfolgen.

| Aufgabe | PowerShell-Befehl |
|---|---|
| Bestimmte Eigenschaften auswählen | `[RO] Get-NetAdapter \| Select-Object Name, Status, LinkSpeed` |
| Objekte filtern | `[RO] Get-NetAdapter \| Where-Object Status -ne "Up"` |
| Ergebnisse sortieren | `[RO] Get-NetRoute \| Sort-Object RouteMetric` |
| Ergebnisse gruppieren | `[RO] Get-NetTCPConnection \| Group-Object State` |
| Anzahl ermitteln | `[RO] (Get-NetTCPConnection -State Established).Count` |
| Tabellenansicht erzeugen | `[RO] Get-NetAdapter \| Format-Table -AutoSize` |
| Detailansicht erzeugen | `[RO] Get-NetIPConfiguration \| Format-List *` |
| CSV-Datei exportieren | `[RO][FILE][SENS] Get-NetTCPConnection \| Export-Csv -Path ".\tcp-connections.csv" -NoTypeInformation -Encoding UTF8` |
| Objekte vollständig speichern | `[RO][FILE][SENS] Get-NetIPConfiguration -All \| Export-Clixml -Path ".\ip-configuration.xml"` |
| Textprotokoll erzeugen | `[RO][FILE][SENS] Get-NetIPConfiguration -All \| Format-List * \| Out-File ".\ip-configuration.txt" -Encoding utf8` |

**Zwei Messzeitpunkte vergleichen**

```powershell
$Vorher = Get-NetTCPConnection
Start-Sleep -Seconds 10
$Nachher = Get-NetTCPConnection

Compare-Object $Vorher $Nachher -Property State, LocalAddress, LocalPort, RemoteAddress, RemotePort
```

**Hinweise**

- `Where-Object` und `Select-Object` verarbeiten Objekte.
- `Format-Table` und `Format-List` sind für die Darstellung am Ende einer Pipeline gedacht.
- Für eine spätere Weiterverarbeitung sind `Export-Csv` oder `Export-Clixml` geeigneter als formatierter Text.
- Exportdateien können IP-Adressen, DNS-Namen, Prozesskennungen, Verbindungen und interne Netzstrukturen enthalten.
- Diagnoseexporte müssen entsprechend den betrieblichen Datenschutz- und Sicherheitsvorgaben behandelt werden.

</details>

---

<details>
<summary><strong>11. Eingreifende Befehle nur nach der Diagnose verwenden</strong></summary>

Die folgenden Befehle verändern einen Zustand und gehören nicht zur rein lesenden Bestandsaufnahme.

| Maßnahme | PowerShell-Befehl | Auswirkung |
|---|---|---|
| DNS-Clientcache leeren | `[CHANGE][PRIV] Clear-DnsClientCache` | Lokal gespeicherte DNS-Antworten werden entfernt |
| Netzwerkadapter neu starten | `[CHANGE][PRIV][DISRUPT] Restart-NetAdapter -Name "Ethernet"` | Adapter wird deaktiviert und erneut aktiviert |
| DHCP-Lease erneuern | `[CHANGE][PRIV][DISRUPT] ipconfig /release; ipconfig /renew` | Vorhandene DHCP-Adresse wird zunächst freigegeben |
| DNS-Registrierung anfordern | `[CHANGE][PRIV] Register-DnsClient` | Dynamische DNS-Registrierung wird angestoßen |

**Vor einem Eingriff prüfen**

- Besteht eine lokale oder entfernte Administrationsverbindung?
- Wird die eigene Remoteverbindung durch den Eingriff getrennt?
- Ist die aktuelle Konfiguration dokumentiert?
- Ist die Ursache ausreichend eingegrenzt?
- Gibt es einen Rückfallweg oder lokalen Zugriff?
- Sind Auswirkungen auf Benutzer, Dienste, VPN-Verbindungen oder Cluster bekannt?
- Ist ein Wartungsfenster beziehungsweise eine Freigabe erforderlich?

> `Restart-NetAdapter` kann eine Remoteverbindung sofort unterbrechen. Der Befehl darf auf entfernten Produktivsystemen nur mit abgesichertem Rückfallweg verwendet werden.

</details>

---

<details>
<summary><strong>12. Praktische PowerShell-Diagnosereihenfolge</strong></summary>

**Schritt 1 – Adapter prüfen**

```powershell
Get-NetAdapter |
    Select-Object Name, Status, LinkSpeed, MacAddress, ifIndex
```

**Schritt 2 – IP-Konfiguration prüfen**

```powershell
Get-NetIPConfiguration -All
```

**Schritt 3 – Standardroute und DNS-Server prüfen**

```powershell
Get-NetRoute -DestinationPrefix "0.0.0.0/0"
Get-DnsClientServerAddress
```

**Schritt 4 – Lokales Standardgateway testen**

```powershell
Test-NetConnection 192.0.2.1 -InformationLevel Detailed
```

**Schritt 5 – Externe IP-Adresse testen**

```powershell
Test-NetConnection 1.1.1.1 -InformationLevel Detailed
```

**Schritt 6 – DNS-Auflösung testen**

```powershell
Resolve-DnsName example.com -DnsOnly
```

**Schritt 7 – Zielport testen**

```powershell
Test-NetConnection example.com -Port 443 -InformationLevel Detailed
```

**Schritt 8 – Route zum Ziel prüfen**

```powershell
Find-NetRoute -RemoteIPAddress 1.1.1.1
Test-NetConnection example.com -TraceRoute
```

**Schritt 9 – Lokale Ports und Prozesse prüfen**

```powershell
Get-NetTCPConnection -State Listen |
    Sort-Object LocalPort
```

**Schritt 10 – Firewallstatus prüfen**

```powershell
Get-NetFirewallProfile
Get-NetFirewallRule -Enabled True |
    Select-Object DisplayName, Direction, Action, Profile
```

**Diagnoselogik**

| Ergebnis | Nächster Schwerpunkt |
|---|---|
| Adapter nicht aktiv | Kabel, WLAN, Adapter, Treiber oder Port prüfen |
| Keine passende IP-Adresse | DHCP oder statische IP-Konfiguration prüfen |
| Gateway nicht erreichbar | Lokales Netz, VLAN, WLAN, Switch oder Gateway prüfen |
| Externe IP erreichbar, DNS-Name nicht | DNS-Konfiguration und Resolver prüfen |
| Ziel-IP erreichbar, Zielport nicht | Dienst, Portbindung und Firewall prüfen |
| Falscher Adapter oder falsche Quelladresse | Routing, Metrik, VPN und mehrere Adapter prüfen |
| Dienst lauscht lokal, ist extern aber nicht erreichbar | Firewall, NAT, Routing und Dienstbindung prüfen |

</details>

---

**Kurzreferenz**

| Diagnoseziel | Befehl |
|---|---|
| Adapterstatus | `[RO] Get-NetAdapter` |
| Adapterstatistik | `[RO] Get-NetAdapterStatistics` |
| IP-Gesamtübersicht | `[RO] Get-NetIPConfiguration -All` |
| IP-Adressen | `[RO] Get-NetIPAddress` |
| Schnittstellen und Metriken | `[RO] Get-NetIPInterface` |
| Netzwerkprofil | `[RO] Get-NetConnectionProfile` |
| DNS-Server | `[RO] Get-DnsClientServerAddress` |
| DNS-Auflösung | `[TEST] Resolve-DnsName example.com -DnsOnly` |
| DNS-Cache | `[RO] Get-DnsClientCache` |
| Verbindungstest | `[TEST] Test-NetConnection example.com` |
| TCP-Porttest | `[TEST] Test-NetConnection example.com -Port 443` |
| Routenverfolgung | `[TEST] Test-NetConnection example.com -TraceRoute` |
| Routingtabelle | `[RO] Get-NetRoute` |
| Route zu einem Ziel | `[RO] Find-NetRoute -RemoteIPAddress 1.1.1.1` |
| Nachbartabelle | `[RO] Get-NetNeighbor` |
| TCP-Verbindungen | `[RO] Get-NetTCPConnection` |
| UDP-Endpunkte | `[RO] Get-NetUDPEndpoint` |
| Firewallprofile | `[RO] Get-NetFirewallProfile` |
| Firewallregeln | `[RO] Get-NetFirewallRule` |

---

**Merksatz**

> PowerShell-Netzwerkdiagnose bedeutet nicht, möglichst viele Befehle auszuführen. Entscheidend ist, die Ergebnisse als zusammenhängende Beweiskette auszuwerten: Adapter → IP-Konfiguration → Gateway → Route → DNS → Zielport → lokaler Dienst → Firewall.

---

**Quellen**

- [Microsoft Learn – NetAdapter-Modul](https://learn.microsoft.com/powershell/module/netadapter/)
- [Microsoft Learn – NetTCPIP-Modul](https://learn.microsoft.com/powershell/module/nettcpip/)
- [Microsoft Learn – DnsClient-Modul](https://learn.microsoft.com/powershell/module/dnsclient/)
- [Microsoft Learn – NetSecurity-Modul](https://learn.microsoft.com/powershell/module/netsecurity/)
- [Microsoft Learn – Test-NetConnection](https://learn.microsoft.com/powershell/module/nettcpip/test-netconnection)
- [Microsoft Learn – Resolve-DnsName](https://learn.microsoft.com/powershell/module/dnsclient/resolve-dnsname)
- [Microsoft Learn – Windows-Firewall über die Befehlszeile verwalten](https://learn.microsoft.com/windows/security/operating-system-security/network-security/windows-firewall/configure-with-command-line)