PowerShellでIPアドレス情報を取得し、特定のサブネットに所属しているか確認する方法

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関数へ渡さないよう入口で拒否します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次