[C#] DirectorySearcherでグループメンバーを取得する方法

C#でDirectorySearcherを使用してグループメンバーを取得するには、まずSystem.DirectoryServices名前空間をインポートします。

次に、DirectoryEntryオブジェクトを作成し、Active Directoryのルートを指定します。

DirectorySearcherを初期化し、フィルターを設定して特定のグループを検索します。

SearchResultからGetDirectoryEntryメソッドを使用してグループのmember属性を取得し、各メンバーの情報をリストとして取得します。

これにより、指定したグループに属するユーザーやコンピュータの情報を取得できます。

この記事でわかること
  • DirectorySearcherの基本的な使い方
  • グループメンバーの取得手順
  • 特定の属性を持つメンバーの検索方法
  • ネストされたグループのメンバー取得方法
  • メンバー情報のCSV出力方法

目次から探す

グループメンバーの取得手順

DirectoryEntryの初期化

C#でActive Directoryにアクセスするためには、まずDirectoryEntryクラスを使用して接続を初期化します。

以下のコードは、指定したLDAPパスを使用してDirectoryEntryを初期化する例です。

using System.DirectoryServices;
partial class MyForm
{
    private DirectoryEntry directoryEntry;
    public MyForm()
    {
        InitializeComponent();
        
        // LDAPパスを指定してDirectoryEntryを初期化
        directoryEntry = new DirectoryEntry("LDAP://YourLDAPPath");
    }
}

このコードでは、YourLDAPPathを実際のLDAPパスに置き換えてください。

DirectorySearcherの設定

次に、DirectorySearcherクラスを使用して、Active Directory内のオブジェクトを検索します。

以下のコードでは、DirectorySearcherを初期化し、DirectoryEntryを指定します。

partial class MyForm
{
    private DirectorySearcher directorySearcher;
    public MyForm()
    {
        InitializeComponent();
        
        // DirectoryEntryの初期化
        directoryEntry = new DirectoryEntry("LDAP://YourLDAPPath");
        
        // DirectorySearcherの初期化
        directorySearcher = new DirectorySearcher(directoryEntry);
    }
}

検索フィルターの作成

DirectorySearcherを使用する際には、検索フィルターを設定する必要があります。

以下のコードでは、特定のグループのメンバーを取得するためのフィルターを設定します。

partial class MyForm
{
    public MyForm()
    {
        InitializeComponent();
        
        // DirectoryEntryとDirectorySearcherの初期化
        directoryEntry = new DirectoryEntry("LDAP://YourLDAPPath");
        directorySearcher = new DirectorySearcher(directoryEntry);
        
        // 検索フィルターの設定
        directorySearcher.Filter = "(objectClass=user)";
    }
}

この例では、objectClassuserのオブジェクトを検索するフィルターを設定しています。

SearchResultからのデータ取得

検索を実行した後、SearchResultオブジェクトからデータを取得します。

以下のコードでは、検索結果を取得し、最初の結果を表示します。

partial class MyForm
{
    public void GetGroupMembers()
    {
        // 検索を実行
        SearchResultCollection results = directorySearcher.FindAll();
        
        // 最初の結果を取得
        if (results.Count > 0)
        {
            SearchResult firstResult = results[0];
            // ここで必要な情報を取得する
        }
    }
}

メンバー情報の抽出

最後に、SearchResultから必要なメンバー情報を抽出します。

以下のコードでは、ユーザー名を取得する例を示します。

partial class MyForm
{
    public void GetGroupMembers()
    {
        // 検索を実行
        SearchResultCollection results = directorySearcher.FindAll();
        
        // 結果をループしてメンバー情報を抽出
        foreach (SearchResult result in results)
        {
            // ユーザー名を取得
            string userName = result.Properties["sAMAccountName"][0].ToString();
            // ここでユーザー名を使用する
        }
    }
}

このコードでは、sAMAccountName属性からユーザー名を取得しています。

必要に応じて、他の属性も取得できます。

応用例

特定の属性を持つメンバーの取得

特定の属性を持つメンバーを取得するためには、検索フィルターを変更します。

以下のコードでは、特定の役職を持つユーザーを取得する例を示します。

partial class MyForm
{
    public void GetMembersByAttribute(string title)
    {
        // 検索フィルターを設定
        directorySearcher.Filter = $"(&(objectClass=user)(title={title}))";
        
        // 検索を実行
        SearchResultCollection results = directorySearcher.FindAll();
        
        // 結果をループしてメンバー情報を抽出
        foreach (SearchResult result in results)
        {
            string userName = result.Properties["sAMAccountName"][0].ToString();
            // ここでユーザー名を使用する
        }
    }
}

このコードでは、title属性が指定された値と一致するユーザーを検索しています。

ネストされたグループのメンバー取得

ネストされたグループのメンバーを取得するには、再帰的にグループを検索する必要があります。

以下のコードは、指定したグループのすべてのメンバーを取得する例です。

partial class MyForm
{
    public void GetNestedGroupMembers(string groupName)
    {
        // グループの検索フィルターを設定
        directorySearcher.Filter = $"(&(objectClass=group)(cn={groupName}))";
        
        // 検索を実行
        SearchResultCollection results = directorySearcher.FindAll();
        
        foreach (SearchResult result in results)
        {
            // グループのメンバーを取得
            foreach (string member in result.Properties["member"])
            {
                // メンバーの情報を取得
                GetMemberInfo(member);
            }
        }
    }
    private void GetMemberInfo(string memberDn)
    {
        // メンバーのDirectoryEntryを取得
        DirectoryEntry memberEntry = new DirectoryEntry($"LDAP://{memberDn}");
        string userName = memberEntry.Properties["sAMAccountName"].Value.ToString();
        // ここでユーザー名を使用する
    }
}

このコードでは、指定したグループのメンバーを取得し、各メンバーの情報を再帰的に取得しています。

メンバー情報のCSV出力

取得したメンバー情報をCSV形式で出力するには、StringBuilderを使用してCSVフォーマットの文字列を作成し、ファイルに書き込みます。

以下のコードは、メンバー情報をCSVファイルに出力する例です。

using System.IO;
using System.Text;
partial class MyForm
{
    public void ExportMembersToCsv(string filePath)
    {
        StringBuilder csvContent = new StringBuilder();
        csvContent.AppendLine("UserName,Title"); // ヘッダー行
        
        // 検索を実行
        SearchResultCollection results = directorySearcher.FindAll();
        
        foreach (SearchResult result in results)
        {
            string userName = result.Properties["sAMAccountName"][0].ToString();
            string title = result.Properties["title"].Count > 0 ? result.Properties["title"][0].ToString() : "N/A";
            
            // CSV行を追加
            csvContent.AppendLine($"{userName},{title}");
        }
        
        // CSVファイルに書き込み
        File.WriteAllText(filePath, csvContent.ToString());
    }
}

このコードでは、ユーザー名と役職をCSV形式で出力し、指定したファイルパスに保存します。

ファイルパスは実際の保存先に置き換えてください。

よくある質問

DirectorySearcherでの検索が遅いのはなぜ?

DirectorySearcherでの検索が遅くなる原因はいくつかあります。

主な要因は以下の通りです。

  • 検索フィルターの複雑さ: 複雑なフィルターを使用すると、検索にかかる時間が増加します。

シンプルなフィルターを使用することが推奨されます。

  • 検索対象のデータ量: Active Directory内のオブジェクト数が多い場合、検索に時間がかかることがあります。

必要な属性だけを取得するように設定することで、パフォーマンスを向上させることができます。

  • ネットワークの遅延: Active Directoryがリモートサーバーにある場合、ネットワークの遅延が影響することがあります。

ローカル環境でのテストを行うと、パフォーマンスの違いを確認できます。

ネストされたグループのメンバーを取得する方法は?

ネストされたグループのメンバーを取得するには、再帰的なアプローチを使用します。

具体的には、以下の手順を踏みます。

  1. グループを検索: 指定したグループのDirectoryEntryを取得します。
  2. メンバーを取得: グループのmember属性からメンバーのDN(Distinguished Name)を取得します。
  3. 再帰的にメンバーを検索: 各メンバーがグループである場合、再帰的にそのグループのメンバーを取得します。

この方法により、すべてのネストされたメンバーを取得することができます。

DirectorySearcherとLDAPの違いは?

DirectorySearcherとLDAP(Lightweight Directory Access Protocol)は、異なる概念ですが、密接に関連しています。

  • DirectorySearcher: C#のクラスで、Active DirectoryやLDAPサーバーに対して検索を行うためのインターフェースを提供します。

DirectorySearcherを使用することで、簡単にディレクトリ内のオブジェクトを検索できます。

  • LDAP: ディレクトリサービスにアクセスするためのプロトコルです。

LDAPは、ディレクトリ情報を管理するための標準的な方法を提供し、さまざまなプラットフォームで使用されています。

要するに、DirectorySearcherはLDAPプロトコルを利用してディレクトリサービスにアクセスするためのツールであり、LDAPはそのアクセス方法を定義するプロトコルです。

まとめ

この記事では、C#を使用してActive Directoryからグループメンバーを取得する方法について詳しく解説しました。

具体的には、DirectoryEntryDirectorySearcherを利用した初期化や設定、検索フィルターの作成、メンバー情報の抽出方法を紹介しました。

また、特定の属性を持つメンバーの取得やネストされたグループのメンバー取得、さらにメンバー情報をCSV形式で出力する応用例についても触れました。

これらの知識を活用して、実際のプロジェクトにおいてActive Directoryのデータを効果的に操作してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す