Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法
ASCII.jp / 2024年10月27日 10時0分
コンピューターにおけるネットワーク関連のトラブルは随分減った印象があるが、複雑性が解消されたわけでもない。今でもネットワークは、複雑で面倒なものの1つだろう。
今のWindowsでは「設定」→「ネットワークとインターネット」で、稼働中のネットワークインターフェース(ネットワークアダプタ)だけを単純化して見せているが、ifconfig.exeコマンドを使うと大量のネットワークアダプタが表示される。
ここには仮想環境のネットワークドライバや、Windows Updateのときに新規登録がされ、使われなくなったネットワークアダプタなどが表示されている。
今回は、ネットワークアダプタがどのように選択されるかについて解説する。インターネット接続が標準的になってから、主となるネットワークアダプタはインターネット接続が可能なものだ。また、現在のWindowsでは、標準では複数のネットワークアダプタを併用せず、できる限り1つのネットワークアダプタだけを使うようになっている。
ネットワークアダプタの情報を得るには?
ユーザーが単に確認するだけなら、前述の「設定」→「ネットワークとインターネット」のほか、コントロールパネルの「ネットワークと共有センター」を使う。また、コマンドラインからなら「ipconfig.exe」が利用できる。
適当なアダプタ(Wi-Fi、イーサネット、携帯電話)を選択することで、Windowsが利用している「インターネット接続」に使われるネットワークを見つけることができる。
現在では、インターネットに接続しているかどうかが、ネットワークアダプタの最も重要な状態である。逆に言えば、インターネット接続に使えないネットワークアダプタは個々に使い道があったとしても、Windowsやユーザーにとっては「重要」なネットワークアダプタではない。
PowerShellでは、「Get-NetAdapter」コマンド(https://learn.microsoft.com/en-us/powershell/module/netadapter/get-netadapter?view=windowsserver2022-ps)で、現在Windowsが認識しているネットワークアダプタの一覧を得ることができる。ただし、実行させてみると、大量のネットワークアダプタが表示されることがある。
この中から、正しいものを選ぶ必要があるのだが、それには、別の情報を使う必要がある。1つは、アダプタが現在接続しているネットワークとその状態を示す「接続プロファイル」だ。これは、無線LANの接続先などとして、コントロールパネルの「ネットワークと共有センター」で「ネットワーク」として表示されていたもの。この接続プロファイルには、IPv4/IPv6個別にインターネット接続状態が記録されている。
接続プロファイルを取得するには、「Get-NetConnectionProfile」コマンド(https://learn.microsoft.com/en-us/powershell/module/netconnection/get-netconnectionprofile?view=windowsserver2022-ps)を使う。単純に実行すれば、現在稼働中のネットワークが接続しているネットワークのプロファイルを表示する(正確には、CIMのMSFT_NetConnectionProfileオブジェクト)。
ここには、「IPv6Connectivity」と「IPv4Connectivity」の2つのプロパティがある。
それぞれ、IPv6、IPv4でのインターネット接続状態を示す。現状では、IPv4でインターネットに接続できてもIPv6を利用できないネットワークが存在するため、両者を個別で調べる必要がある。
もう1つは、Windows接続マネージャー(WCM。Windows Connection Manager)だ。WCMは、複数の有効なネットワークがあるとき、その中から適切なものを選択する機能を持つ。WCMの資料(https://learn.microsoft.com/ja-jp/windows-hardware/drivers/mobilebroadband/understanding-and-configuring-windows-connection-manager)によれば、Windowsは以下の優先順位でネットワークアダプタを選択する。
イーサネット 無線LAN 携帯電話(モバイルブロードバンド)
また、WCMは、インターネット接続に使うネットワークアダプタを1つに絞る。これにより、複数のネットワークアダプタがあっても、適切なものが1つだけ選ばれるようになっている。ポリシーにより挙動を変更することは可能だが、WCMはGUIを持たず、現在の設定値を得るためであっても、プログラムを書く必要がある。
ネットワークの種類は、前述のGet-NetAdapterでは、MediaTypeプロパティで示される。MediaTypeは、NDISMediumプロパティ(数値)を文字列に変換したスクリプトプロパティである。MediaTypeとNDISMediumを以下の表に示す。
現在インターネット接続に使われている ネットワークアダプタを得るには?
インターネット接続に利用されているネットワークアダプタには、以下の条件が成立する。
接続プロファイルの「IPv6Connectivity」と「IPv4Connectivity」のどちらかが“Internet” アダプタのVirtualがfalse(-Physicalオプションで指定可能) アダプタのStatusが"Up"
まず、接続プロファイルのプロパティから、対応するIfIndexを得る。IfIndexは、インターフェースインデックスともいい、Windowsでネットワークアダプタを特定するものの1つ。具体的には、
$InetIfIdx=(Get-NetConnectionProfile | ? {$_.IPv4Connectivity -eq "Internet" -or $_.IPv6Connectivity -eq "Internet").InterfaceIndex
とすると、インターネット接続が可能なネットワークに接続しているネットワークアダプタのIfIdx(配列)が得られる。
「アダプタのVirtualがfalse」とは、アダプタが仮想デバイスではなく、物理デバイスであることを示す。これは、「Get-NetAdapter -Physical」で取り出すことが可能。「アダプタのStatusが"Up"」という条件を課すと、
$myNet=Get-NetAdapter -Physical | ? status -eq "Up" | ? $_.ifIndex -in $InetIfIdx}
となる。ここで、$myNetに記録されているネットワークアダプタが1つしかなければ、それが現在インターネット接続に使われているメインのネットワークアダプタとなる。候補となるネットワークアダプタの数は、
$myNet.Count
で調べることができる。これが2以上であれば、さらに絞り込む必要がある。
複数のネットワークアダプタが残ったとき、いくつかの可能性がある。1つは複数の「イーサネット」ネットワークアダプタが接続されいる場合、もう1つは、PCに携帯電話ネットワーク接続機能があり、すでにネットワークに接続している場合である。この場合には、Wi-Fiがメインになっている可能性もある。
さらに絞り込むには、WCMの優先順位を使う。「イーサネット」があれば、それを選択、なければ「無線LAN」、さらになければ「携帯電話」と絞り込んでいく。ただし、それぞれのネットワークアダプタが複数存在する可能性を考慮する必要がある。
WCMでは同種のMediaTypeの場合、高速なものが選択されるという。このため、100MbpsのFastイーサネットよりもギガビットイーサネットが優先される。この速度はLinkSpeedプロパティとして表示されるが、こちらは人間が読みやすいようにSI接頭辞を使ったbps表示で比較が面倒だが、Speedプロパティには、bps単位のリンク速度(あくまでも仕様上の速度)が入っているので、これでソートする。
$myNet = $myNet | ? MediaType -eq "802.3" | sort speed -Descending
これでも複数のイーサネットアダプタが残る場合、先頭のものを選択すると、少なくとも2つ目以降よりもspeedプロパティが大きい、または同じものになる。ただ、同種のイーサネットアダプタが複数インターネット接続する状況は、よほど特殊な環境でもない限り考えられないため、実用上、ここまで追求すればいいだろう。
最後に、if文を使ったスクリプトを示す。このままコマンドラインとして実行することも、スクリプトや関数の一部にすることも可能である。
$InetIfIdx=(Get-NetConnectionProfile | ? IPv6Connectivity -eq Internet).InterfaceIndex ; $tempMyNet=Get-NetAdapter -Physical | where-object {$_.status -eq "Up" -and $_.ifIndex -in $InetIfIdx} ; $mynet = $tempMyNet if ($tempMyNet.Count -gt 1 ){ $mynet = $tempMyNet | ? MediaType -eq "802.3" | sort-object speed -Descending ; if($mynet.count -gt 1) { $mynet = $mynet[0]; } elseif ($mynet -eq 0) { $mynet = $tempMyNet[0] } } $mynet
一般的なネットワーク接続であれば、これでネットワークアダプタを1つに絞り込めるはずだ。メインとなるネットワークアダプタが分かれば、そのインターフェース・インデックスを使うことで、IPアドレスの取得やさまざまなコマンドで最初から対象を絞り込むことが可能になる。
この記事に関連するニュース
ランキング
-
1“主人公キャラのいない”ローグライクシューターが早期アクセス開始!AIとなって敵同士を戦わせ道を拓く―採れたて!本日のSteam注目ゲーム11選【2024年11月21日】
Game*Spark / 2024年11月21日 22時30分
-
2「スンスンが餌食に」 販売から“全店舗3分で完売”→高額転売で「怒りが込み上げる」 スシロー×人気キャラコラボが物議
ねとらぼ / 2024年11月21日 19時2分
-
3ダイソーの“フィギュアに最適”なアイテムが330万表示 驚きの高品質に「めっちゃいいやん……!」「価格バグってるw」
ねとらぼ / 2024年11月21日 20時0分
-
4川で拾った普通の石ころ→磨いたら……? まさかの“正体”にびっくり「間違いなく価値がある」「別の惑星を見ているよう」【米】
ねとらぼ / 2024年11月22日 7時30分
-
5Anker製品「最大56%オフ」 Amazon ブラックフライデーで 割引率と製品数は2023年よりもアップ
ITmedia Mobile / 2024年11月22日 7時10分
記事ミッション中・・・
記事にリアクションする
記事ミッション中・・・
記事にリアクションする
エラーが発生しました
ページを再読み込みして
ください