perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 28
Click for quality!




11.02.2012 / 20:44

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragActive Directory auslesen
Seitenanfang
Hallo Jungs,
ich habe ein Kleines Problem:
Ich möchte gerne die Daten aus einer Telefonliste (im csv Format) von unerer Firma mit den Benutzern in unserer Domain abgleichen. Dazu brauche ich allerdings die UserId, den Vorname und den Nachname aus der AD. Der User ist ja unter cn abgespeichert. Dort weiß ich aber auch nicht wie ich diesen auslesen kann. So baue ich die Verbindung auf:

my $ldap = Net::LDAP->new( 'server1' ) or die "$@";

die Verbindung wird auch aufgebaut. Aber wie kann ich nun die Daten auslesen? komm nich weiter..hab schon in den Newsgroups usw. geguckt...nichts gefunden.

thx 4 help

Datum: 13.09.2005-14:23

Beitragre: Active Directory auslesen
Seitenanfang
du willst wohl in etwa sowas:

#!/usr/bin/perl -w
use strict;
use Net::LDAP;
use Data::Dumper;

###############################################
# Account to bind to LDAP (Active Directory) #
# non-priviledged (could even be a guest account)
###############################################
my $account = 'cn=someuser, ou=someou, DC=my, DC=ad_domain, DC=com';
my $pwd = 'secret';

my %all_users;

############################################
# Bind to LDAP and query for DHCP servers #
############################################
my $ldap = Net::LDAP->new( 'mydc.ad_domain.com' ) or die "$@";
my $mesg = $ldap->bind( $account,
password => $pwd
);
$mesg = $ldap->search( # perform a search
base => "ou=someou, DC=my, DC=ad_domain, DC=com",
filter => "(&(objectclass=user))"
);

$mesg->code && die $mesg->error;

##################################################
# retrieve the properties from the results #
##################################################
my $max = $mesg->count;
for ( my $i = 0 ; $i < $max ; $i++ ) {
my $entry = $mesg->entry ( $i );
my $userid = $entry->get_value('samAccountname');
$all_users{$userid}{'first_name'} = $entry->get_value( 'givenName' );
$all_users{$userid}{'last_name'} = $entry->get_value( 'sn' );
$all_users{$userid}{'phone'} = $entry->get_value( 'telephoneNumber' );
}

################################
# unbind from LDAP #
################################
$mesg = $ldap->unbind;

print Dumper(\%all_users);

Wichtig ist, falls der Server kein anonymes Binden zulässt, erstmal sich mit einenm minder-privilegierten Account "anzumelden"

Dazu braucht man dessen cn (siehe oben), man kann ihn auch im M$ MMC "Users and Computers" sehen, wenn man "Advanced View" aktiviert und dann auf den "Object" Reiter eines Users geht.

Dann muss man festlegen, wo man starten will mit der Suche. Wenn alle Deine User Objekte zum Beispiel in der OU someou liegen, dann starte direkt da, dann geht die Suche schneller. Als Filter legst Du dann noch objectclass=user fest, damit nur User Objekte gefunden werden.

Die liest Du dann einfach aus.

Wie die Attribute heissen, kannst Du hier: http://www.kouti.com/tables/userattributes.htm nachlesen.

Gruss,
svenXY

Datum: 15.09.2005-09:29

Beitragre: Active Directory auslesen
Seitenanfang
Cool danke :) Endlich konnte mir mal wer helfen :) Werds gleich mal ausprobieren, wenn ich ziet hab...

mfg
roach

Datum: 15.09.2005-10:27

Beitragre: Active Directory auslesen
Seitenanfang
Hi,
Also ich habe nun meinen Domänebenutzer als cn genommen und halt mein Domänepasswort. Aber nun kommt diese Fehlermeldung:

0000202B: RefErr: DSID-03100698, data 0, 1 access points
ref 1: 'srv-002'

srv-002 is der server wo die ad drauf läuft.
was nun?

Datum: 16.09.2005-11:37

Beitragre: Active Directory auslesen
Seitenanfang
hmmm,

hast Du meinen code 1:1 kopiert und ausprobiert?
Bist Du sicher, dass Dein cn korrekt ist?

Bei mir funktioniert der Code einwandfrei und auch wenn ich Fehler reinmache (Falsches pw , falscher cn usw.) bekomme ich nicht Deine Fehlermeldung.

BTW: ich programmiere hier unter Linux. Ist ein bei Dir Windows? Vielleicht liegt es daran...

Datum: 16.09.2005-12:21

Beitragre: Active Directory auslesen
Seitenanfang
Hi,
Also ich Arbeite under Windows. Der Server ist ein 2000der. Zu dumm dass ich selber mit der AD noch kaum - garnicht gearbeitet habe. Wozu dient denn das ou? cn ist ja der benutzername. klar. aber viel mehr kenn ich mich auch nicht aus. Mein Skript sieht momentan so aus:

#!/usr/bin/perl -w
use strict;
use Net::LDAP;

###############################################
# Account to bind to LDAP (Active Directory) #
# non-priviledged (could even be a guest account)
###############################################
my $account = 'cn=Christopher Boss, ou=someou, DC=her-srv-002';
my $pwd = 'hier das passwort';

my %all_users;

############################################
# Bind to LDAP and query for DHCP servers #
############################################
my $ldap = Net::LDAP->new( 'her-srv-002' ) or die "$@";
my $mesg = $ldap->bind( $account,
password => $pwd
);
$mesg = $ldap->search( # perform a search
base => "ou=someou, DC=her-srv-002",
filter => "(&(objectclass=user))"
);

$mesg->code && die $mesg->error;

##################################################
# retrieve the properties from the results #
##################################################
my $max = $mesg->count;
for ( my $i = 0 ; $i < $max ; $i++ ) {
my $entry = $mesg->entry ( $i );
my $userid = $entry->get_value('samAccountname');
$all_users{$userid}{'first_name'} = $entry->get_value( 'givenName' );
$all_users{$userid}{'last_name'} = $entry->get_value( 'sn' );
$all_users{$userid}{'phone'} = $entry->get_value( 'telephoneNumber' );
}

################################
# unbind from LDAP #
################################
$mesg = $ldap->unbind;

ich hasse sowas ;)

Datum: 16.09.2005-12:57

Beitragre: Active Directory auslesen
Seitenanfang
Ah hab da was gefunden und bin jez nen Schritt weiter. Jetzt kommt aber ne andere Meldung:

0000208D: NameErr: DSID-031001BD, problem 2001 (NO_OBJECT), data 0, best match of:
'DC=nbv-uga,DC=local'

Google kann mir mal wieder nix drüber sagen. Warum findet der das Object denn nich?! oO

Datum: 16.09.2005-13:28

Beitragre: Active Directory auslesen
Seitenanfang
ich glaube, Du hast deinen Root-DN falsch, bzw. Deinen cn:

Wenn Deine AD-Domain z.B. roach.com ist, dann ist der DN "DC=roach, DC=com". Es reicht ganz und gar nicht, bei DC einfach den Namend des DC servers anzugeben.

zum code:


...
my $account = 'cn=Christopher Boss, ou=someou, DC=her-srv-002'; # HIER: korrekten DC (siehe oben), gibt es "someou" bei Dir? Das war nur ein Beispiel...
my $pwd = 'hier das passwort';

my %all_users;

############################################
# Bind to LDAP and query for DHCP servers #
############################################
my $ldap = Net::LDAP->new( 'her-srv-002' ) or die "$@"; # ein FQDN wäre besser...
my $mesg = $ldap->bind( $account,
password => $pwd
);
$mesg = $ldap->search( # perform a search
base => "ou=someou, DC=her-srv-002", # WIEDER: korrekten LDAP Pfad
filter => "(&(objectclass=user))"
);


Dann sollte es besser gehen

Gruss,
Sven

Datum: 16.09.2005-14:53

Beitragre: Active Directory auslesen
Seitenanfang
Es läuuuuuft :D geil :) was willse? ^^ n bier? :P

Muss jetzt nur noch den Filter so umbauen, dass der mir nur einen bestimmten User raussucht. Hab vor und nachname in ner exceltablle. Ausgelsen usw. nur der filter...wie bauch ich den auf? so gehts nit:
filter => "(&(objectclass=user)&(first_name=".$vorname.")&(last_name=".$nachname."))"
sollte doch eigentlich so i.o. sein oder?

Datum: 20.09.2005-11:44

Beitragre: Active Directory auslesen
Seitenanfang
hi,
schön, dass es jetzt geht...

der filter müsste so aussehen:


(&(objectclass=user)(first_name=$vorname)(last_name=$nachname))

denn das & am Anfang verbindet bereits alle drei mit "und".

Aber dann würdest Du Active Directory für jeden einzelnen Username einmal komplett durchsuchen.

Ich denke, es ist besser, Du gehst insgesamt einmal für alle durch und baust Dir einen Hash, wie in meinem obigen Code.

Dann baust Du einen zweiten Hash aus den Excel-Daten und dann vergleichst Du die beiden und machst was-weiss-ich-was mit den Unterschieden.

Gruss,
svenXY

Datum: 20.09.2005-11:59

Beitragre: Active Directory auslesen
Seitenanfang
Ja würd ich auch lieber in ein Hash schreiben aber jez kommt immer diese meldung:
Sizelimit exceeded at Y:\Infrastruktur\Programme\Perl\AD Abgleich\import.pl line 53, <FILE> line 1336.

womit ich einfach mal vermute, dass es zu viele Einträge gibt in der Ad. Also muss ich wohl nach den einzelnen Usern suchen. Brauch ja zu jedem Eintrag in der Telefonliste den Loginnamen...

Datum: 21.09.2005-08:20

-






-
-