사용자 (sAMAccountName)가 특정 그룹의 구성원인지 테스트하는 LDAP 쿼리를 작성하려고합니다. 결과 레코드가 0 또는 1이되도록 할 수 있습니까?
나는 사용자를 위해 모든 그룹을 가져 와서 각각의 그룹이 일치하는지 테스트 할 수 있다고 생각하지만 하나의 LDAP 표현식으로 묶을 수 있는지 궁금합니다.
어떤 아이디어?
감사
답변
이 필터를 사용하여 쿼리를 만들 수 있어야합니다.
(&(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의 답변에 한 가지 더 추가하겠습니다. 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**