PowerShellでIPアドレス情報を取得し、特定のサブネットに所属しているか確認する方法で重要なのは、実行例を増やすことより、対象と戻し方を先に確定することです。結論は「192.168.1.*のような文字列比較は/24でしか通用せず、/23や/27を誤判定します。Get-NetIPAddressで対象interfaceを選び、IPとnetwork addressを整数化してmaskとのbit積を比較します。」。ここではIPv4 CIDRを例にし、文字列prefix比較ではなくaddressとmaskのbit積で判定する条件を前提に、2026年7月17日時点の公式仕様から、現場で再現できる判断順を組み立てます。
入力をIPv4とprefix 0〜32へ限定する
Get-NetIPAddressとbit mask計算の入力、出力、変更有無を一文で書き、host、user、current directory、実行時刻を添えます。address変換は同じPowerShell版でfixtureを通し、candidate adapterを広げる前に境界prefixを確認します。
- Get-NetIPAddressでAddressFamily、PrefixOrigin、SuffixOrigin、InterfaceIndexを確認する
- Get-NetAdapterでUp状態とinterface aliasを照合する
- 対象CIDRのnetwork addressとprefix lengthを正規化する
- loopback、APIPA、virtual、VPN addressを除外する条件を決める
network byteをUInt32へ変換する
端末のIPv4を列挙
Get-NetIPAddress -AddressFamily IPv4 | Where-Object AddressState -eq 'Preferred' |
Select-Object InterfaceAlias,InterfaceIndex,IPAddress,PrefixLength,PrefixOrigin
Preferredだけでもvirtual adapterは含まれます。InterfaceIndexとGet-NetAdapter Statusを照合します。
IPv4をUInt32へ変換
function ConvertTo-UInt32Ip([ipaddress]$Address){
$bytes=$Address.GetAddressBytes(); [array]::Reverse($bytes); [BitConverter]::ToUInt32($bytes,0)
}
ConvertTo-UInt32Ip ([ipaddress]'192.168.10.25')
IPv4専用です。IPv6を同じ32bit関数へ渡さずAddressFamilyを検証します。
CIDR membershipを判定
function Test-IPv4Cidr([ipaddress]$Ip,[ipaddress]$Network,[int]$Prefix){
if($Ip.AddressFamily -ne 'InterNetwork' -or $Network.AddressFamily -ne 'InterNetwork' -or $Prefix -lt 0 -or $Prefix -gt 32){throw 'IPv4 prefix must be 0..32'}
$mask=if($Prefix -eq 0){[uint32]0}else{[uint32]([uint32]::MaxValue -shl (32-$Prefix))}
((ConvertTo-UInt32Ip $Ip)-band $mask) -eq ((ConvertTo-UInt32Ip $Network)-band $mask)
}
Test-IPv4Cidr ([ipaddress]'192.168.10.25') ([ipaddress]'192.168.10.0') 24
network側もmaskして比較します。prefix 0と32はshift境界を含むためproduction関数では0..32を検証してtestします。
adapterごとに結果を出す
$candidates=Get-NetIPAddress -AddressFamily IPv4 | Where-Object AddressState -eq 'Preferred'
$candidates | Select-Object InterfaceAlias,IPAddress,PrefixLength
まず候補を表示し、どのinterfaceを業務接続とみなすかを人間が確認します。
routeも照合
Get-NetRoute -AddressFamily IPv4 | Sort-Object RouteMetric |
Select-Object -First 20 DestinationPrefix,NextHop,InterfaceIndex,RouteMetric
addressがsubnet内でも、そのrouteが実際に選ばれる保証はありません。route tableと接続testを別に確認します。
/0と/32を分岐してmaskを作る
CIDRはnetwork addressとprefix lengthで範囲を表し、decimal文字列の先頭一致ではありません。端末は複数addressを持つため「このPCが所属」はどのinterfaceと通信経路を対象にするか定義が必要です。Get-NetIPAddressのPrefixLengthはlocal interfaceのprefixであり、確認したい任意CIDRのprefixとは別です。route選択はlongest prefixとmetric等も関わります。
Preferred addressをadapter単位で列挙する
列挙と計算は読み取りです。New-NetIPAddressやSet-NetIPInterfaceで検証中にaddressを変えるとremote接続を失うため行いません。network変更が必要なら現在のIP、prefix、gateway、DNS、DHCP状態とout-of-band接続を記録し、戻しcommandを準備します。誤設定時は元のstatic値または正しいDHCP構成へ復元し、route、DNS、業務endpointを順に確認します。
subnet membershipとroute選択を分ける
- 192.168.1.*でCIDR判定する
- network addressをmaskせず比較する
- byte orderを誤る
- virtual/VPN adapterを現用とみなす
- subnet所属とroute到達性を同一視する
IPv6とscope IDを別実装へ切り離す
/24だけでなく/23、/27、境界のnetwork/broadcast近傍、範囲外、prefix 0/32をunit testします。ipconfig /all、Get-NetIPAddress、Get-NetRouteをInterfaceIndexで突合し、Test-NetConnectionは承認済みendpointだけへ実施します。address設定が前後で変わっていないことも確認します。
PowerShellでIPがsubnetに属するか確認を定期化するなら、正常件数、警告境界、停止条件を数値化します。
network端・broadcast相当・境界prefixを検収する
IPv4をnetwork byte orderのUInt32へ変換し、prefix 0はmask 0、1〜32は左shift、32は全bit 1として明示分岐します。IPとnetworkへ同じmaskを適用した値が等しければTrueで、prefix範囲外やIPv6は例外として拒否します。
UInt32 maskで二つのIPv4を比較する
member・nonmember・invalid inputを分ける
- CIDR内:/24等でnetwork内はTrue、直前/直後addressはFalseになり、route情報とも矛盾しない
- CIDR外:/0は全IPv4をTrue、/32は指定一addressだけTrueになる
- address・prefix error:prefix -1/33、IPv6、parse不能はboolean Falseへ丸めずvalidation errorにする
[uint32]::MaxValue -shl (32-$prefix)だけではprefix 0のshift数が丸められ、意図しないmaskになります。文字列prefix比較やsigned integer変換も避け、adapter addressとnetwork addressを混同しません。
/0・/32・範囲外prefixを試す
0,32 | ForEach-Object { $p=$_; [pscustomobject]@{Prefix=$p;Match=Test-IPv4Cidr ([ipaddress]'203.0.113.7') ([ipaddress]'203.0.113.7') $p;Other=Test-IPv4Cidr ([ipaddress]'198.51.100.2') ([ipaddress]'203.0.113.7') $p} }
prefix 0/1/24/31/32、network/broadcast相当、範囲外、IPv6をtestします。input、network、prefix、mask hex、masked値、boolean、routeのDestinationPrefixを表にします。
CIDR内であることと、そのrouteが実際に選ばれることは別です。membership結果の後にGet-NetRouteを照合し、IPv6を同じUInt32関数へ渡さないよう入口で拒否します。

コメント