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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 600901
Url: https://administrator.de/contentid/600901
Ausgedruckt am: 21.11.2024 um 23:11 Uhr
4 Kommentare
Neuester Kommentar
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
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.
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
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
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