.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アドレスを得るために使用できる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:Dnsクラス(System.Net名前空間)
使用ライブラリ:IPHostEntryクラス(System.Net名前空間)
 
この記事と関連性の高い別の.NET TIPS
ローカル・コンピュータのIPアドレスを取得するには?
IPアドレス←→ホスト名を変換するには?
マシン名/ユーザー名を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間