Schrift
[thread]3632[/thread]

Daten eines Users aus dem AD auslesen: Userdaten aus AD auslesen

Leser: 4


<< >> 6 Einträge, 1 Seite
it12lsp
 2005-10-24 18:22
#33706 #33706
User since
2005-10-24
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe folgendes Problem / Anliegen:

Ich möchter per Perl zu einem bestimmten User aus dem AD auslesen. z.B. Email-Adresse und Telefonnummer.

Habe dazu folgendes Script geschrieben, das die Daten des aktuell angemeldeten Benutzers ausliest:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Win32::OLE;

my $sysinfo = Win32::OLE->new('ADSystemInfo') || die ("Can't get sysinfo: ".Win32::OLE->LastError()."\n");
my $usr=$sysinfo->{UserName};

my $AdsPath = "LDAP://".$usr;
   
my $adsuser = Win32::OLE->GetObject($AdsPath) || die ("Can't find user: ".Win32::OLE->LastError()."\n");

print "UserID: $adsuser->{samAccountName}\n";
print "Name: $adsuser->{displayName}\n";
print "Telefon: $adsuser->{telephoneNumber}\n";
print "Email: $adsuser->{EmailAddress}\n";
print "Office: $adsuser->{physicalDeliveryOfficeName}\n";


So nun das Problem, wie lese ich nun die Daten eines beliebigen anderen Benutzers aus, ohne dessen CN zu kennen?

Danke schon mal für die Info!

Gruß
Christian
it12lsp
 2005-10-26 15:51
#33707 #33707
User since
2005-10-24
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

habe durch langes recherchieren folgende Lösung selbst gefunden:

Code: (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
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 $userid ='userid'; # Search User-ID

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)(samAccountname=$userid))"
);

$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 MS 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 User Objekte zum Beispiel in der OU someou liegen, dann ab da starten, dann geht die Suche schneller. Als Filter legt man dann noch objectclass=user fest, damit nur User Objekte gefunden werden.

Die liest man dann einfach aus.

Wie die AD-Attribute heissen, kann man hier: http://www.kouti.com/tables/userattributes.htm nachlesen.

Also bei mir hat es funktioniert!

Gruß
Christian\n\n

<!--EDIT|it12lsp|1130327519-->
Strat
 2005-11-23 18:18
#33708 #33708
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich verwende fuer AD nur sehr ungern Net::LDAP, weil es da beim schreiben arge Probleme mit Sonderzeichen gibt (LDAPv2 funktioniert witzigerweise recht gut). Beim Lesen ist das allerdings kein Problem, es gibt ja CPAN:Encode...

Eine reine ADSI-Loesung ueber den globalen Katalog koennte folgendermaszen aussehen (wenn der PC in der Domain haengt):
Code: (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
use Win32::OLE;
$Win32::OLE::Warn = 3;

my @attrs = qw(ADsPath cn sn givenName samAccountName displayName telephoneNumber
mail physicalDeliveryOfficeName facsimileTelephoneNumber);

my $searchString = "GC://dc=myDomain,dc=de;(&(objectClass=user)(sn=Mayer));" .
join(",", @attrs) . ";SubTree";

my $conn = Win32::OLE->new("ADODB.Connection");
$conn->{Provider} = "ADsDSOObject";
$conn->Open("ADSI Provider");
if (my $error = Win32::OLE->LastError) { die "Error in connect: $error\n"; }

my $adoCmd = Win32::OLE->new('ADODB.Command');
$adoCmd->{ActiveConnection} = $conn;
$adoCmd->{CommandText} = $searchString;
$adoCmd->Properties->{'Page Size'} = 50;

my $rs = Win32::OLE->new('ADODB.RecordSet');
$rs->Open( {Source => $adoCmd} );

while (not $rs->EOF()) {
my %object = map {
$attr[$_] => $rs->Fields($_)->{Value}
} 0..$#attr;
# mach was mit %object, z.B.
foreach my $attr (sort keys %object) { print "$attr => $object{$attr}\n" }

$rs->MoveNext;
} # while

$conn->Close();

(Fehlerabfrage habe ich nur eine getippt; die anderen sehen eh fast identisch aus)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sequester01
 2006-10-10 01:05
#33709 #33709
User since
2006-10-02
7 Artikel
BenutzerIn
[default_avatar]
Ich hatte mal versucht den code von it12lsp zu verwenden, scheitere aber kläglich. Ich erhalte immer die Fehlermeldung: In order this operation a succesful bind must be completed on the connection.
Nur bekomme ich die nicht hin.
Was habe ich: W2k3 AD Domäne = "hallo.de", darin eine "OU=vertrieb" angelegt. darin einen user = "user1" mit passwort = "user1". Der Server hört gerne auf denNamen "Server01"
Mein Code:
Code: (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
use strict;
use Net::LDAP;
use Data::Dumper;


my %all_users;

############################################
# Bind to LDAP                             #
############################################
my $ldap = Net::LDAP->new( 'server01.hallo.de' ) or die "$@";
my $mesg = $ldap->bind( 'dc=hallo, dc=de',
password => 'user1'
);
$mesg = $ldap->search( # perform a search
base => "DC=hallo, DC=de",
filter => "(&(objectclass=user)(samAccountname=user1))"
);

$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);


Er bricht ab bei der Zeile:
Code: (dl )
$mesg->code && die $mesg->error;


Wenn ich ldp.exe verwende, kann ich auf Tree dc=hallo, dc=de gehen und einen Bind mit user1 (pwd=user1) durchführen. Vor dem Bind werde ich mit fast einer identischen Information im ldp Fenster hingewiesen, wie ich als Fehler aus demPerl-Skript erhalte.
Sieht jemand was ich falsch mache?
Achso: Das Perlskript führe ich auf einem angemeldeten XP-PC aus, der in der Domäne hallo.de hängt und mit user1 angemeldet ist. Mit ldq habe ich auch nur eine Verbindung von "dc=hallo, dc=de" ohne "ou=vertrieb". Geht mit ldp - warum auch nicht...

Danke im voraus,

Seq
Strat
 2006-10-11 11:37
#33710 #33710
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
my $mesg = $ldap->bind( 'dc=hallo, dc=de',
password => 'user1'
);

dc=hallo,dc=de ist kein Benutzer, sondern die domain selbst; bei der BindDn musst du den distinguishedName eines Benutzers angeben, also z.B. cn=Administrator,cn=Users,dc=hallo,dc=de
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2006-10-11 11:40
#33711 #33711
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nebenbei: AD gibt fuer suchen maximal 1000 objekte zurueck; wenn du mehr willst, musst du paged read verwenden; das geht bei Net::LDAP z.B. mit CPAN:Net::LDAP::Control::Paged
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 6 Einträge, 1 Seite



View all threads created 2005-10-24 18:22.