web-dev-qa-db-ja.com

特定のユーザーを含むグループのLDAPクエリをフィルタリングするにはどうすればよいですか?

認証された/バインドされたユーザー(または任意のユーザー)を含むグループにActive Directory LDAPクエリをフィルター処理するにはどうすればよいですか?これは正常に機能します。

(&(objectClass=group)(member=*))
>>> lots of results

しかし、これ以上詳しく説明することはできません。

(&(objectClass=group)(member=*S*))
>>> nothing

MSDNは、次のようなフィルターの使用について言及しています。

(member:1.2.840.113556.1.4.1941:=(cn=user1,cn=users,DC=x))

しかし、それに関係するクレイジーハイパーマジックナンバーを無視しても、それでフィルタリングしようとすると、常に0の結果が得られます(cn=user1,cn=users,DC=xを独自のdistinguishedNameに置き換えても、*に置き換えても)。

8

ユーザーの完全なDNが必要です。

(&(member=CN=Your Name,OU=Your OU,DC=company,DC=com)(objectClass=group))

これでは*を使用できないことに注意してください

8
Raymund

したがって、再帰検索に関係するクレイジーハイパーマジックナンバーは、 検索フィルター構文 で説明されています。

1回の検索で(再帰的に)「user1」がメンバーであるすべてのグループを見つけるには:

  • ベースをグループコンテナDNに設定します。たとえば、ルートDN(dc = dom、dc = fr)
  • スコープをサブツリーに設定します
  • 次のフィルターを使用します。(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

lDIFDE.EXEを使用して、WindowsServerに含まれているコマンドラインツールを使用して明示します。

ldifde -f user1Grps.ldf -d "dc=societe,dc=local" -r "(member:1.2.840.113556.1.4.1941:=cn=user1,ou=Monou,dc=societe,dc=local)"

W2K8またはW2K8R2サーバーで実行している場合は、管理者として実行するように注意してください。

C#でプログラミングしている場合は、次のものを使用できます。

/* Retreiving a principal context
 */
Console.WriteLine("Retreiving a principal context");
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "PWD");


/* Look for all the groups a user belongs to
 */
UserPrincipal aUser = UserPrincipal.FindByIdentity(domainContext, "user1");
PrincipalSearchResult<Principal> a =  aUser.GetAuthorizationGroups();

foreach (GroupPrincipal gTmp in a)
{
  Console.WriteLine(gTmp.Name);    
}
5
JPBlanc