powershell - 如何从子网和网络掩码获取 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 地址。请指教
解决方案
您可以执行以下操作来获取网络和广播地址:
$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[]]
推荐阅读
- jhipster - 对于 Jhipster Monolith 应用程序,有状态方法比无状态方法有什么好处?
- vue.js - 编码时如何在浏览器中查看不同的页面(Vue)?
- c# - unity3d如何消除惯性
- postgresql - 如果我删除了 heroku 表,我以后可以使用 Heroku 备份恢复数据库吗?
- javascript - 使用 id 或其他属性而不是名称来反应复选框状态
- gradle - gradle gradlew flyway 执行多个任务,一个带有stacktrace
- android - 甚至在第二个活动完成之前立即回到主要活动
- ruby - 如何使用回车键退出ruby中的while循环
- json - 在flutter中从web获取所有json数据
- c# - 如何忽略 .GET 上的对象属性但在 .POST 上允许它?