PowerShell: Alle IPv4 im lokalen Subnet auflisten

Huhu,

das war jetzt bestimmt das Komplizierteste, was ich in letzter Zeit gemacht hab. Ich hab mir ein PowerShell-Profil mit folgender Funktion angelegt:

function list-all-ipv4 () {
    for($i = 1; $i -le 128; $i++) {
        $ii = "192.168.178." + $i
        if (Test-Connection -ComputerName $ii -Count 1 -Quiet) {
            echo "${ii}:"
            Resolve-DnsName -Name $ii | Where-Object -Property Section -EQ "Answer"
        } else {
            echo "$ii not answering."
        }
    }
}

Die Funktion list-all-ipv4 listet mir alle Geräte auf, die von 1-128 vorhanden sind. Aber das Problem ist, das ist sehr langsam, wenn ein Gerät nicht antwortet, also nicht da ist.

Wisst ihr vielleicht, wie das schneller ginge? Es sind alle Core-PowerShell-Funktionen erlaubt. Könnte man vielleicht einen Timeout hinzufügen?

Und dann noch was, in Zeile 5 hab ich echo "${ii}:" geschrieben - lässt sich „dem Objekt“ vielleicht eine zusätzliche Spalte in der Ausgabe hinzufügen? Hab schon das halbe Netzt abgesucht. :flushed:

Sowas hab ich auch mal gemacht, aber in Java auf Android.

Ich weiss nicht wie die Test-Connection Methode funktioniert, aber ich gehe mal ganz stark davon aus sie wird das ähnlich machen wie ich über ein TCP Handshake. Sprich die funkt mal über TCP eine Adresse an und wartet ob jemand den Handshake durchführt (Gerät ist da) oder niemand antwortet (Timeout). D.h. man wird in jedem Fall den Timeout abwarten müssen der genügend groß sein muss. So ein Apple Gerät kann sich schon mal gemütliche 30-40 Sekunden Zeit nehmen.

Mögliche Lösung: Die Test Connection Methode asynchron ausführen. Dafür gibt es bei Powershell mehrere Möglichkeiten. Die einfachste ist per „Start-Job“ und dann einfach alle 128 Adressen parallel testen.

1 Like

Danke, ja wahrscheinlich ist es noch nicht das Gelbe vom Ei…

Aber es funktioniert wenigstens einigermaßen gut. Wahrscheinlich wird Test-Connection so etwas wie einen komplexen Ping durchführen. Morgen mal schauen, ob ich’s auch parallelisieren kann.

Vergesse leider immer die IP und den Netzwerknamen von meine Raspberry Pi. :wink: