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


129

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

ユーザーのすべてのグループを取得して、それぞれについて一致をテストできると思いますが、それを1つのLDAP式にパックできるかどうか疑問に思っていました。

何か案は?

ありがとう


回答:


177

ここで、このフィルターを使用してクエリを作成できるはずです。

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

マーク


1
試しましたが、まだうまくいきません。これは、memberOf句で「OU = Users」または「OU = Groups」のどちらにする必要がありますか?
ポール

3
これは私のクエリです:(&(objectClass = person)(sAMAccountName = USERID)(memberof = 'CN = SPSAdmins、OU = Groups、OU = MYTOWN、OU = Germany、OU = MYCOMPANY、DC = MYTOWN、DC = MYCOMPANY、DC = com '))DNは本当に長いです。私はそれがうまくいくはずであることに同意します。助けてくれてありがとう!
ポール

3
気まぐれで、memberofの後の単一引用符を削除すると、結果が得られます!おかげで
ポール

2
いい答えだ。ただし、「memberOf」属性を保持するLDAPサーバーでのみ機能することを指摘しておく必要があります。より一般的な手法は、グループオブジェクトをフェッチし、グループオブジェクトが使用するスキーマに応じて、ユーザーのDNのuniqueMember、roleOccupantなどの属性を調べることです。
ローン侯爵2014

1
@Gunslinger LDAP属性の名前と値は大文字と小文字が区別されず、どちらもDNではありませんが、ADには独自のルールがあります...
Marquis of Lorne

35

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

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


8
memberof overlayを有効にする方法を説明するページへのリンクが役立つと思います。
Gokhan Sari

5
私のために働いたチュートリアル:schenkels.nl/2013/03/…@Telford Tendrysさん、既存のグループに関するこの通知で私の命を救ってくれました。どうもありがとう!
ŁukaszBachman

21

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


その情報をありがとう。私はあなたが行うことができないと言うことをしようとしています。PHPでそれを行うにはどうすればよいですか?別の方法で同じ結果を得ることは可能ですか?すべてのグループをSPSで始めて、次に何でも見つけるには...いつでもすべてを取得して配列をループしてから、必要なCNに一致をpregできますが、可能であればまっすぐ検索することをお勧めします。
ODelibalta 2013

15

クエリベースを問題のユーザーの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**
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.