2015-12-11 12:12 GMT+01:00 Natxo Asenjo <natxo.ase...@gmail.com>: > hi, > > I need to get mail enabled groups info from Active Directory. > > AD mail enabled groups (be it distribution or security groups) keeps the > member attributes as distinguishednames > > Example: > > CN=mailgroup,OU=Groep,DC=domain,DC=tld > objectClass: top > objectClass: group > cn: mailgroup > member: CN=user a,OU=staff,dc=domain,dc=tld > member: CN=user b,OU=staff,dc=domain,dc=tld > member: CN=user c,OU=staff,dc=domain,dc=tld > member: CN=user d,OU=staff,dc=domain,dc=tld > > etc > > So in order to get the mail addresses of those users, I need to launch > another query. > > So I first query the mail enabled groups, fast query: > > my $mail_enabled_grps_AD = "(&(objectCategory=group)(mail=*))"; > > # first find enabled accounts to fill @ad_enabled > while (1) { > my $search_ad = $ad_ldap->search( > base => "dc=domain,dc=tld", > scope => "sub", > filter => $mail_enabled_grps_AD, > attr => > [ 'cn', 'member', 'mail', 'proxyaddresess', 'distinguishedname', > ], > control => [$page_ad], > ); > > $search_ad->code && die "error on search ad: $@: " . $search_ad->error; > while ( my $entry = $search_ad->pop_entry() ) { > my $displayname = $entry->get_value('cn'); > my $dn = $entry->get_value('distinguishedname'); > my $mail = $entry->get_value('mail'); > my @members = $entry->get_value('member'); > my @email_addrs = $entry->get_value('proxyaddresses'); > > # fill @ad_enabled > push @ad_mail_enbld_groups, lc $mail; > > my @ad_mails = _from_dn_to_mail(@members); > > # generate hash for hoh_AD > my $rec = { > MAIL => $mail, > MEMBERS => [@members], > MEMBERS_ADDRS => [@ad_mails], > PROXYADDRS => [@email_addrs], > }; > > # assing $rec to %hoh_AD > $hoh_AD{$mail} = $rec; > > } > > my ($resp) = $search_ad->control(LDAP_CONTROL_PAGED) or last; > $cookie_ad = $resp->cookie or last; > $page_ad->cookie($cookie_ad); > } > > If I do not use my @ad_mails = _from_dn_to_mail(@members); then this > snippet runs under 2 seconds. > > If I use it, it takes 2m30secs. > > This is the code in the sub(s): > > sub _get_ad_user_mail { > my ($ad_user) = @_; > my $search_ad = $ad_ldap->search( > base => "dc=domain,dc=tld", > scope => "sub", > filter => > "(&(objectclass=user)(objectcategory=person)(distinguishedname=$ad_user))", > attr => ['mail'], > ); > > $search_ad->code && die "error on search ad: $@: " . $search_ad->error; > for my $entry ( $search_ad->entries ) { > my $ad_user_mail = $entry->get_value('mail'); > return $ad_user_mail; > } > } > > sub _from_dn_to_mail { > my (@members) = @_; > my @ad_mail; > for my $member (@members) { > push @ad_mail, _get_ad_user_mail($member); > } > return @ad_mail; > > } > > > I mean, it works, but is it normal that it's so slow or am I missing > something very obvious? > > Thanks for you input. >
You should do a search directly on the member DN (with scope base) instead of requestind the suffix in sub _get_ad_user_mail : sub _get_ad_user_mail { my ($ad_user) = @_; my $search_ad = $ad_ldap->search( base => $ad_user, scope => "base", filter => "(objectclass=*)", attr => ['mail'], ); $search_ad->code && die "error on search ad: $@: " . $search_ad->error; for my $entry ( $search_ad->entries ) { my $ad_user_mail = $entry->get_value('mail'); return $ad_user_mail; } } Clément.