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-Key: 600901

Url: https://administrator.de/contentid/600901

Printed on: April 25, 2024 at 07:04 o'clock

Mitglied: 145033
Solution 145033 Sep 01, 2020 updated at 15:28:55 (UTC)
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
Member: emeriks
emeriks Sep 01, 2020 updated at 15:35:58 (UTC)
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
Member: LeeX01
LeeX01 Sep 01, 2020 at 15:36:10 (UTC)
Goto Top
Das tut was es soll, merci Kleiber!
Member: LeeX01
LeeX01 Sep 01, 2020 at 15:38:26 (UTC)
Goto Top
Danke dafür Emeriks, schau ich mir an, ist auch hilfreich.