3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)ローカルPCのホスト名とIPアドレスを取得する方法

ホスト名のほうは1行で取得できます。(ただし純粋なホスト名でFQDNではありません)

System.Net.Dns.GetHostName();

IPアドレスがちょっとめんどいですね。

いろいろググっていると

System.Net.Dns.Resolve(System.Net.Dns.GetHostName()).AddressList(旧形式)

System.Net.Dns.GetHostEntry("").AddressList

とやっている例が多いんですが、なんかNICのIP取得するのに名前解決用のメソッド使うのがヤだったんで、WMIのWin32_NetworkAdapterConfigurationから取得してみる方法をやってみました。

下記が各ネットワークアダプタの詳細とIPアドレスを列挙するサンプルです。

ManagementObjectSearcher query1 = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True");

ManagementObjectCollection queryCollection1 = query1.Get();

foreach (ManagementObject mo in queryCollection1)

{

Console.WriteLine("Caption: " + mo["Caption"]);

Console.WriteLine("DNSHostName: " + mo["DNSHostName"]);

Console.WriteLine("Index: " + mo["Index"]);

Console.WriteLine("InterfaceIndex: " + mo["InterfaceIndex"]);

Console.WriteLine("MACAddress: " + mo["MACAddress"]);

 

string[] arryIPaddr = (string[])mo["IPAddress"];

if (arryIPaddr != null)

{

foreach (string ipaddr in arryIPaddr)

{

Console.WriteLine("IPAddress: " + ipaddr);

}

}

Console.WriteLine("");

}

WQLで条件に IPEnabled = True を加えることで、IPアドレスが付与されているアダプタのみ取得することができます。

この条件付けないとIPが無い仮想を含めた様々なアダプタ(Microsoft ISATAP AdapterとかWAN ミニポート等々)が出てきちゃいます。

逆にこの条件加えるとIPアドレスが確実に割り振られてるNICのみ出てくるので、実は if (arryIPaddr != null) の条件いらなかったりすると思います。

IPv4IPv6も列挙してくれます。

実は、NICの Index 順に取得したいと思って WQL に OrderBy 付け加えたんですが、WQLでソートサポートしてないんですね。。。

せめてソートくらいはサポートしてほしかったです。。。

と、WMIでIPアドレス取得するコードを書き終わったくらいに Dns.GetHostAddresses() というのを見つけました。

.Net Framework 2.0 以降じゃないと使えませんが、これを使うと1行でローカルPCのIPアドレスが取得できるようです。

コードもこれだけです。(VB.Net)

Dim ipAddrs() As Net.IPAddress = System.Net.Dns.GetHostAddresses(String.Empty)

For Each ipAddr As Net.IPAddress In ipAddrs

Console.WriteLine(ipAddr)

Next

ただ、このメソッドの難点はどのアダプタにどのIPアドレスというのがわかない点です。

本当にローカルPCの全てのIPアドレスを列挙してるだけっぽいので。。

また、別の方法として、System.Net.NetworkInformation名前空間を使用する方法(NetworkInterface.GetIPProperties().UnicastAddresses)もあるようですね。

いろいろ方法あると、どれ採用するか悩みます。

参考:

@IT:ローカル・コンピュータのIPアドレスを取得するには? Dns.GetHostAddresses , Dns.GetHostByName

[WMI] IPアドレス取得

WMIでIPアドレスを取得する方法