사용자가 그룹의 구성원인지 테스트하기 위해 LDAP 쿼리를 작성하는 방법은 무엇입니까?


129

사용자 (sAMAccountName)가 특정 그룹의 구성원인지 테스트하는 LDAP 쿼리를 작성하려고합니다. 결과 레코드가 0 또는 1이되도록 할 수 있습니까?

나는 사용자를 위해 모든 그룹을 가져 와서 각각의 그룹이 일치하는지 테스트 할 수 있다고 생각하지만 하나의 LDAP 표현식으로 묶을 수 있는지 궁금합니다.

어떤 아이디어?

감사


또한 같은 질문을 참조하십시오 재귀 쿼리 LDAP 그룹 구성원을
프랭클린 PIAT에게

답변:


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'여야합니까?
paul

3
이것은 내 쿼리입니다 : (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Germany, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN은 정말 길다. 나는 그것이 작동 해야 한다는 것에 동의합니다 . 도움을 주셔서 감사합니다!
paul

3
변덕에 나는 memberof 후에 작은 따옴표를 제거하고 이제 결과를 얻습니다! 감사합니다
paul

2
좋은 대답입니다. 그러나 'memberOf'속성을 유지 관리하는 LDAP 서버에서만 작동한다는 점을 지적해야합니다. 보다 일반적인 기술은 그룹 개체가 사용하는 스키마에 따라 그룹 개체 를 가져 와서 사용자 DN의 uniqueMember, roleOccupant 등 속성을 검사하는 것입니다.
Lorne의 후작

1
@Gunslinger LDAP 속성 이름과 값은 대소 문자를 구분하지 않으며 DN도 아니지만 AD에는 자체 규칙이 있습니다.
Lorqui Marques of

35

Linux 서버에서 일반적인 OpenLDAP (예 : slapd)를 사용하는 경우 (memberOf = XXX) 속성을 사용하여 memberof 오버레이가 필터와 일치 할 수 있도록해야합니다.

또한 오버레이를 활성화하면 기존 그룹에 대한 memberOf 속성이 업데이트되지 않습니다 (기존 그룹을 삭제하고 다시 추가해야 함). 오버레이가 시작되도록 설정 한 경우 데이터베이스가 비어있을 때 정상이어야합니다.


8
오버레이 멤버를 활성화하는 방법을 설명하는 페이지에 대한 링크가 유용 할 것입니다.
Gokhan Sari

5
나를 위해 일한 튜토리얼 : schenkels.nl/2013/03/… @Telford Tendrys, 친구 당신은 기존 그룹에 대한이 통지로 내 목숨을 구했습니다. 많은 감사합니다!
ŁukaszBachman

21

Marc의 답변에 한 가지 더 추가하겠습니다. memberOf 속성은 와일드 카드를 포함 할 수 없으므로 "memberof = CN = SPS *"와 같은 말을 할 수 없으며 "SPS"로 시작하는 모든 그룹을 찾을 것으로 예상합니다.


그 정보에 감사드립니다. 나는 당신이 할 수없는 말을하려고했습니다. PHP로 어떻게 할 수 있습니까? 다른 방법으로 동일한 결과를 얻을 수 있습니까? 모든 그룹이 SPS로 시작한 다음 무엇이든 찾기 위해 ... 항상 모든 것을 잡고 내 배열을 반복 한 다음 원하는 CN에 일치하도록 preg 일치하지만 가능한 경우 바로 검색하는 것을 선호합니다.
ODelibalta

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.