|   | 
| 
 .NET TIPS 
プログラムを実行しているマシンのホスト名を得るには?
株式会社ピーデー 川俣 晶 
2003/06/06 | 
  | 
 
 | 
    
 ネットワークを活用するプログラムを作成していると、そのプログラムを実行しているコンピュータの名前を参照する必要が生じることがある。そのような場合には、Dnsクラス(System.Net名前空間)のGetHostNameメソッドを使用することが、最も基本的な解決方法である。
Dns.GetHostNameメソッドで得る
 使い方は難しくない。以下のような簡単なコードを書けばすぐに実行結果を確かめることができる。
// gethost1.cs 
 
using System; 
using System.Net; 
 
class GetHostNameSample1 { 
  static void Main() { 
 
    Console.WriteLine(Dns.GetHostName()); 
  } 
} 
 
// コンパイル方法:csc gethost1.cs 
 | 
 
 
 | 
 
| コンピュータの名前を表示するサンプル・プログラム(C#版:gethost1.cs) | 
| 
 | 
 
' gethost1.vb 
 
Imports System 
Imports System.Net 
 
Module GetHostNameSample 
  Sub Main() 
    Console.WriteLine(Dns.GetHostName()) 
  End Sub 
End Module 
 
' コンパイル方法:vbc /r:System.dll gethost1.vb 
 | 
 
 
 | 
 
| コンピュータの名前を表示するサンプル・プログラム(VB.NET版:gethost1.vb) | 
| 
 | 
 しかし、これが意図するとおりの名前であるという保証はない。例えば、筆者のPCでこのサンプル・プログラムを実行すると、「tailmon3」と表示される。これは、マイコンピュータのプロパティで設定したこのコンピュータの名前である。しかし、このPCは、ActiveDirectoryサーバから「tailmon3.tokyo.piedey.co.jp」という名前をもらっている。通信に使用することを考えれば、前者の名前よりも後者の名前の方が有用である。もし、無関係なほかのコンピュータに取得した値を渡すとき、「tailmon3」という名前では、名前を解決できない可能性が高い。だが、FQDN(Fully Qualified Domain Name)名の「tailmon3.tokyo.piedey.co.jp」なら(これはプライベートLAN上の名前なので、この名前を解決できる範囲内ならば、という制約は付くが)、どこからでも解決できる。
 単純にFQDN名を得る場合には、GetHostNameメソッドを記述している行を、以下のようにIPHostEntryクラス(System.Net名前空間)を使用して書き直せばよい。
IPHostEntry hostInfo = Dns.GetHostByName(Dns.GetHostName()); 
Console.WriteLine(hostInfo.HostName); 
 | 
 
 
 | 
 
| GetHostNameメソッドで得たコンピュータ名からFQDN名を得るコード(C#版) | 
 
Dim hostInfo As IPHostEntry = Dns.GetHostByName(Dns.GetHostName()) 
Console.WriteLine(hostInfo.HostName) 
 | 
 
 
 | 
 
| GetHostNameメソッドで得たコンピュータ名からFQDN名を得るコード(VB.NET版) | 
それでも上手く値を取得できないケース
 上記のプログラムは完全ではない。というのは、矛盾した設定を持ったコンピュータの場合、正しくない結果を返す場合があるためである。
 例えば、以下の条件を持ったコンピュータで上記のサンプル・プログラムを実行してみた。ほかの条件によっても動作が変わるかもしれないので、一例として見ていただきたい。
- 	コンピュータ名は「kukuri」
 
- 	コンピュータはActiveDirectoryの管理下にない
 
- 	コンピュータは固定IPアドレス「192.168.16.64」を与えられている
 
- 	DNSサーバには、「192.168.16.64」は「test2.tokyo.piedey.co.jp」であると正引き、逆引きともに設定されている。
 
 この状態でGetHostByNameメソッドは「kukuri」という値を返した。また、IPHostEntryクラスのHostNameプロパティを利用した方法では「kukuri.tokyo.piedey.co.jp」という値を返した。DNSサーバには、「kukuri.tokyo.piedey.co.jp」という名前に関する情報はなく、これは処理不可能な名前である。適切なActiveDirectoryの管理が行われていれば問題ないと思われるが、すべて手動で固定値を与えていると、このような状況が起こる可能性も否定できない。
 これを回避するには、1度自分のコンピュータのIPアドレスを取得してから、そのIPアドレスに対応するホスト名をDns.GetHostByAddressメソッドを使って得るとよいようである。
// gethost2.cs 
 
using System; 
using System.Net; 
 
class GetHostNameSample2 { 
  static void Main() { 
 
    IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
 
    foreach (IPAddress ipAddress in ipHostInfo.AddressList) { 
      Console.WriteLine(Dns.GetHostByAddress(ipAddress).HostName); 
    } 
  } 
} 
 
// コンパイル方法:csc gethost2.cs 
 | 
 
 
 | 
 
| IPアドレスを取得してからホスト名を得るサンプル・プログラム(C#版:gethost2.cs) | 
| 
 | 
 
' gethost2.vb 
 
Imports System 
Imports System.Net 
 
Module GetHostNameSample 
  Sub Main() 
    Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName()) 
    Dim ipAddress As IPAddress 
 
    For Each ipAddress In ipHostInfo.AddressList 
      Console.WriteLine(Dns.GetHostByAddress(ipAddress).HostName) 
    Next 
  End Sub 
End Module 
 
' コンパイル方法:vbc /r:System.dll gethost2.vb 
 | 
 
 
 | 
 
| IPアドレスを取得してからホスト名を得るサンプル・プログラム(VB.NET版:gethost2.vb) | 
| 
 | 
 これを実行すると、実際にDNSに登録されている「test2.tokyo.piedey.co.jp」という名前を得ることができた。この名前は、同じDNS情報を共有するほかのコンピュータから確実にこのコンピュータのIPアドレスを得るために使用できる。
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク 
使用ライブラリ:Dnsクラス(System.Net名前空間) 
使用ライブラリ:IPHostEntryクラス(System.Net名前空間) | 
 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間