NetworkCalculations.psm1
function ConvertTo-BinaryIP { [CmdLetBinding()] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [Net.IPAddress]$IPAddress ) process { return [String]::Join('.', $( $IPAddress.GetAddressBytes() | ForEach-Object { [Convert]::ToString($_, 2).PadLeft(8, '0') } )) } } function ConvertTo-DecimalIP { [CmdLetBinding()] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [Net.IPAddress]$IPAddress ) process { $i = 3; $DecimalIP = 0; $IPAddress.GetAddressBytes() | ForEach-Object { $DecimalIP += $_ * [Math]::Pow(256, $i); $i-- } return [UInt32]$DecimalIP } } function ConvertTo-DottedDecimalIP { [CmdLetBinding()] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [String]$IPAddress ) process { Switch -RegEx ($IPAddress) { "([01]{8}.){3}[01]{8}" { return [String]::Join('.', $( $IPAddress.Split('.') | ForEach-Object { [Convert]::ToUInt32($_, 2) } )) } "\d" { $IPAddress = [UInt32]$IPAddress $DottedIP = $( For ($i = 3; $i -gt -1; $i--) { $Remainder = $IPAddress % [Math]::Pow(256, $i) ($IPAddress - $Remainder) / [Math]::Pow(256, $i) $IPAddress = $Remainder } ) return [String]::Join('.', $DottedIP) } default { Write-Error "Cannot convert this format" } } } } function ConvertTo-MaskLength { [CmdLetBinding()] param( [Parameter(Mandatory = $True, Position = 0, ValueFromPipeline = $True)] [Alias("Mask")] [Net.IPAddress]$SubnetMask ) process { $Bits = "$( $SubnetMask.GetAddressBytes() | ForEach-Object { [Convert]::ToString($_, 2) } )" -replace '[\s0]' return $Bits.Length } } function ConvertTo-Mask { [CmdLetBinding()] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [Alias("Length")] [ValidateRange(0, 32)] $MaskLength ) Process { return ConvertTo-DottedDecimalIP ([Convert]::ToUInt32($(("1" * $MaskLength).PadRight(32, "0")), 2)) } } function Get-NetworkAddress { [CmdLetBinding()] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [Net.IPAddress]$IPAddress, [Parameter(Mandatory = $true, Position = 1)] [Alias("Mask")] [Net.IPAddress]$SubnetMask ) process { return ConvertTo-DottedDecimalIP ((ConvertTo-DecimalIP $IPAddress) -band (ConvertTo-DecimalIP $SubnetMask)) } } function Get-BroadcastAddress { [CmdLetBinding()] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [Net.IPAddress]$IPAddress, [Parameter(Mandatory = $true, Position = 1)] [Alias("Mask")] [Net.IPAddress]$SubnetMask ) process { return ConvertTo-DottedDecimalIP $((ConvertTo-DecimalIP $IPAddress) -bor ` ((-bnot (ConvertTo-DecimalIP $SubnetMask)) -band [UInt32]::MaxValue)) } } function Get-NetworkSummary ( [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"; break } "^1110" { $Class = "D"; $SubnetBitMap = "1110"; break } "^110" { $Class = "C" if ($BinaryIP -match "^11000000.10101000") { $Private = $true } break } "^10" { $Class = "B" if ($BinaryIP -match "^10101100.0001") { $Private = $true } break } "^0" { $Class = "A" if ($BinaryIP -match "^0000101") { $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 } } function ConvertTo-CIDR { [CmdletBinding()] Param ( # The network IP address [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, ValueFromRemainingArguments=$false, Position=0)] [ValidateNotNull()] [ValidateNotNullOrEmpty()] [string] $IP, # The network subnet mask [Parameter()] [string] $Mask ) Begin { } Process { # Get the summary of the network $Summary = Get-NetworkSummary -IP $IP -Mask $Mask # Construct the CIDR $CIDR = $Summary.Network + '/' + $Summary.MaskLength # Write to the output $CIDR } End { } } function ConvertFrom-CIDR { [CmdletBinding()] Param ( # The network IP address [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, ValueFromRemainingArguments=$false, Position=0)] [ValidateNotNull()] [ValidateNotNullOrEmpty()] [string] $CIDR ) Begin { } Process { # Split the CIDR $parts = $CIDR.Split('/') # Get the network part $network = $parts[0] # Get the network mask length $maskLength = $parts[1] # Get the subnet mask $mask = ConvertTo-Mask -MaskLength $maskLength # Create the a custom object New-Object -TypeName PSObject -Property @{ CIDR = $CIDR; Network = $network; SubnetMaskLength = $maskLength; SubnetMask = $mask} } End { } } |