人気ブログランキング | 話題のタグを見る
(.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) の条件いらなかったりすると思います。
IPv4もIPv6も列挙してくれます。

実は、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アドレスを取得する方法
by jehoshaphat | 2009-06-18 08:03 | .Net開発


<< (MCP70-642)2.2 ... (MCP70-642)2.1 ... >>