プログラムを作成するときに、理解しておかねばならない点の1つに、ユーザーがGUIなどで取得する情報と、プログラムが入手する情報の違いがある。どんなに簡単なことであっても、コードを書かなければ、その情報をプログラム内で使うことができない。
たとえば、マシンのインターネット接続に使うIPアドレスは、設定アプリ ⇒ ネットワークとインターネットのページで、一番上に表示されるネットワークアダプタのプロパティを見ればよい(写真01)。しかし、ここを見て情報を得ることができるのは人間(ユーザー)であって、あなたが作るプログラムはこのページを開くことはできても、そこから情報を取得することは不可能に近い。
プログラムからは、Windowsが用意するAPI(Application Program Interface。Windowsの機能をプログラムから呼び出す仕組み)や、プログラミング言語が用意する機能を使う必要がある。ここでは、インターネット接続に使われるIPアドレスをプログラムで入手する方法を、PowerShell Ver.7.xを使って実際にやってみる。
こうしたコードを書くには、それなりの知識と調査期間が必要である。もちろん、簡単に得られる情報もあるが、何か手がかりを得なければ、正しい方法にたどり着かないこともある。ここでは、インターネットで使われるTCP/IPやIPアドレスに関しての知識があることを前提に話を進めていく。
IPアドレスを知るための「とっかかり」になるのは、Windowsの接続プロファイル(Connection Profile)だ。Windowsは、ネットワークアダプタ(インターフェース)に接続しているネットワークに関する情報を、接続プロファイルとして記録する。ここに、IPv4/IPv6でのインターネット接続状態、ネットワークアダプタを特定するための情報である、インターフェースインデックス(アダプタを指定するための整数値)などがある。
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アドレスの取得も、正しい方法を考えつくことは難しく、手がかりがどうしても必要になる。