Kullanıcının bir grubun üyesi olup olmadığını test etmek için LDAP sorgusu nasıl yazılır?


129

Bir kullanıcının (sAMAccountName) belirli bir grubun üyesi olup olmadığını test eden bir LDAP sorgusu yazmak istiyorum. 0 veya 1 sonuç kaydı almam için bunu yapmak mümkün mü?

Sanırım kullanıcı için tüm grupları alabilirim ve her birini bir eşleşme için test edebilirim, ancak bunu tek bir LDAP ifadesinde paketleyip paketleyemeyeceğimi merak ediyordum.

Herhangi bir fikir?

Teşekkürler


Yanıtlar:


177

Bu filtre ile burada bir sorgu oluşturabilmeniz gerekir:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

ve bunu LDAP sunucunuzda çalıştırdığınızda, bir sonuç alırsanız, "yourUserName" kullanıcınız gerçekten "CN = YourGroup, OU = Users, DC = YourDomain, DC = com grubunun bir üyesidir

Deneyin ve çalışıp çalışmadığını görün!

C # / VB.Net ve System.DirectoryServices kullanıyorsanız, bu kod parçacığı hile yapmalıdır:

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");
}

Dikkatli olun: Bu yalnızca anlık grup üyeliklerini test edecek ve etki alanınızdaki "birincil grup" (genellikle "cn = Kullanıcılar") olarak adlandırılan gruptaki üyeliği test etmeyecektir. İç içe geçmiş üyelikleri işlemez, örneğin Kullanıcı A, Grup B'nin üyesi olan Grup A'nın üyesidir - Kullanıcı A'nın gerçekten Grup B'nin bir üyesi olduğu gerçeği burada yansıtılmaz.

üzüm posası


1
Denedim ama hala benim için çalışmıyor. MemberOf yan tümcesinde 'OU = Kullanıcılar' mı yoksa 'OU = Gruplar' mı olmalı?
paul

3
Bu benim sorgum: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Germany, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN gerçekten o kadar uzun. İşe yaraması gerektiğine katılıyorum . Yardım için teşekkürler!
paul

3
Bir hevesle üye olduktan sonraki tek tırnakları kaldırdım ve şimdi bir sonuç alıyorum! Teşekkürler
paul

2
İyi cevap. ancak bunun yalnızca bir "memberOf" özniteliğini muhafaza eden LDAP sunucularında çalışacağına dikkat edilmelidir. Daha genel teknik, grup nesnesini almak ve grup nesnesinin hangi şemayı kullandığına bağlı olarak kullanıcının DN'si için benzersiz Üye, roleOccupant vb. Özniteliklerini incelemektir.
Marquis of Lorne

1
@Gunslinger LDAP öznitelik adları ve değerleri büyük / küçük harfe duyarlı değildir ve DN'ler de değildir, ancak AD'nin kendi kuralları vardır ...
Marquis of Lorne

35

Linux sunucularında yaygın olan OpenLDAP (yani slapd) kullanıyorsanız, o zaman (memberOf = XXX) özniteliğini kullanarak bir filtreyle eşleşme yapabilmek için overlay üyesini etkinleştirmelisiniz.

Ayrıca, kaplamayı etkinleştirdiğinizde, mevcut gruplar için memberOf özniteliklerini güncellemez (var olan grupları silmeniz ve yeniden eklemeniz gerekir). Bindirmeyi başlatmak için etkinleştirdiyseniz, veritabanı boşaldığında Tamam olmalısınız.


8
Bindirme üyeliğinin nasıl etkinleştirileceğini açıklayan bir sayfaya bağlantı, sanırım yararlı olacaktır.
Gökhan Sarı

5
Benim için çalıştı Öğretici: schenkels.nl/2013/03/... @Telford Tendrys, ahbap sen önceden varolan grupları hakkında bu bildirimle hayatımı kurtardı. Çok teşekkürler!
ŁukaszBachman

21

Marc'ın cevabına bir şey daha ekleyeceğim: memberOf özelliği joker karakterler içeremez, bu yüzden "memberof = CN = SPS *" gibi bir şey söyleyemez ve "SPS" ile başlayan tüm grupları bulmasını bekleyemezsiniz.


Bu bilgi için teşekkürler. Yapılamaz dediğinizi yapmaya çalışıyorum. Bunu PHP ile nasıl yapabilirim? Aynı sonucu başka bir şekilde almak mümkün mü? tüm grupları bulmak için SPS ile başlar ve sonra her neyse ... Her zaman her şeyi alabilirim ve dizimi döngüye sokabilirim, sonra istediğim CN ile eşleşebilirim ancak mümkünse doğrudan aramayı tercih ederim.
ODelibalta

15

Sorgu tabanınızı söz konusu kullanıcının DN'sine ayarlamalı, ardından filtrenizi, üyesi olup olmadıklarını merak ettiğiniz grubun DN'sine ayarlamalısınız. Jdoe'nin ofis grubunun bir üyesi olup olmadığını görmek için sorgunuz şuna benzer:

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)'

Üyesi olduğu TÜM grupları görmek istiyorsanız, aramanızda yalnızca "memberof" özelliğini isteyin, örneğin:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.