ホスト名のほうは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) の条件いらなかったりすると思います。
実は、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