จะเขียนแบบสอบถาม LDAP เพื่อทดสอบว่าผู้ใช้เป็นสมาชิกของกลุ่มได้อย่างไร


129

ฉันต้องการเขียนคำค้นหา LDAP ซึ่งจะทดสอบว่าผู้ใช้ (sAMAccountName) เป็นสมาชิกของกลุ่มใดกลุ่มหนึ่งหรือไม่ เป็นไปได้ไหมที่ฉันจะได้รับ 0 หรือ 1 บันทึกผล?

ฉันเดาว่าฉันสามารถรับกลุ่มทั้งหมดสำหรับผู้ใช้และทดสอบแต่ละกลุ่มเพื่อหาคู่ แต่ฉันสงสัยว่าฉันสามารถบรรจุเป็นนิพจน์ LDAP เดียวได้หรือไม่

ความคิดใด ๆ ?

ขอบคุณ


คำตอบ:


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 เป็นสมาชิกของกลุ่ม A ซึ่งเป็นสมาชิกของกลุ่ม B - ข้อเท็จจริงที่ว่าผู้ใช้ A เป็นสมาชิกของกลุ่ม B จริง ๆ เช่นกันไม่ได้รับการสะท้อนที่นี่

มาร์ค


1
พยายามแล้ว แต่ก็ยังไม่ได้ผลสำหรับฉัน ควรเป็น 'OU = Users' หรือ 'OU = Groups' ในอนุประโยค memberOf?
พอล

3
นี่คือคำถามของฉัน: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Germany, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN นั้นยาวจริงๆ ฉันยอมรับว่ามันควรจะได้ผล ขอบคุณสำหรับการช่วยเหลือ!
พอล

3
ด้วยความตั้งใจที่ฉันลบคำพูดเดียวหลังจากสมาชิกของฉันและตอนนี้ฉันได้รับผลลัพธ์! ขอบคุณ
paul

2
คำตอบที่ดี. แต่ควรชี้ให้เห็นว่ามันจะใช้ได้เฉพาะในเซิร์ฟเวอร์ LDAP ที่มีแอตทริบิวต์ "memberOf" เทคนิคทั่วไปมากขึ้นคือการดึงอ็อบเจ็กต์กลุ่มและตรวจสอบแอ็ตทริบิวต์ uniqueMember, roleOccupant ฯลฯ สำหรับ DN ของผู้ใช้โดยขึ้นอยู่กับว่าสคีมาที่อ็อบเจ็กต์กลุ่มใช้อะไร
Marquis of Lorne

1
ชื่อและค่าแอตทริบิวต์ LDAP ของ @Gunslinger ไม่คำนึงถึงขนาดตัวพิมพ์และไม่ใช่ DN แต่ AD มีกฎของตัวเอง ...
Marquis of Lorne

35

หากคุณใช้ OpenLDAP (เช่น slapd) ซึ่งเป็นเรื่องปกติในเซิร์ฟเวอร์ Linux คุณต้องเปิดใช้งานการซ้อนทับสมาชิกเพื่อให้สามารถจับคู่กับตัวกรองโดยใช้แอตทริบิวต์ (memberOf = XXX)

นอกจากนี้เมื่อคุณเปิดใช้งานโอเวอร์เลย์แล้วจะไม่อัปเดตแอตทริบิวต์ memberOf สำหรับกลุ่มที่มีอยู่ (คุณจะต้องลบกลุ่มที่มีอยู่ออกและเพิ่มกลับเข้าไปใหม่อีกครั้ง) หากคุณเปิดใช้งานการซ้อนทับเพื่อเริ่มต้นเมื่อฐานข้อมูลว่างเปล่าคุณควรจะโอเค


8
ลิงก์ไปยังหน้าที่อธิบายวิธีการเปิดใช้งานการซ้อนทับสมาชิกจะเป็นประโยชน์ฉันเดา
Gokhan Sari

5
บทแนะนำที่ใช้ได้ผลสำหรับฉัน: schenkels.nl/2013/03/… @Telford Tendrys คุณช่วยชีวิตฉันด้วยประกาศเกี่ยวกับกลุ่มที่มีอยู่ก่อนแล้ว ขอบคุณมาก!
ŁukaszBachman

21

ฉันจะเพิ่มอีกอย่างในคำตอบของ Marc: แอตทริบิวต์ memberOf ต้องไม่มีสัญลักษณ์แทนดังนั้นคุณจึงไม่สามารถพูดว่า "memberof = CN = SPS *" ได้และคาดว่าจะพบทุกกลุ่มที่ขึ้นต้นด้วย "SPS"


ขอบคุณสำหรับข้อมูลนั้น ฉันพยายามทำในสิ่งที่คุณบอกว่าไม่สามารถทำได้ ฉันจะทำสิ่งนั้นด้วย PHP ได้อย่างไร เป็นไปได้หรือไม่ที่จะได้ผลลัพธ์แบบเดียวกันในทางอื่น? เพื่อค้นหาทุกกลุ่มเริ่มต้นด้วย SPS แล้วอะไรก็ตาม ... ฉันสามารถคว้าทุกอย่างและวนซ้ำอาร์เรย์ของฉันได้เสมอจากนั้นจับคู่ preg กับ CN ที่ฉันต้องการ แต่ฉันต้องการเพียงแค่ค้นหาให้ตรงถ้าเป็นไปได้
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.