.NET から Active Directory 内のデータにアクセスするために使用されるのは System.DirectoryServices 名前空間で、オブジェクトをカプセル化する DirectoryEntry クラスやクエリを実行する DirectorySearcher クラスなどがあります。
Active Directory 内のユーザやグループを検索する手順としては、
1. 検索のルート(起点)になる DirectoryEntry を作成する
2. 検索フィルタ(SQLでいう抽出条件)文字列を作成する
3. クエリを実行するための DirectorySearcher を作成する
4. クエリを実行して結果を取得する
5. 取得した結果から DirectoryEntry を取得する
とまぁこんな感じです。
1.については、ドメイン全体を検索するなら、ドメインの DirectoryEntry を作成します。
例えば、ドメイン内の全ユーザを検索する場合は次のようにします。
VB
Using root As New DirectoryEntry(LdapRootPath) ‘---1.
Dim filter = "(objectCategory=User)" ‘---2.
Using searcher As New DirectorySearcher(root, filter) ‘---3.
Using results = searcher.FindAll() ‘---4.
For Each res As SearchResult In results
Using entry = res.GetDirectoryEntry() ‘---5.
‘メールアドレスを取得するなら
Dim mail = DirectCast(entry.Properties.Item("mail").Value, String)
End Using
Next
End Using
End Using
End Using
C#
using (var root = new DirectoryEntry(LdapRootPath)) //---1.
{
var filter = "(objectCategory=User)"; //---2.
using (var searcher = new DirectorySearcher(root, filter)) //---3.
{
using (var results = searcher.FindAll()) //---4.
{
foreach (SearchResult res in results)
{
using (var entry = res.GetDirectoryEntry()) //---5.
{
//メールアドレスを取得するなら
var mail = (string)entry.Properties["mail"].Value;
}
}
}
}
}
LdapRootPath は LDAP(Lightweight Directory Access Protocol) のパスです。ドメインが abc.co.jp であれば "LDAP://DC=abc,DC=co,DC=jp" になります。
1.で指定したルートの DirectoryEntry と 2.で指定したフィルタ文字列は、3.で作成した DirectorySearcher のSearchRoot プロパティと Filter プロパティになります。
ドメイン内の全グループを検索する場合、フィルタ文字列は "(objectCategory=Group)" になります。
3.の DirectorySearcher の作成は、クエリテキストと SqlConnection を指定した SqlCommand の作成に似てます。
4.については、最初の1つだけ取得したい場合は、FindOne メソッドを使います。FindAll メソッドの戻り値の型は SearchResultCollection で、FindOne メソッドの戻り値の型は SearchResult です。これらのメソッドは SqlCommand の ExecuteReader メソッドと ExecuteScalar メソッドに似てます。
5.で検索した結果の SearchResult.GetDirectoryEntry メソッドで、検索したユーザやグループに対応する DirectoryEntry を取得してます。