14

Jan

ASCII.jp Windowsで自分のIPアドレスを調べる方法は?

自分のマシンのIPアドレスを調べる、いくつかの方法

現在利用中のマシンのIPアドレスを知っているだろうか。あるいは調べる方法は知っているだろうか。IPアドレスを調べるには、ipconfig.exeコマンド、あるいはコントロールパネルの「ネットワークと共有センター」、そしてWindows 10では「設定」→「ネットワークとインターネット」→「ネットワークの状態」といった手段がある。

WindowsでIPアドレスを調べる方法はいくつかある。1つはipconfig.exe、もう1つはコントロールパネルのネットワークと共有センター、そして設定の「ネットワークとインターネット」の「状態」だ

ipconfigコマンドでは、複数のネットワークインターフェースが表示される。このとき、ユーザーは、自身が持っている知識から適切なインターフェースを選んで、そこに表示されているIPアドレスを「見る」ことになる。たとえば、自身でネットワークのルーターを設定すれば、LANで使うネットワークアドレスを知っており、それに適合するものを該当のマシンのIPアドレスと認識している。

コントロールパネルのネットワークと共有センターでは、もう少しWindowsが“知的”になっていて、ネットワークインターフェースのそれぞれについてインターネット接続しているかどうかを判別し、インターネットに接続しているネットワークアダプターのみを表示するようになっている。

コントロールパネルのネットワークと共有センターでは、Bluetoothなどのインターネットに接続していないネットワークアダプタは排除できるが、インターネットに接続していない仮想ネットワークスイッチ関連のネットワークデバイスは表示してしまう

だから、ipconfigコマンドよりも表示されるネットワークアダプターが少ない。それでも、仮想マシン用のネットワークスイッチで作られたアダプターなどを表示してしまう。

Windows 10の「設定」→「ネットワークとインターネット」→「ネットワークの状態」では、インターネットに接続している物理的なネットワークしか表示しない。ネットワークスイッチで作られた仮想的なネットワークインターフェースかどうかを判断しているようだ。

では、こうした判断はどうやってなされるのだろう。ルーター設定やLANのネットワークアドレスといった知識なしにインターネット接続に使われている自分の正しいIPアドレスを知るには、どうしたらいいのだろうか?

“正しい”IPアドレスとは?

インターネットに接続しているということは、必ず「ゲートウェイ」(Gateway、ルーターのこと)と通信できるようになっている必要がある。これを「デフォルトルート」(Default Route)と呼び、その宛先となるルーターをデフォルトゲートウェイ(Default Gateway)という。デフォルトルートにつながるネットワークアダプターは、インターネットと通信しており、そのIPアドレスが「正しいIPアドレス」といえる。

PCの中には、イーサネットとWi-Fiの2つのネットワークインターフェースを持つものがあるが、Windowsのコネクションマネージャーはデフォルトでは、イーサネット(有線)を優先して利用する。Windowsの起動時に有線、無線のどちらも利用できるとき、Windowsは、先にイーサネットでインターネットが接続可能かを調べる(これは、マイクロソフト指定のサイトに接続できるかどうかを確認している)。無線LAN側を調べるのは、イーサネットが利用できないか、インターネットに接続していないときだ。ただし、ユーザーが強制的に有線、無線の2つのネットワークインターフェースを同時に有効にすることは可能だ。

また、Hyper-Vを有効にしていると、仮想ネットワークスイッチが作られ、ホスト側となる起動しているWindowsを、仮想マシン側と接続するための仮想ネットワークインターフェースが表示される。これもIPアドレスを割り当てられている。そのほかに、サーバーを介してIPv4とIPv6を変換するTerodoもネットワークインターフェースを使って実現されている。

ASCII.jp Windowsで自分のIPアドレスを調べる方法は?

また、対応デバイスを接続しないとipconfigには表示されないが、Bluetoothからもインターネット接続が可能である。こちらは、「コントロールパネル」→「ネットワークと共有センター」→「アダプターの設定の変更」→「ネットワーク接続」には表示される。  Windowsには多数のネットワークアダプターがあり、場合によってはそのいくつかがIPアドレスを持つ。インターネット接続のためのルーターの知識なしにこの中から「正しいIPアドレス」を選ぶ必要がある。

使える手がかりはいくつかある。1つは前述のデフォルトルートだ。少なくともデフォルトルートに接続していないネットワークアダプターは、インターネットには直接接続していない。もう1つは、IPアドレスを持っていること。そもそも正しいIPアドレスを探しているので、IPアドレスの割り当てられていないネットワークアダプターは無視してかまわない。

とりあえずネットワークインターフェースの情報を得る

ネットワークアダプターの情報を得る方法はいくつかある。1つは、.NET Frameworkを使って、ネットワークアダプターを列挙してそれぞれを調べていく方法だ。しかし、.NET Frameworkを使う方法はかなり面倒だ。というのも汎用性を考え、かなり低レベルのAPIとなっているため、複数のAPIを組みあわせて、情報をたどっていく必要があるからだ。たとえばデフォルトルートは、ルーティング情報として管理されているため、ネットワークアダプターのAPIからは直接取得できず、ルーティング情報とネットワークアダプターの情報を突き合わせて対応関係を調べる必要がある。

これがPowerShellになると、かなり楽になる。PowerShellは、.NET Frameworkを使って実現されているが、システム管理用であるため、IPアドレスやネットワークアダプターを比較的抽象化された形式で扱うことができる。しかし、この方法はPowerShellでしか通用しない。

もう1つは、Windowsが提供しているシステム管理機能を使う方法だ。企業内などで大数のPCが動作することを想定し、最近のOSは、さまざまな情報を一定の手順で取り出せるようになっている。Windowsには、こういう機器の状態や情報の管理のためにCIM/WIMと呼ばれる仕組みが提供されている。

CIMとは「Common Information Model」の略でDMTF(Distributed Management Task Force)という団体で作成したITにおける管理対象をオブジェクトモデル化したもの。たとえば、ストレージデバイスやネットワークインターフェースやそれが持つべき管理情報をオブジェクト(実際にはXML)として定義している。

このように業界団体として管理対象をオブジェクト化することで、システム管理ツールとプラットフォームの間のやりとりを一定の手順にすることができる。CIMでは、ネットワークインターフェースには名前があり、物理メディアタイプなどの情報を持つ。こうすることで、プラットフォームとの接続部分は違うのものの、その上を流れる情報を一定にすることで、多数のプラットフォームに対応が可能になる。ただしCIMは、個々で違いのある物理的なデバイスなどを抽象化するため、実際の管理という作業から見ると、曖昧な情報しか得られないこともある。

WMI(Windows Managiment Interface)は、このCIMのWindowsへの実装の1つだ。話がややこしいので簡略的に説明するが、Windowsでは、この機能をWMIという名前にしていたが、アクセスプロトコルをセキュアーなものに変更するタイミングでAPIを追加、こっちにはCIMという名前をつけた。そもそもWMIもCIMの1つであり、アクセス方法が違うだけだ。本来のCIMとWindowsのそれを区別するため、WindowsのものをWMI/CIMと表記する。

Windowsでは、WMI/CIMのオブジェクトを使って、さまざまな管理情報を撮り出せる。その中に、ネットワークインターフェースやIPアドレスに関するものがある。Windowsには、このWMI/CIMを扱うためのAPIがある。また、前述のPowerShellにも、このAPIに対応したコマンドがある。今回は、これを使って見ることにする。この方法は、WMI/CIMの標準的な方法なので、他の言語でも同じ考えでプログラムを作ることもできる。この機能は、Win32アプリケーションを探すときにも利用した「Get-CimInstace」である(WindowsでのWin32アプリケーションのインストール状態を調べる方法)。

これを使い、今回は「Win32_NetworkAdapterConfiguration」というクラスを使う。このクラスは、ネットワークアダプタの名前やIPアドレス、ゲートウェイアドレス、サブネットなどの情報を持っている。このため、Windowsのネットワークインターフェースと接続しているネットワークを調べるのは好都合のクラスだ。具体的には、以下のようにする。

Get-CimInstanceコマンドでは、ネットワークインターフェースに関する情報を得られる。IPアドレスの割り当てやデフォルトルートの存在などの条件を付けることで、インターネット接続しているネットワークアダプターだけを取り出すことができる

Get-CimInstance -Class Win32_NetworkAdapterConfiguration | Where-Object{$_.IPEnabled -eq "TRUE" -and $_.defaultipgateway }

パイプ記号「|」の前がネットワークアダプターの情報の取得で、後ろは、その中からIPアドレスを持ち、デフォルトルート(デフォルトゲートウェイ)が設定されているものを選択する部分だ。

このコマンドが出力するオブジェクトのIPAddressプロパティを取り出せば「正しいIPアドレス」が得られる。なお結果には、IPv4だけでなくIPv6アドレスも含まれ複数のIPアドレスが得られることに注意してほしい。

(Get-CimInstance -Class Win32_NetworkAdapterConfiguration | Where-Object{$_.IPEnabled -eq "TRUE" -and $_.defaultipgateway }).IPAddress

実際に調べたところ、これでほとんどの場合にうまくインターネット接続のIPアドレスを取得できる。ただし、無線LANで接続中にイーサネットに接続したような場合、一時的に両方がインターネット接続している状態になることがある。

しばらく待つとWindowsのコネクションマネージャーが無線LANのほうを切断してくれるが、1分程度は両方が接続した状態となる。このときには、両方とも「正しいIPアドレス」を持っているため、判断ができない。しばらく待てば、無線LANが切断されるので、インターネット接続が1つだけに戻る。現時点では、前記のやり方が正しいIPアドレスを得る最も簡便な方法のようだ。