2009-06-23 28 views
97

Tôi muốn viết truy vấn LDAP để kiểm tra xem người dùng (sAMAccountName) có phải là thành viên của một nhóm cụ thể hay không. Có thể làm điều đó để tôi có được bản ghi kết quả 0 hoặc 1 không?Cách viết truy vấn LDAP để kiểm tra xem người dùng có phải là thành viên của nhóm không?

Tôi đoán tôi có thể nhận tất cả các nhóm cho người dùng và kiểm tra từng nhóm cho một trận đấu nhưng tôi đã tự hỏi liệu tôi có thể gói nó vào một biểu thức LDAP hay không.

Bất kỳ ý tưởng nào?

Cảm ơn

+0

Xem thêm những câu hỏi như [Đệ quy truy vấn nhóm LDAP thành viên] (http://stackoverflow.com/q/7826927/1260896) –

Trả lời

132

Bạn sẽ có thể tạo ra một truy vấn với bộ lọc này ở đây:

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

và khi bạn chạy mà chống lại máy chủ LDAP của bạn, nếu bạn nhận được một kết quả, người dùng của bạn "yourusername" thực sự là một thành viên của nhóm "CN = YourGroup, OU = Users, DC = YOURDOMAIN, DC = com

Hãy thử và xem nếu làm việc này!

Nếu bạn sử dụng C#/VB.Net và S ystem.DirectoryServices, đoạn này nên làm như lừa:

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

Lời cảnh báo: điều này sẽ chỉ kiểm tra cho thành viên nhóm ngay lập tức, và nó sẽ không kiểm tra cho các thành viên trong cái gọi là "nhóm chính" (thường " cn = Người dùng ") trong miền của bạn. Nó không xử lý các thành viên lồng nhau, ví dụ: Người dùng A là thành viên của Nhóm A là thành viên của Nhóm B - thực tế là Người dùng A thực sự là thành viên của Nhóm B cũng không được phản ánh ở đây.

Marc

+1

Cố gắng, nhưng vẫn không làm việc cho tôi. Có nên là 'OU = Người dùng' hoặc 'OU = Nhóm' trong mệnh đề memberOf không? – paul

+0

DN của tên nhóm của bạn là gì? Nó phụ thuộc vào những gì bạn thực sự muốn kiểm tra ...... –

+0

Bạn cần phải đặt trong các giá trị thực tế thực sự trong trường hợp của bạn - công cụ của tôi chỉ là trình giữ chỗ demo! –

17

tôi sẽ thêm một điều nữa để câu trả lời của Marc: Thuộc tính memberOf không thể chứa ký tự đại diện, vì vậy bạn không thể nói điều gì đó như "memberOf = CN = SPS *", và mong đợi nó để tìm tất cả các nhóm bắt đầu bằng "SPS".

+0

Cảm ơn bạn cho thông tin đó. Tôi đã cố gắng làm những gì bạn nói không thể làm được. Làm thế nào tôi có thể làm điều đó với PHP? Có thể có kết quả tương tự theo cách khác không? để tìm tất cả các nhóm bắt đầu bằng SPS và sau đó bất cứ điều gì ... Tôi luôn có thể lấy tất cả mọi thứ và lặp lại mảng của mình rồi khớp với CN mà tôi muốn nhưng tôi thích tìm kiếm nó ngay nếu có thể. – ODelibalta

+0

'memberOf = CN = SPS *' hoạt động cho tôi – tarikakyol

29

Nếu bạn đang sử dụng OpenLDAP (tức là slapd) phổ biến trên máy chủ Linux, thì bạn phải bật lớp phủ của thành viên để có thể đối sánh với bộ lọc bằng thuộc tính (memberOf = XXX).

Ngoài ra, khi bạn bật lớp phủ, nó không cập nhật thuộc tính memberOf cho các nhóm hiện có (bạn sẽ cần xóa các nhóm hiện có và thêm lại chúng). Nếu bạn bật lớp phủ để bắt đầu, khi cơ sở dữ liệu trống thì bạn nên OK.

+7

Một liên kết đến trang giải thích cách bật lớp phủ của thành viên sẽ hữu ích tôi đoán. –

+3

Hướng dẫn làm việc cho tôi: http://www.schenkels.nl/2013/03/how-to-setup-openldap-with-memberof-overlay-ubuntu-12-04/ @Telford Tendrys, anh bạn đã lưu cuộc sống của tôi với thông báo này về các nhóm đã tồn tại từ trước. Cảm ơn nhiều! –

9

Bạn phải đặt cơ sở truy vấn của mình thành DN của người dùng được đề cập, sau đó đặt bộ lọc của bạn thành DN của nhóm bạn đang tự hỏi liệu họ có phải là thành viên hay không. Để xem nếu jdoe là thành viên của các nhóm văn phòng sau đó truy vấn của bạn sẽ trông giống như thế này:

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

Nếu bạn muốn xem tất cả các nhóm ông là một thành viên của, chỉ cần yêu cầu chỉ là thuộc tính 'memberOf' trong bạn tìm kiếm, như thế này:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof** 
Các vấn đề liên quan