プログラムを作成するときに、理解しておかねばならない点の1つに、ユーザーがGUIなどで取得する情報と、プログラムが入手する情報の違いがある。どんなに簡単なことであっても、コードを書かなければ、その情報をプログラム内で使うことができない。
最初に使ったコンピュータがすでにGUIだったユーザーには、少し理解しにくいかもしれない。

たとえば、マシンのインターネット接続に使うIPアドレスは、設定アプリ ⇒ ネットワークとインターネットのページで、一番上に表示されるネットワークアダプタのプロパティを見ればよい(写真01)。しかし、ここを見て情報を得ることができるのは人間(ユーザー)であって、あなたが作るプログラムはこのページを開くことはできても、そこから情報を取得することは不可能に近い。

プログラムからは、Windowsが用意するAPI(Application Program Interface。Windowsの機能をプログラムから呼び出す仕組み)や、プログラミング言語が用意する機能を使う必要がある。ここでは、インターネット接続に使われるIPアドレスをプログラムで入手する方法を、PowerShell Ver.7.xを使って実際にやってみる。

こうしたコードを書くには、それなりの知識と調査期間が必要である。もちろん、簡単に得られる情報もあるが、何か手がかりを得なければ、正しい方法にたどり着かないこともある。ここでは、インターネットで使われるTCP/IPやIPアドレスに関しての知識があることを前提に話を進めていく。

IPアドレスを知るための「とっかかり」になるのは、Windowsの接続プロファイル(Connection Profile)だ。Windowsは、ネットワークアダプタ(インターフェース)に接続しているネットワークに関する情報を、接続プロファイルとして記録する。ここに、IPv4/IPv6でのインターネット接続状態、ネットワークアダプタを特定するための情報である、インターフェースインデックス(アダプタを指定するための整数値)などがある。
PowerShellでは、「Get-NetConnectionProfile」コマンドで、現在のプロファイル、つまりインターネット接続しているネットワークの接続プロファイルを入手できる。ただし、インターネット接続しているかどうかは確認する必要がある。そのためには、接続プロファイルの中の「IPv4Connectivity」、「IPv6Connectivity」が"Internet"になっているかどうかを調べる。具体的には、以下のコマンドを使う。

Get-NetConnectionProfile | ? {$_.IPv4Connectivity -eq "Internet" -or $_.IPv6Connectivity -eq "Internet"};

得られるのは、「MSFT_NetConnectionProfile」というCIMのクラス。上記のコマンド出力を「Get-Member」や「Select-Object *」コマンドで、表示させるとプロパティなどを見ることができる。接続プロファイルは、イーサーネット(有線)、無線LAN、携帯電話の接続方法ごとに作られる。それぞれの接続プロファイルには、接続に使うネットワークアダプタのインターフェースインデックス値が、「InterfaceIndex」プロパティに記録されている。必要になるのは、この値である。

インターフェースインデックス値を使うと、対応するネットワークアダプタの情報を得ることができる。得られたインターフェースインデックス値の中には、仮想マシンのものなどが含まれている可能性があるため、ネットワークアダプタのプロパティを使い、必要なものだけを残すようにする。それには、前記のコマンドを含めて、以下の2つのコマンドを使う。


$InetIfIdx=(Get-NetConnectionProfile | ? {$_.IPv4Connectivity -eq "Internet" -or $_.IPv6Connectivity -eq "Internet"}).InterfaceIndex ;
$myNet=Get-NetAdapter -Physical | where-object {$_.status -eq "Up" -and $_.ifIndex -in $InetIfIdx} | sort NdisMedium, @{Expr={$_.Speed}; Desc=$true} ;

これで変数$myNetに、インターネット接続しているネットワークアダプタの情報(複数の可能性あり)が入った。この変数は、アダプタの種類(イーサネットやWi-Fi)ごとに、転送速度の速い順に並べてある。

接続可能な複数のネットワークインターフェースがある場合、Windowsでは、接続マネージャー(Windows Connection Manager。WCM)が、「有線」(802.3)、「無線LAN」(Native 802.11)、「携帯電話」(Wireless WAN)の順で、インターネット接続用のネットワークアダプタを1つ選択する(表01)。

イーサーネット接続のIPアドレスを得るには、

$mynet | ? MediaType -like "*802.3*" | %{ Get-NetIPConfiguration -ifIndex $_.IfIndex[0] } ;

と、MediaTypeプロパティで「802.3」を選択して、Get-NetIPConfigurationでIPアドレス情報を得る(写真02)。これで、プログラムは、インターネット接続に使われるIPアドレスを、NetIPConfigurationオブジェクトから得ることができる。

今回のタイトルネタは、「大工と鬼六」という話。長い間、日本の民話だと思われてきたが、実は、海外の伝説を翻案して、児童読み聞かせの童話として国内に導入されたものだった(「大工と鬼六」の出自をめぐって 櫻井 美紀)。主人公は、子守歌を聴いて鬼の本当の名前を知る。IPアドレスの取得も、正しい方法を考えつくことは難しく、手がかりがどうしても必要になる。
編集部おすすめ