Bagaimana cara menulis kueri LDAP untuk menguji apakah pengguna adalah anggota suatu grup?

129

Saya ingin menulis kueri LDAP yang menguji apakah pengguna (sAMAccountName) adalah anggota grup tertentu. Apakah mungkin untuk melakukan itu sehingga saya mendapatkan catatan hasil 0 atau 1?

Saya kira saya bisa mendapatkan semua grup untuk pengguna dan menguji masing-masing untuk kecocokan, tetapi saya bertanya-tanya apakah saya bisa mengemasnya menjadi satu ekspresi LDAP.

Ada ide?

Terima kasih

paul
sumber
Lihat juga pertanyaan seperti secara berulang menanyakan keanggotaan grup LDAP
Franklin Piat

Jawaban:

177

Anda harus dapat membuat kueri dengan filter ini di sini:

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

dan ketika Anda menjalankannya terhadap server LDAP Anda, jika Anda mendapatkan hasilnya, pengguna Anda "yourUserName" Anda memang anggota grup "CN = YourGroup, OU = Pengguna, DC = YourDomain, DC = com

Coba dan lihat apakah ini berhasil!

Jika Anda menggunakan C # / VB.Net dan System.DirectoryServices, cuplikan ini harus melakukan trik:

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

Peringatan: ini hanya akan menguji keanggotaan grup langsung, dan itu tidak akan menguji keanggotaan dalam apa yang disebut "grup utama" (biasanya "cn = Pengguna") di domain Anda. Itu tidak menangani keanggotaan bersarang, misalnya Pengguna A adalah anggota Grup A yang merupakan anggota Grup B - fakta bahwa Pengguna A benar-benar anggota Grup B juga tidak tercermin di sini.

Marc

marc_s
sumber
1
Sudah mencoba, tetapi masih belum berhasil untuk saya. Haruskah 'OU = Pengguna' atau 'OU = Grup' di klausa memberOf?
paul
3
Ini adalah permintaan saya: (& (objectClass = orang) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Grup, OU = MYTOWN, OU = Jerman, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN benar-benar selama itu. Saya setuju bahwa itu harus berhasil. Terima kasih telah membantu!
paul
3
Saat itu saya menghapus tanda kutip tunggal setelah anggota dan saya sekarang mendapatkan hasilnya! Terima kasih
paul
2
Jawaban yang bagus. tetapi harus ditunjukkan bahwa itu hanya akan bekerja di server LDAP yang mempertahankan atribut 'memberOf'. Teknik yang lebih umum adalah mengambil objek grup dan memeriksa atribut UniqueMember, roleOccupant, dll. Untuk DN pengguna, tergantung pada skema yang digunakan objek grup.
Marquis of Lorne
1
@Gunslinger Nama dan nilai atribut LDAP tidak peka huruf besar-kecil, dan DN juga tidak, tetapi AD memiliki aturan sendiri ...
Marquis of Lorne
35

Jika Anda menggunakan OpenLDAP (yaitu slapd) yang umum di server Linux, maka Anda harus mengaktifkan overlay anggota untuk dapat mencocokkan dengan filter menggunakan atribut (memberOf = XXX).

Selain itu, setelah Anda mengaktifkan overlay, itu tidak memperbarui atribut memberOf untuk grup yang ada (Anda harus menghapus grup yang ada dan menambahkannya kembali). Jika Anda mengaktifkan overlay untuk memulainya, ketika database kosong maka Anda harus OK.

Telford Tendys
sumber
8
Tautan ke halaman yang menjelaskan cara mengaktifkan overlay anggota akan berguna, kurasa.
Gokhan Sari
5
Tutorial yang bekerja untuk saya: schenkels.nl/2013/03/... @Telford Tendrys, dude Anda menyelamatkan hidup saya dengan pemberitahuan ini tentang kelompok-kelompok yang sudah ada. Terimakasih banyak!
ŁukaszBachman
21

Saya akan menambahkan satu hal lagi untuk jawaban Marc: Atribut memberOf tidak dapat berisi wildcard, jadi Anda tidak bisa mengatakan sesuatu seperti "memberof = CN = SPS *", dan berharap untuk menemukan semua grup yang dimulai dengan "SPS".

Bill Brinkley
sumber
Terima kasih atas informasinya. Saya sudah berusaha melakukan apa yang Anda katakan tidak bisa dilakukan. Bagaimana saya bisa melakukan itu dengan PHP? Apakah mungkin mendapatkan hasil yang sama dengan cara lain? untuk menemukan semua grup dimulai dengan SPS dan kemudian apa pun ... Saya selalu dapat mengambil semuanya dan mengulang array saya kemudian mencocokkan pertandingan dengan CN yang saya inginkan, tetapi saya lebih suka mencarinya secara langsung jika memungkinkan.
ODelibalta
15

Anda harus menetapkan basis permintaan Anda ke DN pengguna yang bersangkutan, lalu mengatur filter Anda ke DN grup yang Anda tanyakan apakah mereka anggota. Untuk melihat apakah jdoe adalah anggota grup kantor, maka kueri Anda akan terlihat seperti ini:

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

Jika Anda ingin melihat SEMUA grup yang menjadi anggotanya, minta saja atribut 'anggota' dalam pencarian Anda, seperti ini:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
gpayne_007
sumber