IPアドレスの取得

 Metro Style App でアプリが実行されているマシンのIPアドレスを取得してみます。

 IPアドレスWindows.Networking.Connectivity.NetworkInformation.GetHostNames() で取得できる HostName に含まれています。
 複数の HostName が返ってきますが、このうち NetworkAdapter が null ではない物がIPアドレスです。

 以下のようなサンプルで動作を確認してみました。

var hostNames = Windows.Networking.Connectivity.NetworkInformation.GetHostNames();
for (int i = 0; i < hostNames.Count; i++)
{
    Debug.WriteLine("HostName {0}", i + 1);
    Debug.WriteLine("  DisplayName = {0}", hostNames[i].DisplayName);
    Debug.WriteLine("  RawName = {0}", hostNames[i].RawName);
    Debug.WriteLine("  CanonicalName = {0}", hostNames[i].CanonicalName);
    if (hostNames[i].NetworkAdapter != null)
    {
        Debug.WriteLine("  IP Address = yes");
        Debug.WriteLine("  NetworkAdapterId = {0}", hostNames[i].NetworkAdapter.NetworkAdapterId.ToString());
    }
}

 実行すると、以下の4種類の情報が取得できました。

  • コンピューター名
  • コンピューター名に .local が付加された物
  • IPv4 アドレス
  • IPv6 アドレス

 試した範囲では DisplayName と RawName は同じでした。
 CanonicalName はIPアドレスの場合違いがありませんでしたが、コンピューター名の場合は全て小文字で取得されました。

 IPv4IPv6 を識別する情報はありませんので、文字列の書式で判別するしかないようです。

 今回は NIC が1つだけしか動作していない環境でしたが、複数動作している場合はIPアドレスも複数取得できると思われます。
 複数取得できた場合、IPv4IPv6 のペアを判別する情報がない(NetworkAdapterId は同じ NICIPv4IPv6 で違う値)ので問題があるかもしれません。


 なお、MACアドレスについても取得できないか調べましたが、こちらは取得方法を見つけられませんでした(System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() は削除されているようです)。
 端末識別に使用できないようにするために、意図的に取得できないようになっているのかもしれません。