Elegantere Lösung als das hier, action je nach IPadresse

  • Hallo zusammen

    Bis anhin gab es zwei IP Ranges, bei denen ein Variablenwert in der Registry gesetzt wurde.

    [autoit]

    $LeftPartIP=StringLeft(@IPAddress1,12)
    If $LeftPartIP="192.168.100." or $LeftPartIP="192.168.200." Then
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\samplekey", "Remote", "REG_SZ", "ON")
    Else
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\samplekey", "Remote")
    EndIf

    [/autoit]

    Neu soll es ein ganzer Bereich sein, vonm 172.30.0. bis 172.30.15. Mit meinem Skill würde ich jetzt einen 15zeiler draus machen, und bin gespannt - wie man das eleganter lösen könnte. Schleifen etc habe ich schon gemacht, aber wie ich das hier einsetzen könnte - ;(


    Danke für eure Tips ;)

  • Kann ich denn IP Adressen "unbehandelt" hochzählen? Die Punkte dazwischen verhunzen dass doch bestimmt...

    Gut theoretisch müsste ich nur die dritte Zahlengruppe durchgehen :whistling:

  • Beispiel:

    [autoit]

    $LeftPartIP=StringLeft(@IPAddress1,12)
    For $i=0 to 30
    If $LeftPartIP="172.30."&$i&"." Then
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\samplekey", "Remote", "REG_SZ", "ON")
    Else
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\samplekey", "Remote")
    EndIf
    Next

    [/autoit]
  • In der For schlaufe wird aber gar nichts verglichen ;)

    Und dann in eine Zeile pro Möglichkeit - dann wäre ja meine Ursprungsvariante mit

    If $LeftPartIP="192.168.100."

    und 15 Zeilen - ja noch "eleganter" ?? 

    In der Forschleife wird wohl etwas verglichen,in folgender Zeile:

    [autoit]

    If $LeftPartIP="172.30."&$i&"." Then

    [/autoit]
    • Offizieller Beitrag

    Eine Schleife ist gar nicht nötig:

    [autoit]


    $sCheck = StringRegExpReplace(@IPAddress1, '172\.30\.(\d{1,3})\.\d{1,3}', '$1')
    If $sCheck >= 0 And $sCheck < 16 Then
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\samplekey", "Remote", "REG_SZ", "ON")
    Else
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\samplekey", "Remote")
    EndIf

    [/autoit]
  • Ich habe mich mal an einer Bereichsprüfung für IPs versucht. Meine bisherigen Tests waren erfolgreich:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _IPInRange
    ; Description ...: Checks whether an IP is within a given range
    ; Syntax.........: _IPInRange($sIP, $sLow, $sHigh)
    ; Parameters ....: $sIP - the IP to check (IPv4)
    ; $sLow - the lower bound of the range (IPv4)
    ; $sHigh - the upper bound of the range (IPv4)
    ; Return values .: Success - True
    ; Failure - False and set @error
    ; |0 - No error, IP not in range
    ; |1 - $sIP invalid ($sLow and $sHigh not checked yet)
    ; |2 - $sLow invalid ($sHigh not checked yet)
    ; |3 - $sHigh invalid
    ; Author ........: ProgAndy
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _IPInRange($sIP, $sLow, $sHigh)
    ; Author: ProgAndy
    If Not StringRegExp($sIP, "(?:\d{1,3}\.){3}\d{1,3}") Then Return SetError(1,0,False)
    If Not StringRegExp($sLow, "(?:\d{1,3}\.){3}\d{1,3}") Then Return SetError(2,0,False)
    If Not StringRegExp($sHigh, "(?:\d{1,3}\.){3}\d{1,3}") Then Return SetError(3,0,False)
    $sIP = StringSplit($sIP, '.', 1)
    $sLow = StringSplit($sLow, '.', 1)
    $sHigh = StringSplit($sHigh, '.', 1)
    Local Enum Step *2 $LOW, $HIGH
    Local $HL = BitOR($LOW, $HIGH), $iType = $HL, $n, $h, $l
    For $i = 1 To 4
    $n = Int($sIP[$i])
    $h = Int($sHigh[$i])
    $l = Int($sLow[$i])
    Switch $iType
    Case $HL
    If $n < $l Or $n > $h Then
    Return False
    ElseIf $n > $l And $n < $h Then
    Return True
    EndIf
    $iType = 0
    If $n = $l Then $iType = $LOW
    If $n = $h Then $iType = BitOR($iType, $HIGH)
    Case $LOW
    If $n < $l Then Return False
    If $n > $l Then Return True
    $iType = $LOW
    Case $HIGH
    If $n < $h Then Return True
    If $n > $h Then Return False
    $iType = $HIGH
    EndSwitch
    Next
    Return True
    EndFunc

    [/autoit]
  • Ich danke euch! @ Oscar - das nenne ich elegant. Ich hab zwar ein riesen Fragezeichen im Gesicht - und versuche es zu verstehen...

    Argh - dass gibt heftigst verdrehte Gehirnwindungen bei mir ;( ;)