web-dev-qa-db-ja.com

ユーザーがグループのメンバーであるかどうかをテストするためにLDAPクエリを作成する方法

ユーザー(sAMAccountName)が特定のグループのメンバーであるかどうかをテストするLDAPクエリを書きたいです。 0または1の結果レコードを取得するようにすることは可能ですか?

私は私がユーザーのためのすべてのグループを得て、マッチについてそれぞれをテストすることができると思います、しかし、私はそれを1つのLDAP表現にまとめることができるかどうか疑問に思いました。

何か案は?

ありがとう

117
paul

このフィルタでクエリを作成できるはずです。

(&(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のメンバーでもあるという事実は、ここには反映されません。

マーク

157
marc_s

Linuxサーバーで一般的なOpenLDAP(つまりslapd)を使用している場合は、memberofオーバ​​ーレイを有効にして、(memberOf = XXX)属性を使用してフィルタと照合できるようにする必要があります。

また、オーバーレイを有効にしても、既存のグループのmemberOf属性は更新されません(既存のグループを削除して再度追加する必要があります)。オーバーレイを最初から有効にした場合は、データベースが空のときにOKになります。

33
Telford Tendys

Marcの答えにもう1つ追加します。memberOf属性にはワイルドカードを含めることができないので、 "memberof = CN = SPS *"のように言うことはできず、 "SPS"で始まるすべてのグループが見つかるはずです。

19
Bill Brinkley

クエリベースを問題のユーザーの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**
10
gpayne_007