我能够使用ff提取计算机的主机IP地址:
$IPAddr = Get-NetIPConfiguration -InterfaceAlias "Ethernet" | select IPv4Address
如何根据其子网掩码(例如/24
,/20
,/16
等)获取对应的子网地址?
因此,如果主机IP地址为192.168.100.45
,并且子网掩码为/24
或255.255.255.0
,则代码应获得192.168.100.0
的子网地址值。
答案 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.0
是function 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掩码。
我前一段时间写的一篇文章中提供了更多细节:
答案 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"