Skript basteln -> alle IP-Adressen im Netz finden u. mit Datum in .csv speichern

Hexxxer76

Commodore
Registriert
Juni 2010
Beiträge
4.601
Hallo liebe Gemeinde,

ich bin dabei ein Skript zu basteln das mir alle IP-Adressen (192.168.161.0) im Netz anzeigt u. diese mit Datum in eine .csv Datei abspeichert.
Das was ich programmiert habe funktioniert nicht so richtig. Das muss doch einfacher zu programmieren sein.
CSV hab ich noch nicht reingebastelt.

Denke ich zu kompliziert? Vielen Dank. Grüße vom Hexxxer

Code:
$i =1
$Ip = "192.168.161.0"
$ipsamling = @()
Write-Host "IP 192.168.161.0 - 192.168.161.254"
Write-Host "----------------------------------------"
do { $Ip4th = $Ip + $i
$Pingy = get-WmiObject Win32_PingStatus -f "Address='$Ip4th'"
if($Pingy.StatusCode -eq 0) {
"{0,0} {1,5} {2,5}" -f
$Pingy.Address, $Pingy.StatusCode," ON NETWORK"
$ipsamling += $Pingy.Address
}
else
{"{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, "ip"
}
$i++
}
until ($i -eq 254)

echo "Kontakt til:"
echo $ipsamling
 
Was meinst du denn mit "funktioniert nicht so richtig"?

Ich kenne mich leider nicht mit PowerShell oder was das ist aus, aber als erstes würde ich dir raten den Code so zu formatieren, dass er gut lesbar ist.

Zeile 6 kommt mir komisch vor - kann man einfach $Ip und $i addieren? Oder ist das eine Konkatenation? Dann kommen doch sicher falsche Sachen raus wie 192.168.161.0115 wenn du bei 115 bist?
 
  • Gefällt mir
Reaktionen: Hexxxer76
Danke für deine Antwort. Japp is PowerShell.

Diesen Adressbereich (IP 192.168.161.0 - 192.168.161.254) möchte ich auslesen inkl. Datum und in csv abspeichern.
 
Ping mag keine überflüssigen Nullen. Wenn du zB 192.168.1.011 anpingst, macht ping tatsächlich 192.168.1.9 daraus, weil 011 als octal interpretiert wird, also 1*8 + 1*1 = 9.

Du musst in deinem Skript also darauf achten, dass der counter als Zahl ohne führende Nullen hochgezählt wird und dann kannst du ihn auf die Subnetzadresse draufrechnen bzw. im Falle eines /24er Subnetzes einfach anhängen (ohne das letzte .0 Tupel der Subnetzadresse).
 
  • Gefällt mir
Reaktionen: GTrash81, Hexxxer76 und aMMo
Ping ist kein Garant für irgendwas, erst in Verbindung mit Arp wird ein Schuh draus.
 
  • Gefällt mir
Reaktionen: TorenAltair, BFF, Piktogramm und 3 andere
aMMo schrieb:
Was meinst du denn mit "funktioniert nicht so richtig"?

Ich kenne mich leider nicht mit PowerShell oder was das ist aus, aber als erstes würde ich dir raten den Code so zu formatieren, dass er gut lesbar ist.

Zeile 6 kommt mir komisch vor - kann man einfach $Ip und $i addieren? Oder ist das eine Konkatenation? Dann kommen doch sicher falsche Sachen raus wie 192.168.161.0115 wenn du bei 115 bist?
Vielen Dank für dein Antwort.
Diesen Bereich muss ich rausnehmen?

Code:
}
else
{"{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, "ip"
}
 
Ich verstehe ja ungefähr das Ansinnen des Unterfangens. @Hexxxer76

Allerdings solltest Du auch dran denken das ein z.B. W10 nicht auf ping antwortet.
 
  • Gefällt mir
Reaktionen: Kalsarikännit, GTrash81 und Hexxxer76
Du musst in jedem Fall in Zeile 2:

$Ip = "192.168.161.0"

ändern zu

$Ip = "192.168.161."

Damit die Konkatenierung keine führende 0 im letzten Päckchen hat. Sonst passiert das, was Raijin sagte und du pingst ganz woanders hin, als du eigentlich willst.
 
  • Gefällt mir
Reaktionen: Hexxxer76
Soll das eigentlich nur eine Fingerübung sein? Ansonsten gibt es für solche Zwecke natürlich schon zahlreiche fertige Tools zum runterladen. Von angry ip bis hin zu nmap for Windows. Insbesondere letzteres unterstützt eine Vielzahl von Scan-Techniken, die nicht nur klassische ICMP Echo Requests aka Pings abschiclen.
 
  • Gefällt mir
Reaktionen: Azghul0815 und Hexxxer76
Raijin schrieb:
Soll das eigentlich nur eine Fingerübung sein? Ansonsten gibt es für solche Zwecke natürlich schon zahlreiche fertige Tools zum runterladen. Von angry ip bis hin zu nmap for Windows. Insbesondere letzteres unterstützt eine Vielzahl von Scan-Techniken, die nicht nur klassische ICMP Echo Requests aka Pings abschiclen.
Das soll für die Arbeit sein! Wenn es funktioniert.
Ergänzung ()

aMMo schrieb:
Du musst in jedem Fall in Zeile 2:

$Ip = "192.168.161.0"

ändern zu

$Ip = "192.168.161."

Damit die Konkatenierung keine führende 0 im letzten Päckchen hat. Sonst passiert das, was Raijin sagte und du pingst ganz woanders hin, als du eigentlich willst.

Code:
$i = 0
$Ip = "192.168.161."
$ipsamling = @()
$csvFile = "ip_addresses.csv"  # Specify your CSV file here

# Create a CSV file with headers
"IP Address,Status,Date" | Out-File -FilePath $csvFile -Append

Write-Host "IP 192.168.161.0 - 192.168.161.254"
Write-Host "----------------------------------------"

do {
    $Ip4th = $Ip + $i
    $Pingy = Get-WmiObject Win32_PingStatus -f "Address='$Ip4th'"
    $date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    if ($Pingy.StatusCode -eq 0) {
        "{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, " ON NETWORK"
        $ipsamling += $Pingy.Address
        # Append data to the CSV file
        "$($Pingy.Address),$($Pingy.StatusCode),$($date)" | Out-File -FilePath $csvFile -Append
    } else {
        "{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, "ip"
    }
    $i++
}
until ($i -eq 254)

echo "Kontakt til:"
echo $ipsamling
Ergänzung ()

Das muss doch in 2,3,4 Zeilen möglich sein?
 
Weil das die Aufgabe ist. Wurde mir übertragen......
Ergänzung ()

Code:
$i = 0
$Ip = "192.168.161."
$ipsamling = @()
$csvFile = "ip_addresses.csv"  # Specify your CSV file here

# Create a CSV file with headers
"IP Address,Status,Date" | Out-File -FilePath $csvFile -Append

Write-Host "IP 192.168.161.0 - 192.168.161.254"
Write-Host "----------------------------------------"

do {
    $Ip4th = $Ip + $i
    $Pingy = Get-WmiObject Win32_PingStatus -f "Address='$Ip4th'"
    $date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    if ($Pingy.StatusCode -eq 0) {
        "{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, " ON NETWORK"
        $ipsamling += $Pingy.Address
        # Append data to the CSV file
        "$($Pingy.Address),$($Pingy.StatusCode),$($date)" | Out-File -FilePath $csvFile -Append
    } else {
        "{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, "ip"
    }
    $i++
}
until ($i -eq 254)

echo "Kontakt til:"
echo $ipsamling

Get-NetworkConfig | export-csv | Out-File E:\testen.csv
Get-WmiObject -Class Win32_Product -ComputerName . | Format-Wide -Column 1  | ConvertTo-Csv | Out-File E:\testen.csv
 
Zuletzt bearbeitet:
Dann beschreib mal kurz ohne Geheimnisse zu verraten was da in den Netzen rum schwirrt. @Hexxxer76

Per Script mit ping ist für mich das absolut untauglichste was gibt. Warum steht weiter oben.

Und vergiss, meine spontane Idee, dass ihr damit unberechtigt angeploppte Geräte findet. Dafür gibt es andere Methoden.
 
  • Gefällt mir
Reaktionen: Hexxxer76
Nähere Infos habe ich vom Abteilungsleiter nicht erfahren.
Es soll sich um diverse Clients, Desktop-PCs, Drucker sowie Applikationsserver usw. handeln.
 
@Hexxxer76
Also dein Chef hat zu dir gesagt: "Schreibe das selbst und nutze auf keinen Fall bestehende Tools" ?

IP scanner gibt es en masse zum freien Download. Zwei habe ich oben genannt, weitere findet man bei google. Der Output muss ggfs noch geparst und in das gewünschte Format gebracht werden (nmap macht zB kein direktes csv, aber andere Formate)

Wie dem auch sei.. Wieso benutzt du in deinem Skript eine Do-Until-Schleife mit manuellem Zähler anstelle einer dafür vorgesehenen For-Schleife? while und do nutzt man dann, wenn die Anzahl der Iterationen nicht absehbar ist. For-Schleifen sind für eine feste Anzahl wie zB 254.

Man könnte meinen, dass beides auf dasselbe hinausläuft, aber hinter den Kulissen macht das einen Unterschied. Der ist bei einem kleinen Skript zugegebenermaßen nicht ausschlaggebend, aber wenn man sich in sowas reinlernt, sollte man es gleich richtig machen.

Abgesehen davon machst du wie mir scheint jedes Mal ein Append an die CSV-Datei. Das heißt, dass diese Datei bei jedem Aufruf um einen neuen Header samt Daten erweitert wird. Normalerweise überschreibt man die Outputdatei in solchen Szenarien, wenn man den Header reinschreibt (oder löscht sie zu Beginn des Skripts), weil du ja nur an den aktuellen Ergebnissen interessiert bist.
 
  • Gefällt mir
Reaktionen: Hexxxer76
Code:
Get-NetNeighbor -AddressFamily IPv4 | ConvertTo-Csv -NoTypeInformation >> foobar.csv

Braucht etwas Feinschliff damit nicht alle, nicht notwendigen Eigenschaften übernommen werden und noch das Datum dazu geschrieben wird.

Edit2: Oar, das liest nur den ARP Cache, dann Broadcastping und den in ne CSV gießen oder danach ARP Table lesen

Edit:
Code:
 $date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Ich habe ja grundlegend eine extreme Abneigung, wenn nicht ohne explizite Begründung etwas anderes als Unixtime oder ein anderes Integer Zeitformat verwendet wird!
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Hexxxer76
@Raijin Mit den gänigen Tools ist es einfach, aber er möchte ein Skript. :pcangry:
 

Ähnliche Themen

M
Antworten
16
Aufrufe
2.411
m5space
M
Zurück
Oben