Powershell 如何从子网和网络掩码获取IP地址范围

Powershell 如何从子网和网络掩码获取IP地址范围,powershell,Powershell,团队 我是论坛新手,也是开发新手,我目前正在环境中使用windows 2016、2012和2008服务器。该脚本主要应适用于所有环境。 我想找出IP起始IP地址和结束IP地址 $params = @{ "ComputerName" = "." "Class" = "Win32_NetworkAdapterConfiguration" "Filter" = "IPEnabled=TRUE" } $netConfigs = Get-WMIObject @params foreach (

团队

我是论坛新手,也是开发新手,我目前正在环境中使用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”).地址-频带([IPAddress]“255.255.255.0”).地址)

我目前正在使用2016&我不知道如何进一步在一行代码中获取起始ip地址和结束ip地址。
请告知

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

$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
数组

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

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



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

强制转换第一个ip地址就是网络地址加1,尽管这通常是网关。对于广播地址,我将只指向以下链接:

到达广播地址比到达广播地址要复杂一点 网络地址。对反向子网执行按位Or 面具例如,255.255.255.0的倒装形式为0.0.0.255


谢谢你们,最后的代码。在代码中添加以下行以获取网络范围的开始和结束$networkstart=$NetworkIDBits$networkstart[3]=$networkstart[3]+1$networkstart=$networkstart-join'.$networkend=$BroadcastBits$networkend[3]=$networkend[3]-1$networkend=$networkend-join'.$networkstart$谢谢你的指导,让我了解以上细节。