Thread Active Directory Abfrage (LDAP?) (10 answers)
Opened by Faldaar at 2007-09-28 17:39

Faldaar
 2007-10-01 12:29
#100173 #100173
User since
2003-11-05
14 Artikel
BenutzerIn
[default_avatar]
Nach viel probieren und googeln habe ich das ganze nun mit Net::LDAP hin bekommen. Ist zwar insgesamt nicht die eleganteste Lösung, aber es läuft und noch dazu ziemlich schnell. Bin nun auf knapp 20 Sekunden wenn auf einem Client ausgeführt, unter 10 Sekunden auf dem DC selber. Damit kann ich sehr gut leben.

Gehe nun so vor:
Hole per LDAP den Benutzer und seine Gruppen.
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
my $noldapserver = 0;
my $ldap = Net::LDAP -> new($dc1) or $noldapserver=1;
if ( $noldapserver == 1 )  {
   $ldap = Net::LDAP -> new($dc2) or die "Error connecting to specified domain controllers $@ \n";
}
my $mesg = $ldap -> bind($user,
                                        password => $passwd
                                        );
$mesg = $ldap -> search( 
                                        base => $base,
                                        filter => "(&(objectclass=user)(samAccountname=*))"
                                        );
# Check for Error Code
if ( $mesg -> code ) {
        &LDAPerror( "Search", $mesg );
}
# Ergebnisanzahl auslesen
my $max = $mesg -> count;

# Ergebnisse durchgehen
for ( my $i = 0; $i < $max; $i++ ) {
        my $entry = $mesg -> entry ( $i );
        my $user = lc( $entry -> get_value( 'samAccountname' ) );
        my @groups = $entry -> get_value('memberOf');
        # weiterer code, u.a. Gruppenprüfung s.u.
}

Dann werden die Gruppen des Benutzers durchlaufen, und verglichen mit einem Hash, der bestimmte Gruppen enthält, die mich interessieren:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
foreach ( @groups ) {
        my $gruppe = $_;
        my @gnamen = split( /,/, $gruppe );
        if ( $gnamen[1] ne "OU=Gruppen"  ) { # es interessieren nur Gruppen unterhalb der OU Gruppen
                next();
        }
        my $grp = ( split( /=/, $gnamen[0] ) )[1];
        if ( $Freigaben{$grp} ) {
                # etwas tun
        }
}


Die Fehlerbehandlung habe ich Beispielhaft nur einmal drin gelassen, alle anderen sehen ähnlich aus.
Wie gesagt sicher nicht die schönste Lösung, aber es erfüllt seinen Zweck und das (wohl langsame) Modul Win32::NetAdmin hat ausgedient.

Martin

Edit: Durch weitere Optimierungen, vor allem in der Programmlogik, auf eine Laufzeit von 1,5 bis 5 Sekunden runter. Gleich mal schauen was man aus dem AD noch so alles raus quetschen kann :)
Es ist schwieriger eine vorgefasste Meinung zu zertrümmern als ein Atom. (Albert Einstein)

View full thread Active Directory Abfrage (LDAP?)