Thread Active Directory Abfrage (LDAP?)
(10 answers)
Opened by Faldaar at 2007-09-28 17:39
vielleicht ein bisschen was in subroutinen auslagern? Ich baue mir dafuer meist sogar module, z.B. MyApp::LdapConnect, MyApp::LdapSearch und MyApp::LdapEntry, die mir eine Abstraktionsschicht geben.
PageSize wuerde ich irgendwo zwischen 200 und 500 ansetzen. Warum? Keine Ahnung ;-) Naja, manche Verzeichnisdienste haben auch ein SizeLimit von 500... nebenbei: ich will dir use strict; und (anstelle von -w) use warnings; ans Herz legen. Ohne ist Perl meiner Meinung nach kaum kontrollierbar, und wenn wo ein Fehler auftritt, sucht man sich haeufig einen Wolf. Zu Deinem Code: Code: (dl
)
1 my @domainControllers = ( $dc1, $dc2 ); spart den ganzen Quargel mit $noldapserver. Und die Option onerror koennte auch interessant sein, siehe Net::LDAP. Code: (dl
)
search: attrs => "proxyAddresses", Attrs erwartet eine arrayreferenz, keinen String; und hier musst du entweder alle Attribute angeben, auf die du spaeter zugreifen willst, oder einfach weglassen, dann kannst du auf alle nicht-operationalen attribute zugreifen (braucht halt ein wenig mehr RAM). Code: (dl
)
attrs => [ 'cn', 'proxyAddresses', ... ] Code: (dl
)
foreach my $entry ( $mesg->entries ) { da bevorzuge ich den speicherschonenderen Weg: Code: (dl
)
while( my $entry = $mesg->shift_entry ) { Vor allem bietet dies auch die Moeglichkeit, aus der Suche einen Iterator zu machen und eine Menge des Codes in eine Sub auszulagern, z.B. so auf die Art Code (perl): (dl
)
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 package MyApp::LdapSearch; use warnings; use strict; sub search { my( $class, $ldapConnection, %args ) = @_; my $self = bless( {}, $class ); my $pageSize = 200; # falls kein PageSize mitgegeben, verwende 200 $pageSize = delete $args{pageSize} if exists $args{pageSize}; $self->{page} = Net::LDAP::Control::Paged->new( size => $pageSize ); $args{control} = [ $page ]; # speichere den kram zur spaeteren verwendung in getNextEntry $self->{ldapConnection} = $ldapConnection; $self->{searchArgs} = \%args; $self->{result} = $ldapConnection->search( %args ); return $self; } sub getNextEntry { my( $self ) = @_; my $result = $self->{result}; if( my $entry = $self->{result}->shift_entry ) { return $entry; } my( $resp ) = $result->control( LDAP_CONTROL_PAGED ) or return; my $cookie = $resp->cookie or return; # Set cookie in paged control $self->{page}->cookie( $cookie ); $self->{result} = $self->{ldapConnection}->search( $self->{searchArgs} ); if( my $entry = $self->{result}->shift_entry ) { return $entry; } return; } # und im Hauptprogramm dann sowas wie: my $result = MyApp::LdapSearch->search( $ldap, base => $hqbase, filter => $filter, attrs => \@attributes, scope => 'sub', ); while( my $entry = $result->getNextEntry ) { my $name = $entry->get_value( 'cn' ); # ... } # while Dies bitte nicht 1:1 uebernehmen, es soll nur die Idee demonstrieren. Es ist weder getestet noch hat es Fehlerbehandlung. Anstelle von $self->{page} = ... auch besser Getter/Setter verwenden: $self->page( ... ), usw. perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/ |