1. トップ
  2. 新着ニュース
  3. IT
  4. IT総合

Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法

ASCII.jp / 2024年10月27日 10時0分

Windows Info
デスクトップPCだと搭載されているネットワークアダプタは有線のイーサネットだけのことが多いが、ノートPCだとWi-Fi、さらにモバイルの通信機能があることも

 コンピューターにおけるネットワーク関連のトラブルは随分減った印象があるが、複雑性が解消されたわけでもない。今でもネットワークは、複雑で面倒なものの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つのプロパティがある。

Windows Info

 それぞれ、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を以下の表に示す。

Windows Info

現在インターネット接続に使われている ネットワークアダプタを得るには?

 インターネット接続に利用されているネットワークアダプタには、以下の条件が成立する。

接続プロファイルの「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アドレスの取得やさまざまなコマンドで最初から対象を絞り込むことが可能になる。

この記事に関連するニュース

トピックスRSS

ランキング

記事ミッション中・・・

10秒滞在

記事にリアクションする

記事ミッション中・・・

10秒滞在

記事にリアクションする

デイリー: 参加する
ウィークリー: 参加する
マンスリー: 参加する
10秒滞在

記事にリアクションする

次の記事を探す

エラーが発生しました

ページを再読み込みして
ください