PowerShell:将IP地址转换为子网

时间:2018-07-12 02:36:00

标签: powershell networking ip

我能够使用ff提取计算机的主机IP地址:

$IPAddr = Get-NetIPConfiguration -InterfaceAlias "Ethernet" | select IPv4Address 

如何根据其子网掩码(例如/24/20/16等)获取对应的子网地址?

因此,如果主机IP地址为192.168.100.45,并且子网掩码为/24255.255.255.0,则代码应获得192.168.100.0的子网地址值。

2 个答案:

答案 0 :(得分:1)

您可以使用IPAddress类。示例:

[IPAddress] (([IPAddress] "192.168.100.45").Address -band ([IPAddress] "255.255.255.0").Address)

这将输出一个包含IP地址IPAddress的{​​{1}}对象。

要将位计数转换为等效的位掩码字符串,可以使用以下功能:

192.168.100.0

使用此功能,您可以编写:

function ConvertTo-IPv4MaskString {
  param(
    [Parameter(Mandatory = $true)]
    [ValidateRange(0, 32)]
    [Int] $MaskBits
  )
  $mask = ([Math]::Pow(2, $MaskBits) - 1) * [Math]::Pow(2, (32 - $MaskBits))
  $bytes = [BitConverter]::GetBytes([UInt32] $mask)
  (($bytes.Count - 1)..0 | ForEach-Object { [String] $bytes[$_] }) -join "."
}

这将输出一个包含IP地址[IPAddress] (([IPAddress] "192.168.100.45").Address -band ([IPAddress] (ConvertTo-IPv4MaskString 24)).Address) 的{​​{1}}对象。

其他一些功能可能会有用:

IPAddress

192.168.100.0function Test-IPv4MaskString { param( [Parameter(Mandatory = $true)] [String] $MaskString ) $validBytes = '0|128|192|224|240|248|252|254|255' $MaskString -match ` ('^((({0})\.0\.0\.0)|' -f $validBytes) + ('(255\.({0})\.0\.0)|' -f $validBytes) + ('(255\.255\.({0})\.0)|' -f $validBytes) + ('(255\.255\.255\.({0})))$' -f $validBytes) } function ConvertTo-IPv4MaskBits { param( [parameter(Mandatory = $true)] [ValidateScript({Test-IPv4MaskString $_})] [String] $MaskString ) $mask = ([IPAddress] $MaskString).Address for ( $bitCount = 0; $mask -ne 0; $bitCount++ ) { $mask = $mask -band ($mask - 1) } $bitCount } 的倒数,并使用ConvertTo-IPv4MaskBits来验证掩码是否为有效的IPv4掩码。

我前一段时间写的一篇文章中提供了更多细节:

IT Pro Today - Working with IPv4 Addresses in PowerShell

答案 1 :(得分:0)

Microsoft的IP地址实现非常慢,不幸的是,它们还将八位字节值的顺序错误。对于所有与IP相关的计算,我决定更好地使用自己的功能。这是我的代码段:

function ipNr($s) {
    [byte[]]$ip = $s.Split(".")
    [array]::Reverse($ip)
    [bitconverter]::ToUInt32($ip,0)
}

function ipString($n) {
    $ip = [bitconverter]::GetBytes($n)
    [array]::Reverse($ip)
    [string]::Join(".", $ip)
}

function maskNr($b) {
    (1 -shl $b)-1 -shl (32-$b)
}

$ip = "192.168.100.45"
$prefixLength = 24
$subnetId = ipString ((ipNr $ip) -band (maskNr $prefixLength)) 
write-host "$subnetId/$prefixLength"