[C#] DirectorySearcherでグループメンバーを取得する方法
C#でDirectorySearcher
を使用してグループメンバーを取得するには、まずSystem.DirectoryServices
名前空間をインポートします。
次に、DirectoryEntry
オブジェクトを作成し、Active Directoryのルートを指定します。
DirectorySearcher
を初期化し、フィルターを設定して特定のグループを検索します。
SearchResult
からGetDirectoryEntryメソッド
を使用してグループのmember
属性を取得し、各メンバーの情報をリストとして取得します。
これにより、指定したグループに属するユーザーやコンピュータの情報を取得できます。
グループメンバーの取得手順
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)";
}
}
この例では、objectClass
がuser
のオブジェクトを検索するフィルターを設定しています。
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形式で出力し、指定したファイルパスに保存します。
ファイルパスは実際の保存先に置き換えてください。
まとめ
この記事では、C#を使用してActive Directoryからグループメンバーを取得する方法について詳しく解説しました。
具体的には、DirectoryEntry
やDirectorySearcher
を利用した初期化や設定、検索フィルターの作成、メンバー情報の抽出方法を紹介しました。
また、特定の属性を持つメンバーの取得やネストされたグループのメンバー取得、さらにメンバー情報をCSV形式で出力する応用例についても触れました。
これらの知識を活用して、実際のプロジェクトにおいてActive Directoryのデータを効果的に操作してみてください。