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. -- -- Groeten, natxo