C# でドメイン名を取得する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. C#ManagementObjectSearcher クラスを使用してドメイン名を取得する
  2. C#System.Net.NetworkInformation 名前空間を使用してドメイン名を取得する
  3. C#System.Environment.UserDomainName を使用してドメイン名を取得する
  4. C#System.DirectoryServices.ActiveDirectory を使用してドメイン名を取得する
C# でドメイン名を取得する

このチュートリアルでは、さまざまな種類のドメイン名について説明し、C# で特定のユーザーに対してドメイン名を取得する方法を示します。 ドメイン名は、Active Directory ドメインのユーザー/コンピューター セキュリティ プリンシパル、ネットワークのスタック プライマリ DNS、またはネットワーク上のコンピューター/ユーザー IP アドレスを解決する DNS 名にすることができます。

C# でこれらのドメイン名を取得し、要件を満たし、タスクに大きく依存するものを選択するには、主に 4つの方法があります。 コンピューターの Active Directory ドメインを探している場合は、コンピューターのセキュリティ プリンシパルとユーザーのプリンシパルが属するドメインを取得 (またはアクセス) する必要があります。

一般に、Active Directory との安定した接続を確立するには、この情報が必要です。 ユーザーのプリンシパルとコンピュータのプリンシパルは必ずしも同じドメインにあるとは限りません。 一方、ローカル ネットワーク スタックのプライマリ DNS サフィックスも、取得したいドメイン名である可能性があり、ほとんどの場合、それにアクセスまたは取得することは、コンピューターのセキュリティ プリンシパルとサーバーの両方が接続されているドメインと同じである可能性があります。 現在認証されているユーザーのプリンシパルが属しています。

デバイスが Active Directory で何かを行う必要がある場合でも、ローカル ネットワークのスタック プライマリ DNS サフィックスをドメイン名として LAN 経由で正常に接続することが必要な場合があります。

最後のオプションは、ドメイン名としてユーザーの IP アドレスに関心がある場合です。これは、ゼロから無限の DNS レコードの間のどこでもかまいません。また、現在処理しているリクエストを送信するために HTTP_HOST にすることもできます。 また、Microsoft の Active Directory を使用する必要もありません。

C#ManagementObjectSearcher クラスを使用してドメイン名を取得する

System.Management 名前空間に属し、ユーザーが特定のクエリに基づいて管理オブジェクト (ドメイン名は管理オブジェクト) を取得するのに役立ちます。 使いやすく、C# の初心者が管理情報やドメイン名を取得するのに最適です。

ディスク ドライブ、ネットワーク アダプター、プロセス、システム情報、ネットワーク接続、一時停止中のサービスなどに関する管理情報を列挙できます。インスタンス化時の入力として WMI クエリ (ObjectQuery で表される) と、WMI 名前空間を表す ManagementScope を使用します。 ユーザークエリを実行します。

using System;
using System.Management;  // essential namespace
using System.Windows.Forms;

namespace domain_name {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      SelectQuery query = new SelectQuery("Win32_ComputerSystem");
      using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) {
        foreach (ManagementObject mo in searcher.Get()) {
          label1.Text = mo.ToString();
        }
      }
    }

    private void label1_Click(object sender, EventArgs e) {}
  }
}

出力:

ManagementObjectSearcher

C# のベテランや経験豊富な開発者は、EnumerationOptions で追加の高度なオプションを利用することもできます。 ManagementObjectSearcher クラスを理解するのは簡単です。 指定されたスコープで指定されたクエリを実行し、クラス オブジェクトの Get() メソッドが呼び出されたときに ManagementObjectCollection 内のクエリに一致するドメイン名を返します。

これは、コンピューターが管理者用の Active Directory にある場合に動的にドメイン名を取得する完璧な例です。 SelectQuery を使用してクエリを作成し、それをクラス オブジェクトに割り当て、そのオブジェクトに Get() メソッドを適用してドメイン名を取得します。

C#System.Net.NetworkInformation 名前空間を使用してドメイン名を取得する

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName を使用して、ネットワーク スタックのプライマリ DNS サフィックスをドメイン名として取得し、コンピューター/ユーザーの IP アドレスを解決する DNS 名を取得できます。

IPGlobalProperties.DomainName プロパティは System.Net.NetworkInformation 名前空間に属し、ローカル コンピューターが登録されているドメイン名を取得できます。

IPGlobalProperties オブジェクトには、ローカル コンピューターに関するドメイン情報 (システム提供の型) が含まれており、System.Net.NetworkInformation 名前空間を使用すると、ネットワーク トラフィック データとネットワーク アドレス情報にアクセスできます。

ただし、ローカル コンピューター上のネットワーク インターフェイスに関する情報が必要な場合は、NetworkInterface クラスを使用できます。

using System;
using System.Net.NetworkInformation;  // essential namespace
using System.Windows.Forms;

namespace domain_name {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
      string domain_name = properties.DomainName.ToString();
      label1.Text = domain_name;
    }

    private void label1_Click(object sender, EventArgs e) {}
  }
}

出力:

ネットワーク情報

C#System.Environment.UserDomainName を使用してドメイン名を取得する

System 名前空間の一部として、Environment.UserDomainName プロパティは、現在のユーザーに関連付けられているネットワーク ドメイン名またはセキュリティ プリンシパルのドメインを取得します。

OS がドメイン情報の取得をサポートしていない場合、またはネットワーク ドメイン名にアクセスできない場合、サーバー、ローカル ネットワーク、またはコンピューターからドメイン名を取得するときに問題が発生する可能性があります。

ユーザー ドメイン名またはドメイン アカウントの資格情報は、\ 文字とユーザー名としてフォーマットされます。 UserDomainName プロパティを使用してユーザー名なしでユーザーのドメイン名を取得し、UserName プロパティを使用してドメイン名なしでユーザー名を取得できます。

using System;
using System.Windows.Forms;

namespace domain_name {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      label1.Text = Environment.UserDomainName;
    }

    private void label1_Click(object sender, EventArgs e) {}
  }
}

出力:

ユーザードメイン名

UserDomainName プロパティの主な目的は、現在のユーザー (あなたを指す) の Windows アカウント名のドメイン名を取得することです。

このプロパティを介してドメイン名を取得しようとして失敗した場合、UserName プロパティで指定されたユーザーに関連付けられたドメイン名を自動的に取得/取得しようとすることができます。

C#System.DirectoryServices.ActiveDirectory を使用してドメイン名を取得する

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain() メソッドを使用して、Active Directory に属する現在のコンピューターのセキュリティ プリンシパルのドメインを取得できます。

ローカル コンピューターまたはコンピューターが、情報を取得しようとしているドメインの一部ではない場合、またはドメイン コントローラーが接続されていない場合、ActiveDirectoryObjectNotFoundException 例外がスローされます。

GetComputerDomain メソッドは、System.DirectoryServices.ActiveDirectory 名前空間の一部である Domain クラスに属します。 Domain.GetComputerDomain メソッドを使用して、名前空間への参照を提供することにより、C# でドメイン名を取得できます。

ドメイン名を表す Domain オブジェクトを返し、アプリケーションが実行されているドメイン資格情報とは無関係です。

using System;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;
using System.Windows.Forms;

namespace domain_name {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
      label1.Text = Domain.GetComputerDomain().ToString();
    }

    private void label1_Click(object sender, EventArgs e) {}
  }
}

出力:

ActiveDirectory

信頼された、または承認されたアカウント ドメイン資格情報に関係なく、GetCurrentDomain メソッドを使用して、コンピューターのドメイン名を簡単に取得できます。 高レベルの抽象化ドメインのオブジェクト モデルにアクセスして、Microsoft Active Directory サービスの一部としてドメイン情報を取得できます。

このチュートリアルでは、C# でドメイン名を取得する方法を説明しました。 これは、AD ドメイン名、ネットワーク ドメイン名、ローカル コンピューターのドメイン名、または C# アプリケーションのパフォーマンスを維持しながら前述のアプローチで取得できるその他の名前にすることができます。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub