leex01
Goto Top

Powershell IP

Grüß euch,

viele Powershellscripte sind anscheinend für kleinere Netze designed und verwenden Schleifen die zum Beispiel die IPs 192.168.178.xxx von 0 bis 255 (oder 1 bis 254 ohne Netz und Broadcast IP) durchgehen. Da ich aber auch größere Netze habe (größer als 24er Masken) müsste ich verschachtelte Schleifen verwenden um dann z.B. auf 192.168.179.0 zu kommen. Gibt es da eine elegantere Möglichkeit? PS bietet ja den [ipaddress] Datentyp aber ich habe nichts gefunden was wie ein next oder +1 funktioniert. Oder kennt sich vielleicht jemand so gut aus das er eine Ableitung der Klasse bauen kann die das ermöglicht?

Danke schonmal

Content-ID: 600901

Url: https://administrator.de/forum/powershell-ip-600901.html

Ausgedruckt am: 22.12.2024 um 07:12 Uhr

145033
Lösung 145033 01.09.2020 aktualisiert um 17:28:55 Uhr
Goto Top
function Get-NetworkRange( [String]$IP, [String]$Mask ) {
  if ($IP.Contains("/")) {$t = $IP.Split("/");$IP = $t;$Mask = $t[1]}  
  if (!$Mask.Contains(".")) {  
    $Mask = [Convert]::ToUInt32($(("1" * $Mask).PadRight(32, "0")), 2)  
  }

  $toDecimalIP = {
    param([Net.IPAddress]$ip)
    $i = 3; $decip = 0;
    $ip.GetAddressBytes() | %{ $decip += $_ * [Math]::Pow(256, $i); $i-- }
    return [UInt32]$decip
  }

  $dIP = . $toDecimalIP $IP
  $dMask = . $toDecimalIP $Mask
  
  $Network = $dIP -band $dMask
  $Broadcast = $dIP -bor ((-bnot $dMask) -band [UInt32]::MaxValue)

  for ($i = $($Network + 1); $i -lt $Broadcast; $i++){
        $ip = [UInt32]$i
        [String]::Join('.', $(for ($j = 3; $j -gt -1; $j--) {  
          $Remainder = $ip % [Math]::Pow(256, $j)
          ($ip - $Remainder) / [Math]::Pow(256, $j)
          $ip = $Remainder
         }))
  }
}

# Beispiel
Get-NetworkRange 192.168.1.0/16
emeriks
emeriks 01.09.2020 aktualisiert um 17:35:58 Uhr
Goto Top
Hi,
System.Net.IpAddress hat eine Eigenschaft "Address". Diese ist eine Int64 Zahl. Wenn Du diese hochzählst, dann kannst Du daraus auch wieder eine neuen Adresse bilden.

$A =[System.Net.IpAddress]::Parse("10.10.10.10")  
$B =[System.Net.IpAddress]::Parse($A.Address + 300) 
$A
$B
liefert Dir
10.10.10.10
10.10.11.54

Jetzt musst Du nur noch prüfen, ob das in die Maske passt. (Im selben Subnet ist)

E.

Edit:
siehe hier: https://github.com/omniomi/PSMailTools/blob/v0.2.0/src/Private/spf/IPInR ...
Mit der dort beschrieben Funktion IPInRange kannst Du das prüfen.

IPInRange 10.10.11.54 10.10.10.0/24 --> False
LeeX01
LeeX01 01.09.2020 um 17:36:10 Uhr
Goto Top
Das tut was es soll, merci Kleiber!
LeeX01
LeeX01 01.09.2020 um 17:38:26 Uhr
Goto Top
Danke dafür Emeriks, schau ich mir an, ist auch hilfreich.