my ( $page, $ctrl, $cookie, $i );
Lớp kiểm soát trang kết quả (Paged Results control) yêu cầu một thông số duy nhất: là số nội dung lớn nhất có thể trình bày trong 1 trang. Trong ví dụ này, bạn sẽ set số này là 4.
$page = Net::LDAP::Control::Paged->new( size => 4 );
Để xác minh rằng việc tìm kiếm được hoàn thành trong các trang, ta sẽ thêm một hàm đếm và in giá trị của nó tại cuối mỗi lần lặp. Vòng lặp sẽ chạy cho tới khi tất cả các nội dung đều được trả lại từ server, không thì sẽ có lỗi.
$i = 1; while (1) {
Sau khi đối tượng Net::LDAP::Control::Paged được khởi tạo, nó phải được bao gồm trong lệnh
search( ). Thông số control chấp nhận một mảng của đối tượng kiểm soát để áp dụng cho yêu cầu. $msg = $ldap->search( base => $dn, scope => "sub", filter => "(cn=$ARGV[0])", callback => \&ProcessSearch, control => [ $page ] );
Việc sử dụng kiểm soát LDAP trong việc tìm kiếm không ảnh hướng đến các mã trả về tìm kiếm, do đó vẫn cần thiết xử lý các referrals hoặc lỗi giao thức:
## Check for a referral.
}
## Any other errors? elsif ($msg->code( )) { $msg->error( ); last;
}
Cuối cùng, bạn cần có các cookie được trả về từ server. Giá trị này phải được bao gồm trong yêu cầu tìm kiếm tiếp theo để server biết được khách hàng muốn tiếp tục từ vị trí nào trong danh sách nội dung.
## Handle the next set of paged entries.
( $ctrl ) = $msg->control( LDAP_CONTROL_PAGED ) or last;
$cookie = $ctrl->cookie( ) or last;
$page->cookie( $cookie );
Tại cuối vòng lặp, in số trang.
print "Paged Set [$i]\n"; $i++;
}} }
Đầu ra:
$ ./pagedsearch.pl '*' | egrep '(dn|Paged)' dn:CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Gerald W. Carter,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=TelnetClients,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Administrator,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [1] dn:CN=Guest,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=TsInternetUser,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=krbtgt,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Domain Computers,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [2] dn:CN=Domain Controllers,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Schema Admins,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Enterprise Admins,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Cert Publishers,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [3] dn:CN=Domain Admins,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Domain Users,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Domain Guests,CN=Users,DC=ad,DC=plainjoe,DC=org
dn:CN=Group Policy Creator Owners,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [4]
dn:CN=RAS and IAS Servers,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=DnsAdmins,CN=Users,DC=ad,DC=plainjoe,DC=org
dn:CN=DnsUpdateProxy,CN=Users,DC=ad,DC=plainjoe,DC=org
Có thể trong tương lai, cần thiết phải thực hiện các kiểm soats mới. Các hàm khởi tạo một đối tượng Net::LDAP::Control có thể có 3 thông số:
type
Chuỗi ký tự đại diện OID. critical
Nếu thông số này không được xác định, nó giả sử là FASLE, và server sẽ được tự do xử lý các yêu cầu mặc dù việc kiếm soát không thực hiện.
value
Thông tin tùy chọn được yêu cầu bởi việc kiểm soát. Đinh dạng của giá trị thông số này là duy nhất cho mỗi kiểm soát và được định nghĩa bởi các nhà thiết kế kiểm soát. Có thể không có thông tin thêm nào được yêu cầu bởi việc kiểm soát..
Việc sử dụng phổ biến nhất của đối tượng Net::LDAP::Control là xóa các đối tượng referral trong thư mục. Mặc định thì server thư mục sẽ từ chối việc xóa hoặc sửa đổi một đối tượng referral và gởi tới khách hàng URL của tham chiếu LDAP. Việc kiếm soát thực tế cần được cập nhật hoặc loại bỏ một nội dung referral phụ thuộc vào nhà cung cấp.
Server OpenLDAP hỗ trợ kiểm soát Manage DSA IT được mô tả trong RFC 3088. Kiểm soát này thông tin cho server rằng khách hàng dự định thao tác với các referral như là một nội dung bình thường. Không có một yêu cầu nào đó là hành động quan trọng hay không quan trọng. Hoạt động này là để cho khách hàng thực hiện kiếm soát.
Việc tạo ra một đối tượng Net::LDAP::Control đại diện ManageDSAIT chỉ đơn giản là liên quan tới việc xác định OID. Chúng ta xác định rằng server hỗ trợ kiểm soát, không có thông tin tùy chọn nào được yêu cầu:
$manage_dsa = Net::LDAP::Control->(
type => "2.16.840.1.113730.3.4.2", critical => 1 );
Net::LDAP::Constant định nghĩa một số tên mà bạn có thể dùng như viết tắt và OID không nhớ; chắc chắn rằng phải kiểm tra modun này trước khi viết code như trên. Các dòng code đó có thể viết lại như sau:
$manage_dsa = Net::LDAP::Control->(
type => LDAP_CONTROL_MANAGEDSAIT, critical => 1 );
Việc kiểm soát này có thể được bao gồm trong một hoạt động sửa đổi:
$msg = $ldap->modify(
"ou=department,dc=plainjoe,dc=org", replace =>
{ ref => "ldap://ldap2.plainjoe.org/ou=dept,dc=plainjoe,dc=org" }, control => $manage_dsa )