Net::LDAPを使ってldapsearchをすると割と特殊な形で返ってくるので、より(個人的に)直感的でわかりやすい形で戻すサブルーチンを考えてみました。
1つの属性で複数の値が入るものについては議論の余地はあると思います。
Net::LDAPでは特に(おそらく)汎用性を高めるためにcnのような必ず1つの値しか入らないようなものもすべて配列で返ってくるので、扱いがメンドイと個人的には思っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
sub getLDAPEntry { my ( $info, $obj ) = @_; #infoはサーバー情報 #objは検索条件の無名ハッシュ my $result = {}; my $ldap = Net::LDAP->new("$info->{'server'}"); my $ret = $ldap->bind("$info->{'user'}",password=>"$info->{'pass'}",version=>3); my $res = $ldap->search ( base => "$info->{'base'}", scope => "sub", filter => "$obj->{'searchString'}", attrs => $obj->{'attrs'} ); @arrayAttributes = ( 'memberOf','member','memberUid' ); #1つ以上の値が入ることがわかっている属性 foreach my $entry ( $res->entries ) { my @a = $entry->attributes(); my $cn = $entry->get_value('cn'); foreach $b (@a) { if ( inArray($b,@arrayAttributes) ) { push(@{$result->{$cn}->{$b}},$entry->get_value($b)); } else { $result->{$cn}->{$b} = $entry->get_value($b); } } $result->{$cn}->{'dn'} = $entry->{'asn'}->{'objectName'}; } return $result; } sub inArray { my $element = shift; my @list = @_; for ( @list ) { return 1 if $_ eq $element; } return 0; } |