なんてのがあったのでそのときの回答から内容をまとめてみます。
使用するアセンブリ:System.DirectoryServices.dll
使用するクラス:DirectoryEntry, DirectorySearcher, SearchResult
手順:1.DirectryEntryクラスを使用して、ADに接続する
2.ADに接続できていることを確認する
3.DirectorySearcherクラスを使用してLDAP内を検索する
4.検索結果から所属グループ一覧を取得する
0.プロジェクトにSystem.DirectoryServices.dllの参照を追加します。
1.DirectoryEntryクラスを使用して、ADに接続します。
文字列として、サーバーパス、ログインユーザー名、パスワードを用意します。
サーバーパスの指定にはいろいろな方法がありますのでこの辺を参照してください。
ユーザー名はUser DNの形で指定する必要があります。例えばAdministratorの場合は
CN=Administrator,CN=Users,DC=domain,DC=com
といった形。
string serverPath = "LDAP:///DC=domain,DC=local";
string username = "CN=Administrator,CN=Users,DC=domain,DC=com";
string password = "hogehoge";
DirectoryEntry entry = new DirectoryEntry(serverPath, username, password);
2.ADに接続できていることを確認する
ADに接続できているか(=ログインできたか)を確認するためのプロパティがありません。
ここでは、NaviteObjectプロパティが取得できるかどうかで代用します。
[HOWTO] フォーム認証と Visual C# .NET を使用して Active Directory に対する認証を行う方法
try
{
Object obj = entry.NaviteObject;
}
catch (Exception ex)
{
Throw
}
3.DirectorySearcherクラスを使用してLDAP内を検索する
ActiveDirectoryもLDAPなのでLDAPのスキーマを使用して検索することができます。
検索は
クエリの構築
検索の実行
の手順で行います。
DirectorySearcher search = new DirectorySearcher();
// 検索のルートになるDirectoryEntryを指定します。
// ここよりも下のノードが再帰的に検索されます。
search.SearchRoot = entry;
// 検索条件を指定します。条件の指定はLDAPクエリの構築と一緒です。
search.Filter = "(samAccountName=libaty)"
// FindOneメソッドを使用して最初にヒットした1件を取得します。
SearchResult result = search.FindOne();
4.検索結果から所属グループ一覧を取得する
検索結果のSearchResultのオブジェクトから結果に含まれるスキーマを取得し、
ユーザが所属するグループの一覧を取得します。
StringCollection groupList = new StringCollection();
for (int counter = 0; counter < result.Properties["memberOf"].Count; counter++)
{
string groupName = (string) result.Properties["memberOf"][counter];
gropuList.Add(groupName);
}
※4.を実行しただけでは、ユーザが所属するPrimary Groupを取得することができません。
そこで4.に加えて以下のコードを実行します。
DirectorySearcher groupSearch = new DirectorySearcher();
groupSearch.SearchRoot = entry;
groupSearch.Filter = "(objectclass=group)";
foreach (SearchResult resultGroup in groupSearch.FindAll())
{
if (Object.Equals(result.Properties["primarygroupid"][0], resultGroup.Properties["primarygrouptoken"][0])
{
groupList.Add(resultGroup.Properties["distinguishedName"][0]);
}
}
これでgroupListにはユーザが所属するグループの一覧が格納されています。