首页 > 解决方案 > 如何从子网和网络掩码获取 IP 地址范围

问题描述

团队,

我是论坛的新手,也是开发新手,我目前在环境中使用 Windows 2016、2012 和 2008 服务器。该脚本主要应适用于所有环境。我想找出IP起始IP地址和结束IP地址。

$params = @{
  "ComputerName" = "."
  "Class" = "Win32_NetworkAdapterConfiguration"
  "Filter" = "IPEnabled=TRUE"
}
$netConfigs = Get-WMIObject @params
foreach ( $netConfig in $netConfigs ) {
  for ( $i = 0; $i -lt $netConfig.IPAddress.Count; $i++ ) {
    if ( $netConfig.IPAddress[$i] -match '(\d{1,3}\.){3}\d{1,3}' ) {
  $ipString = $netConfig.IPAddress[$i]
  $ip = [IPAddress] $ipString
  $maskString = $netConfig.IPSubnet[$i]
  $mask = [IPAddress] $maskString
  $netID = [IPAddress] ($ip.Address -band $mask.Address)
  "IP address: {0}" -f $ip.IPAddressToString
  "Subnet mask: {0}" -f $mask.IPAddressToString
  "Network ID: {0}" -f $netID.IPAddressToString
    }
  }
}

将 IP 地址转换为子网 [IPAddress] (([IPAddress] "192.168.100.45").Address -band ([IPAddress] "255.255.255.0").Address)

我目前正在使用 2016 并且我不知道如何进一步在一行代码中获取起始 IP 地址和结束 IP 地址。请指教

标签: powershell

解决方案


您可以执行以下操作来获取网络和广播地址:

$IP = '192.168.4.5'
$mask = '255.255.0.0'
$IPBits = [int[]]$IP.Split('.')
$MaskBits = [int[]]$Mask.Split('.')
$NetworkIDBits = 0..3 | Foreach-Object { $IPBits[$_] -band $MaskBits[$_] }
$BroadcastBits = 0..3 | Foreach-Object { $NetworkIDBits[$_] + ($MaskBits[$_] -bxor 255) }
$NetworkID = $NetworkIDBits -join '.'
$Broadcast = $BroadcastBits -join '.'

# Output
$NetworkID
192.168.0.0
$Broadcast
192.168.255.255

解释:

由于位运算符(请参阅关于算术运算符)仅在整数类型上受支持,因此您必须进行字符串到整数的转换才能成功使用运算符[1]

IP 和掩码在.字符上拆分,创建一个由八位字节组成的两个字符串数组。[int[]]强制转换将数组转换为数组Int32

对于网络地址,我们-band对每个数组的相同索引执行(按位与)。由于 IP 有四个八位字节,我们只需要在0..3范围内循环。由字符连接的结果Int32数组 ( $NetworkIDBits) 项.,以 IP 地址格式放置结果。

对于广播地址,我们-bxor用 255 对从掩码派生的整数数组执行(按位异或)。目标是翻转掩码中的所有 1 和 0。结果将是每个八位字节的增量值,可以添加到网络地址的八位字节中。最终的计算结果使用-join.


[1]:您并不总是需要将字符串显式转换为整数以进行转换。在某些情况下,PowerShell 可以自动执行此操作。例如,在我的外壳中,我不必使用[int[]]


推荐阅读