回答:
ここで、このフィルターを使用してクエリを作成できるはずです。
(&(objectClass=user)(sAMAccountName=yourUserName)
(memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))
LDAPサーバーに対して実行すると、結果が得られた場合、ユーザー「yourUserName」は実際にはグループ「CN = YourGroup、OU = Users、DC = YourDomain、DC = com」のメンバーです。
これがうまくいくか試してみてください!
C#/ VB.NetとSystem.DirectoryServicesを使用する場合は、次のスニペットでうまくいくはずです。
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");
DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;
srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";
SearchResultCollection res = srch.FindAll();
if(res == null || res.Count <= 0) {
Console.WriteLine("This user is *NOT* member of that group");
} else {
Console.WriteLine("This user is INDEED a member of that group");
}
警告:これは直接のグループメンバーシップのみをテストし、ドメイン内の「プライマリグループ」(通常は「cn = Users」)のメンバーシップをテストしません。ネストされたメンバーシップは処理しません。たとえば、ユーザーAはグループBのメンバーであるグループAのメンバーです。ユーザーAが実際にグループBのメンバーであるという事実は、ここには反映されません。
マーク
Linuxサーバーで一般的なOpenLDAP(つまりslapd)を使用している場合は、(memberOf = XXX)属性を使用して、memberofオーバーレイをフィルターと照合できるようにする必要があります。
また、オーバーレイを有効にしても、既存のグループのmemberOf属性は更新されません(既存のグループを削除して、再度追加する必要があります)。オーバーレイを最初から有効にした場合、データベースが空のときは問題ありません。
Marcの答えにもう1つ追加します。memberOf属性にはワイルドカードを含めることができないため、 "memberof = CN = SPS *"のように言うことはできません。また、 "SPS"で始まるすべてのグループを見つけることはできません。
クエリベースを問題のユーザーのDNに設定し、フィルターを、それらがメンバーであるかどうか疑問に思っているグループのDNに設定する必要があります。jdoeがofficeグループのメンバーかどうかを確認するには、クエリは次のようになります。
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'
彼がメンバーになっているすべてのグループを表示したい場合は、次のように、検索で 'memberof'属性のみをリクエストします。
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**