# Subnet Math functions # # Author: Chris Dent # Date: 23/01/2010 # How to run these: # Either: Copy and Paste everything here into the PowerShell Prompt # Or: Save this as .ps1. # Run: # . .\Net-SubnetMath.ps1 # . C:\WhereverYouPutIt\Net-SubnetMath.ps1 # # The leading dot makes these available in the current shell # rather than just the script. See Dot Source in: # http://technet.microsoft.com/en-us/library/ee176949.aspx # # Usage examples are at the bottom of this file Function ConvertTo-BinaryIP( [String]$IP ) { $IPAddress = [Net.IPAddress]::Parse($IP) Return [String]::Join('.', $( $IPAddress.GetAddressBytes() | %{ [Convert]::ToString($_, 2).PadLeft(8, '0') } )) } Function ConvertTo-DecimalIP( [String]$IP ) { $IPAddress = [Net.IPAddress]::Parse($IP) $i = 3; $DecimalIP = 0; $IPAddress.GetAddressBytes() | %{ $DecimalIP += $_ * [Math]::Pow(256, $i); $i-- } Return [UInt32]$DecimalIP } Function ConvertTo-DottedDecimalIP( [String]$IP ) { Switch -RegEx ($IP) { "([01]{8}\.){3}[01]{8}" { Return [String]::Join('.', $( $IP.Split('.') | %{ [Convert]::ToInt32($_, 2) } )) } "\d" { $IP = [UInt32]$IP $DottedIP = $( For ($i = 3; $i -gt -1; $i--) { $Remainder = $IP % [Math]::Pow(256, $i) ($IP - $Remainder) / [Math]::Pow(256, $i) $IP = $Remainder } ) Return [String]::Join('.', $DottedIP) } default { Write-Error "Cannot convert this format" } } } Function ConvertTo-MaskLength( [String]$Mask ) { $IPMask = [Net.IPAddress]::Parse($Mask) $Bits = "$( $IPMask.GetAddressBytes() | %{ [Convert]::ToString($_, 2) } )" -Replace "[\s0]" Return $Bits.Length } Function ConvertTo-Mask( [Byte]$MaskLength ) { Return ConvertTo-DottedDecimalIP ([Convert]::ToUInt32( $(("1" * $MaskLength).PadRight(32, "0")), 2)) } Function Get-NetworkAddress( [String]$IP, [String]$Mask ) { Return ConvertTo-DottedDecimalIP $( (ConvertTo-DecimalIP $IP) -BAnd (ConvertTo-DecimalIP $Mask)) } Function Get-BroadcastAddress( [String]$IP, [String]$Mask ) { Return ConvertTo-DottedDecimalIP $( (ConvertTo-DecimalIP $IP) -BOr ((-BNot (ConvertTo-DecimalIP $Mask)) -BAnd [UInt32]::MaxValue)) } Function Get-NetworkInfo( [String]$IP, [String]$Mask ) { If ($IP.Contains("/")) { $Temp = $IP.Split("/") $IP = $Temp[0] $Mask = $Temp[1] } If (!$Mask.Contains(".")) { $Mask = ConvertTo-Mask $Mask } $DecimalIP = ConvertTo-DecimalIP $IP $DecimalMask = ConvertTo-DecimalIP $Mask $Network = $DecimalIP -BAnd $DecimalMask $Broadcast = $DecimalIP -BOr ((-BNot $DecimalMask) -BAnd [UInt32]::MaxValue) $NetworkAddress = ConvertTo-DottedDecimalIP $Network $RangeStart = ConvertTo-DottedDecimalIP ($Network + 1) $RangeEnd = ConvertTo-DottedDecimalIP ($Broadcast - 1) $BroadcastAddress = ConvertTo-DottedDecimalIP $Broadcast $MaskLength = ConvertTo-MaskLength $Mask $BinaryIP = ConvertTo-BinaryIP $IP; $Private = $False Switch -RegEx ($BinaryIP) { "^1111" { $Class = "E"; $SubnetBitMap = "1111" } "^1110" { $Class = "D"; $SubnetBitMap = "1110" } "^110" { $Class = "C" If ($BinaryIP -Match "^11000000.10101000") { $Private = $True } } "^10" { $Class = "B" If ($BinaryIP -Match "^10101100.0001") { $Private = $True } } "^0" { $Class = "A" If ($BinaryIP -Match "^00001010") { $Private = $True } } } $NetInfo = New-Object Object Add-Member NoteProperty "Network" -Input $NetInfo -Value $NetworkAddress Add-Member NoteProperty "Broadcast" -Input $NetInfo -Value $BroadcastAddress Add-Member NoteProperty "Range" -Input $NetInfo ` -Value "$RangeStart - $RangeEnd" Add-Member NoteProperty "Mask" -Input $NetInfo -Value $Mask Add-Member NoteProperty "MaskLength" -Input $NetInfo -Value $MaskLength Add-Member NoteProperty "Hosts" -Input $NetInfo ` -Value $($Broadcast - $Network - 1) Add-Member NoteProperty "Class" -Input $NetInfo -Value $Class Add-Member NoteProperty "IsPrivate" -Input $NetInfo -Value $Private Return $NetInfo } Function Get-NetworkRange( [String]$IP, [String]$Mask ) { If ($IP.Contains("/")) { $Temp = $IP.Split("/") $IP = $Temp[0] $Mask = $Temp[1] } If (!$Mask.Contains(".")) { $Mask = ConvertTo-Mask $Mask } $DecimalIP = ConvertTo-DecimalIP $IP $DecimalMask = ConvertTo-DecimalIP $Mask $Network = $DecimalIP -BAnd $DecimalMask $Broadcast = $DecimalIP -BOr ((-BNot $DecimalMask) -BAnd [UInt32]::MaxValue) For ($i = $($Network + 1); $i -lt $Broadcast; $i++) { ConvertTo-DottedDecimalIP $i } } # # Examples # Function RunExample( $Expression ) { Write-Host "Running: $Expression" -ForegroundColor Green Invoke-Expression $Expression } RunExample "ConvertTo-BinaryIP 192.168.1.1" RunExample "ConvertTo-DecimalIP 192.168.1.1" RunExample "ConvertTo-DottedDecimalIP 11000000.10101000.00000001.00000001" RunExample "ConvertTo-DottedDecimalIP 3232235777" RunExample "ConvertTo-MaskLength 255.255.128.0" RunExample "ConvertTo-Mask 17" RunExample "Get-NetworkAddress 192.168.1.1 255.255.255.0" RunExample "Get-BroadcastAddress 192.168.1.1 255.255.255.0" RunExample "Get-NetworkInfo 229.168.1.1 255.255.248.0" RunExample "Get-NetworkInfo 172.16.1.243 18" RunExample "Get-NetworkInfo 10.0.0.3/14" RunExample "Get-NetworkRange 192.168.1.5 255.255.255.248" RunExample "Get-NetworkRange 172.18.0.23 30" RunExample "Get-NetworkRange 172.18.0.23/29"