Làm cách nào để viết truy vấn LDAP để kiểm tra xem người dùng có phải là thành viên của một nhóm không?


129

Tôi muốn viết mộ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ể không. Có thể làm điều đó để tôi nhận được 0 hoặc 1 hồ sơ kết quả không?

Tôi đoán rằng tôi có thể nhận được 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ó thành một biểu thức LDAP không.

Có ý kiến ​​gì không?

Cảm ơn


Câu trả lời:


177

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

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

và khi bạn chạy nó với máy chủ LDAP của bạn, nếu bạn nhận được 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 điều này làm việc!

Nếu bạn sử dụng C # / VB.Net và System.DirectoryService, đoạn mã này sẽ thực hiện thủ thuật:

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ưu ý: điều này sẽ chỉ kiểm tra tư cách thành viên nhóm ngay lập tức và nó sẽ không kiểm tra tư cách thành viên trong cái được gọi là "nhóm chính" (thường là "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
Đã thử, nhưng vẫn không làm việc cho tôi. Nó nên là 'OU = Users' hay 'OU = Groups' trong mệnh đề MemberOf?
paul

3
Đây là truy vấn của tôi: (& (objectClass = person) (sAMAccountName = USERID) (Memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Đức, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) DN thực sự dài đến thế. Tôi đồng ý rằng nó nên làm việc. Cảm ơn đã giúp đỡ!
paul

3
Trong một ý thích bất chợt, tôi đã loại bỏ các trích dẫn sau khi thành viên và bây giờ tôi nhận được một kết quả! Cảm ơn
paul

2
Câu trả lời tốt. nhưng cần chỉ ra rằng nó sẽ chỉ hoạt động trong các máy chủ LDAP duy trì thuộc tính 'MemberOf'. Kỹ thuật tổng quát hơn là tìm nạp các đối tượng nhóm và kiểm tra các thuộc tính uniqueMember, RoleOccupant, v.v. của nó cho DN của người dùng, tùy thuộc vào lược đồ mà đối tượng nhóm sử dụng.
Hầu tước Lorne

1
@Gunlinger Tên và giá trị thuộc tính LDAP không phân biệt chữ hoa chữ thường và cũng không phải là DN, nhưng AD có quy tắc riêng ...
Hầu tước Lorne

35

Nếu bạn đang sử dụng OpenLDAP (tức là slapd) phổ biến trên các máy chủ Linux, thì bạn phải kích hoạt lớp phủ thành viên để có thể khớp 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 các thuộc tính thành viên 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 vào). Nếu bạn đã bật lớp phủ để bắt đầu, khi cơ sở dữ liệu trống thì bạn sẽ ổn.


8
Một liên kết đến một trang giải thích cách kích hoạt lớp phủ thành viên sẽ hữu ích, tôi đoán vậy.
Gokhan Sari

5
Hướng dẫn làm việc cho tôi: schenkels.nl/2013/03/ Cách @Telford Tendrys, anh bạn đã cứu mạng tôi bằng thông báo này về các nhóm có sẵn. Cảm ơn nhiều!
ukaszBachman

21

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


Cảm ơn bạn đã cung cấp thông tin đó. Tôi đã cố gắng làm những gì bạn nói không thể được thực hiện. 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? để tìm tất cả các nhóm bắt đầu với 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 sau đó kết hợp với CN tôi muốn nhưng tôi thích chỉ tìm kiếm nó ngay nếu có thể.
ODelibalta

15

Bạn phải đặt cơ sở truy vấn của mình thành DN của người dùng đang đề cập, sau đó đặt bộ lọc của bạn thành DN của nhóm mà bạn đang tự hỏi liệu họ có phải là thành viên của không. Để xem jdoe có phải là thành viên của nhóm văn phòng không thì truy vấn của bạn sẽ 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 mà anh ấy là thành viên, chỉ yêu cầu thuộc tính 'thành viên' trong tìm kiếm của bạn, như thế này:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.