PowerShell – IPv4 Range

|

This first function is helpful to provide a range of IPv4 addresses within a set range

function New-IPRange ($start, $end)
    {
        # created by Dr. Tobias Weltner, MVP PowerShell
        $ip1 = ([System.Net.IPAddress]$start).GetAddressBytes()
        [Array]::Reverse($ip1)
        $ip1 = ([System.Net.IPAddress]($ip1 -join '.')).Address
        $ip2 = ([System.Net.IPAddress]$end).GetAddressBytes()
        [Array]::Reverse($ip2)
        $ip2 = ([System.Net.IPAddress]($ip2 -join '.')).Address
 
        for ($x=$ip1; $x -le $ip2; $x++)
            {
                $ip = ([System.Net.IPAddress]$x).GetAddressBytes()
                [Array]::Reverse($ip)
                $ip -join '.'
            }
    }
New-IPRange 192.168.10.10 192.168.10.20
New IP Range
192.168.10.10
192.168.10.11
192.168.10.12
192.168.10.13
192.168.10.14
192.168.10.15
192.168.10.16
192.168.10.17
192.168.10.18
192.168.10.19
192.168.10.20

This next function will get the broadcast IPv4 address from a CIDR range

function Get-Broadcast ($addressAndCidr)
    {
        $addressAndCidr = $addressAndCidr.Split("/")
        $addressInBin = (New-IPv4toBin $addressAndCidr[0]).ToCharArray()
        for($i=0;$i -lt $addressInBin.length;$i++)
            {
                if($i -ge $addressAndCidr[1])
                    {
                        $addressInBin[$i] = "1"
                    } 
            }
        [string[]]$addressInInt32 = @()
        for ($i = 0;$i -lt $addressInBin.length;$i++)
            {
                $partAddressInBin += $addressInBin[$i] 
                if(($i+1)%8 -eq 0)
                    {
                        $partAddressInBin = $partAddressInBin -join ""
                        $addressInInt32 += [Convert]::ToInt32($partAddressInBin -join "",2)
                        $partAddressInBin = ""
                    }
            }
        $addressInInt32 = $addressInInt32 -join "."
        return $addressInInt32
    }
Get-Broadcast 192.168.10.10/27
New IP Range Broadcast
192.168.10.31

Next this function will detect if a specified IPv4 address is in the range

function Test-IPinIPRange ($Address,$Lower,$Mask)
    {
        [Char[]]$a = (New-IPv4toBin $Lower).ToCharArray()
        if($mask -like "*.*")
            {
                [Char[]]$b = (New-IPv4toBin $Mask).ToCharArray()
            }
        else
            {
                [Int[]]$array = (1..32)
                for($i=0;$i -lt $array.length;$i++)
                    {
                        if($array[$i] -gt $mask){$array[$i]="0"}else{$array[$i]="1"}
                    }
                [string]$mask = $array -join ""
                [Char[]]$b = $mask.ToCharArray()
            }
        [Char[]]$c = (New-IPv4toBin $Address).ToCharArray()
        $res = $true
        for($i=0;$i -le $a.length;$i++)
            {
                if($a[$i] -ne $c[$i] -and $b[$i] -ne "0")
                    {
                        $res = $false
                    } 
            }
        return $res
    }
Write-Output "`r`nTest If IP In Range - 192.168.23.128/25"
Test-IPinIPRange "192.168.23.200" "192.168.23.12" "255.255.255.128"
Write-Output "`r`nTest If IP In Range - 192.168.23.127/24"
Test-IPinIPRange "192.168.23.127" "192.168.23.12" "24"
Test If IP In Range - 192.168.23.128/25
False

Test If IP In Range - 192.168.23.127/24
True

This next function will convert an IPv4 address to a Bin

function New-IPv4toBin ($ipv4)
    {
        $BinNum = $ipv4 -split '\.' | ForEach-Object {[System.Convert]::ToString($_,2).PadLeft(8,'0')}
        return $binNum -join ""
    }
Write-Output "`r`nIP To Bin"
New-IPv4toBin 192.168.10.10
IP To Bin
11000000101010000000101000001010

This last function will convert a Bin to an IPv4 address

function New-IPv4fromBin($addressInBin)
    {
        [string[]]$addressInInt32 = @()
        $addressInBin = $addressInBin.ToCharArray()
        for ($i = 0;$i -lt $addressInBin.length;$i++)
            {
                $partAddressInBin += $addressInBin[$i]
                if(($i+1)%8 -eq 0)
                    {
                        $partAddressInBin = $partAddressInBin -join ""
                        $addressInInt32 += [Convert]::ToInt32($partAddressInBin -join "",2)
                        $partAddressInBin = ""
                    }
            }
	    $addressInInt32 = $addressInInt32 -join "."
	    return $addressInInt32
    }
Write-Output "`r`nIP From Bin - 192.168.23.250"
New-IPv4fromBin "11000000101010000001011111111010"

Write-Output "`r`nIP From Bin - 192.168.10.10"
New-IPv4fromBin "11000000101010000000101000001010"
IP From Bin - 192.168.23.250
192.168.23.250

IP From Bin - 192.168.10.10
192.168.10.10
Write-Output "`r`nIP CIDR to Range"
New-IPRange "192.168.23.120" (Get-Broadcast "192.168.23.120/25")
IP CIDR to Range
192.168.23.120
192.168.23.121
192.168.23.122
192.168.23.123
192.168.23.124
192.168.23.125
192.168.23.126
192.168.23.127

References: http://ficility.net/2013/03/16/powershell-example-how-to-work-with-the-ip-addresses-ipv4/

All information on this site is shared with the intention to help. Before any source code or program is ran on a production (non-development) system it is suggested you test it and fully understand what it is doing not just what it appears it is doing. I accept no responsibility for any damage you may do with this code.