none
Ip Dns Übereinstimmung RRS feed

  • Frage

  • Ich brauche ein Script, daß Ip Adressen auf ihre Konsistenz prüft. Folgendes habe ich bereits:

    $ip_address= "beliebige adresse"
    $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
    $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
    echo $ip_address "-----" $dns_name "----" $ip_address2`n`n
    if ($ip_address -eq $ip_address2){
    echo "übereinstimmung"`n`n`n
    }
    else
    {echo "$ip_adress ist nicht konsistent"}

    Nun soll ja nicht nur eine Adresse sondern alle verfügbaren geprüft werden. Dazu will ich eine for schleife einsetzen, die sie durch geht, etwa in der art:

    for ($i = 2; $i -le 254; $i ++) {
    for ($j =2; $j -le 254; $j ++) {echo $i"."$j}}
    }

    also werden meine Ip adressen aus z.B. 165.65. und dann die Elemente aus der for Schleife bestehen. Und schließlich eine foreach Schleife, die jedes element aus der for Schleife mit dem Oberen Scriptteil durchgeht. Leider hab ich nicht die geringste Ahnung wie ich das realisieren soll. Ob ich die for Schleife in eine Variable schreiben kann, oder ob ich irgendwie mit einer Function was tun muss. Brauche dringend Hilfe dabei, da ich ein ziemliche Anfänger in Sachen scripten und Powershell bin.

    Dienstag, 23. August 2011 09:53

Antworten

  • Zufällig ja. :) (Erklärungen im Code):


    # Pfad + Filename für Logfile
    $logfile = "d:\test.txt" 
    
    # Teste ob Logfile existiert, wenn nicht..
    if (!([system.io.file]::exists($logfile))){
    
     # erstelle Logfile 
     new-item $logfile -type "File"
     
    }
    
    for ($i = 2; $i -le 254; $i ++) {
     for ($j =2; $j -le 254; $j ++) {
     $ip_address = "165.65." + $i + "."+ $j
     
     $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
     $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
     
     # Erstelle Textzeile
     if ($ip_address -eq $ip_address2){ $logtext = "Übereinstimmung: $ip_address $dns_name $ip_address2"}
     else { $logtext = "Inkonsistent: $ip_address $dns_name $ip_address2"}
     
     #Bildschirmausgabe
     write-host $logtext
     
     # Füge Textzeile zum Logfile hinzu
     add-content $logfile $logtext
     }
    }
    
    


    Abgesehen davon: abhängig davon wie viele von diesen IP's wirklich existent sind wird dieses Skript eine kleine Ewigkeit laufen (du machst immerhin etwa 127.000 DNS Abfragen).

    Wenn es dir nur darum geht, die A-records mit den PTR-records zu vergleichen, würde ich mal überlegen ob es nicht sinvoller ist die DNS-Zonen in eine Textdatei zu exportieren und dann zu vergleichen. Was den export betrifft, findet Google/Bing da einige Beispielskripte.

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    • Als Antwort markiert Kosak1985 Donnerstag, 25. August 2011 12:41
    Mittwoch, 24. August 2011 13:10
    Moderator
  • Du hast es ja im Prinzip schon. Du must nur noch die IP zusammenbauen und den Code von oben einfügen:

     

    for ($i = 2; $i -le 254; $i ++) {
     for ($j =2; $j -le 254; $j ++) {
      $ip_address = "165.65." + $i + "."+ $j
     
     $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
     $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
     echo $ip_address "-----" $dns_name "----" $ip_address2`n`n
      if ($ip_address -eq $ip_address2){ echo "übereinstimmung"`n`n`n }
     else {echo "$ip_adress ist nicht konsistent"}
     }
    }
    

    Grüße, Denniver

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    • Als Antwort markiert Kosak1985 Dienstag, 23. August 2011 14:17
    • Tag als Antwort aufgehoben Kosak1985 Mittwoch, 24. August 2011 08:44
    • Als Antwort markiert Kosak1985 Donnerstag, 25. August 2011 12:41
    Dienstag, 23. August 2011 12:41
    Moderator
  • >Gibt es eine Möglichkeit die Ip Addressen rauszufiltern bei denen noch gar kein Name gesetzt ist, also die noch nicht vergeben sind?

    Ich nehme an du hast gemerkt das bei nicht vorhandenen Einträgen die Antwort mehrere Sekunden braucht? :) Nach meinen Schätzungen dauert die Abfrage aller deiner Adressen -wenn etwa 60% vorhanden sind- ungefähr 6 Tage, in denen du rund um die Uhr deinen DNS mit Abfragen bombardierst.

    Ich würde ja nochmal über die Export-Variante nachdenken...

    Was deine Frage betrifft: Ausfiltern im Sinne von Überspringen: Jain. Wenn die erste Abfrage nicht erfolgreich war kannst du zumindest die zweite überspringen.Die Antwort der ersten DNS-Abfrage auf eine vorhandene IP-Adresse ist der Hostname. Bei einer nicht vorhandenen IP kommt kein Fehler, sondern diese IP als Antwort zurück. Daher musst du einfach diese Antwort überprüfen:

    for ($i = 2; $i -le 254; $i ++) {
    for ($j =2; $j -le 254; $j ++) {
    $ip_address = "165.65." + $i + "."+ $j

    $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
    if ($dns_name -eq $ip_address){ write-host "Kein Eintrag für $ip_address" }
    else {
    $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
    if ($ip_address -eq $ip_address2){ echo "Übereinstimmung: $ip_address ----- $dns_name ---- $ip_address2"}
    else {echo "Inkonsistent: $ip_address ----- $dns_name ---- $ip_address2"}
    }
    }
    }


    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Donnerstag, 1. September 2011 13:37
    Moderator

Alle Antworten

  • Du hast es ja im Prinzip schon. Du must nur noch die IP zusammenbauen und den Code von oben einfügen:

     

    for ($i = 2; $i -le 254; $i ++) {
     for ($j =2; $j -le 254; $j ++) {
      $ip_address = "165.65." + $i + "."+ $j
     
     $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
     $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
     echo $ip_address "-----" $dns_name "----" $ip_address2`n`n
      if ($ip_address -eq $ip_address2){ echo "übereinstimmung"`n`n`n }
     else {echo "$ip_adress ist nicht konsistent"}
     }
    }
    

    Grüße, Denniver

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    • Als Antwort markiert Kosak1985 Dienstag, 23. August 2011 14:17
    • Tag als Antwort aufgehoben Kosak1985 Mittwoch, 24. August 2011 08:44
    • Als Antwort markiert Kosak1985 Donnerstag, 25. August 2011 12:41
    Dienstag, 23. August 2011 12:41
    Moderator
  • Danke dir, ich dachte ich muß die einzelnen Elemente noch mit einer foreach Schleife durchgehen, aber jetzt seh ich auch, daß es komplett unnötig ist.
    Dienstag, 23. August 2011 14:17
  • Weißt du zufällig auch wie ich die ausgabe formatieren kann? Im moment schreibt er mir alles untereinander und ich hätte gerne die erste ip adresse, den dns namen und die 2 ip adresse nebeneinander. Und wie kann ich die Ausgabe in z.B. eine Textdatei umleiten?
    Mittwoch, 24. August 2011 08:43
  • Zufällig ja. :) (Erklärungen im Code):


    # Pfad + Filename für Logfile
    $logfile = "d:\test.txt" 
    
    # Teste ob Logfile existiert, wenn nicht..
    if (!([system.io.file]::exists($logfile))){
    
     # erstelle Logfile 
     new-item $logfile -type "File"
     
    }
    
    for ($i = 2; $i -le 254; $i ++) {
     for ($j =2; $j -le 254; $j ++) {
     $ip_address = "165.65." + $i + "."+ $j
     
     $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
     $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
     
     # Erstelle Textzeile
     if ($ip_address -eq $ip_address2){ $logtext = "Übereinstimmung: $ip_address $dns_name $ip_address2"}
     else { $logtext = "Inkonsistent: $ip_address $dns_name $ip_address2"}
     
     #Bildschirmausgabe
     write-host $logtext
     
     # Füge Textzeile zum Logfile hinzu
     add-content $logfile $logtext
     }
    }
    
    


    Abgesehen davon: abhängig davon wie viele von diesen IP's wirklich existent sind wird dieses Skript eine kleine Ewigkeit laufen (du machst immerhin etwa 127.000 DNS Abfragen).

    Wenn es dir nur darum geht, die A-records mit den PTR-records zu vergleichen, würde ich mal überlegen ob es nicht sinvoller ist die DNS-Zonen in eine Textdatei zu exportieren und dann zu vergleichen. Was den export betrifft, findet Google/Bing da einige Beispielskripte.

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    • Als Antwort markiert Kosak1985 Donnerstag, 25. August 2011 12:41
    Mittwoch, 24. August 2011 13:10
    Moderator
  • Gibt es eine Möglichkeit die Ip Addressen rauszufiltern bei denen noch gar kein Name gesetzt ist, also die noch nicht vergeben sind? Bei diesem Script unterscheidet Powershell bisher nicht zwischen nicht vorhandenen Namen und veralteten Namen. In beiden Fällen kommt der Fehler das der angegebene Host unbekannt ist.
    Mittwoch, 31. August 2011 10:17
  • >Gibt es eine Möglichkeit die Ip Addressen rauszufiltern bei denen noch gar kein Name gesetzt ist, also die noch nicht vergeben sind?

    Ich nehme an du hast gemerkt das bei nicht vorhandenen Einträgen die Antwort mehrere Sekunden braucht? :) Nach meinen Schätzungen dauert die Abfrage aller deiner Adressen -wenn etwa 60% vorhanden sind- ungefähr 6 Tage, in denen du rund um die Uhr deinen DNS mit Abfragen bombardierst.

    Ich würde ja nochmal über die Export-Variante nachdenken...

    Was deine Frage betrifft: Ausfiltern im Sinne von Überspringen: Jain. Wenn die erste Abfrage nicht erfolgreich war kannst du zumindest die zweite überspringen.Die Antwort der ersten DNS-Abfrage auf eine vorhandene IP-Adresse ist der Hostname. Bei einer nicht vorhandenen IP kommt kein Fehler, sondern diese IP als Antwort zurück. Daher musst du einfach diese Antwort überprüfen:

    for ($i = 2; $i -le 254; $i ++) {
    for ($j =2; $j -le 254; $j ++) {
    $ip_address = "165.65." + $i + "."+ $j

    $dns_name= [Net.Dns]::GetHostEntry($ip_address).HostName
    if ($dns_name -eq $ip_address){ write-host "Kein Eintrag für $ip_address" }
    else {
    $ip_address2= [Net.Dns]::GetHostEntry($dns_name).AddressList[0].IPAddressToString
    if ($ip_address -eq $ip_address2){ echo "Übereinstimmung: $ip_address ----- $dns_name ---- $ip_address2"}
    else {echo "Inkonsistent: $ip_address ----- $dns_name ---- $ip_address2"}
    }
    }
    }


    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Donnerstag, 1. September 2011 13:37
    Moderator
  • Ich habe mir jetzt die Dns Zonenliste exportiert, so daß sie mir local vorliegt. Nun müsste ich sie ja Zeile für Zeile auslesen und die Zeilen rausfiltern die nicht die A Records enthalten. Die Liste ist so aufgebaut, daß bei den A Records an erster Stelle der Name steht, dann mehrere blanks, dann IN, blanks, A, blanks und schließlich die IP Adresse. Nun bin ich mir nicht sicher wie ich das Filtern und das Auslesen des Namens und der IP Adresse zum späteren Vergleich bewerkstelligen soll. Wär sehr dankbar für nen Programmansatz, da ich dabei irgendwie auf dem Schlauch stehe.
    Dienstag, 13. September 2011 08:37