!!! Overview An [Example code] we put together to help out with the semantics of a [How To] for adding a user to LDAP ([Microsoft Active Directory] specifically) using [Perl] in the sample. Often the hard part of connecting to AD using LDAP is [determining the FDN|LDAP and Active Directory] of the user to login with. __NOTE:__ We specifically do NOT set a password as [Microsoft Active Directory] requires at least 128 bit SSL do set passwords. {{{ #!/usr/bin/perl use warnings; use strict; use Net::LDAP; use IO::Socket; use IO::Socket::INET; my $base = "CN=Users,DC=mad,DC=yourdomain,DC=com"; my @Attrs = ( "accountexpires", "badpasswordtime", "badpwdcount", "cn", "displayname", "distinguishedname", "givenname", "instancetype", "lastlogoff", "lastlogon", "lastlogontimestamp", "logoncount", "memberof", "name", " objectcategory", "objectclass" ); my $ldapconnect = Net::LDAP->new( "mad.yourdomain.com", version => 3, port => 389 ); print "\n"; my $bind = $ldapconnect->bind( "CN=Administrator,CN=Users,DC=mad,DC=yourdomain,DC=com", password => "secret" ); if ( $bind->code ) { LDAPerror( "Bind: ", $bind ); } print "\n"; my $currentCN = "testFour"; my $currentDN = "CN=".$currentCN.",".$base; my $addrs = addAdUser( $ldapconnect, $currentDN, $currentCN, "User", "User.$currentCN", $currentCN ); if ( $addrs->code ) { LDAPerror( "Bind: ", $addrs ); } # We need to wait a little bit for AD to add the user... print "waiting .."; my $num = 10; while($num--) { sleep(1); print "."; } print "\n"; my $results = LDAPsearch( $ldapconnect, "cn=".$currentCN, \@Attrs, $base ); DisplayResults($results); sub LDAPsearch { my ( $ldap, $searchString, $attrs, $base ) = @_; # if they don't pass a base... set it for them if ( !$base ) { $base = "o=mycompany, c=mycountry"; } # if they don't pass an array of attributes... # set up something for them if ( !$attrs ) { $attrs = [ 'cn', 'mail' ]; } my $sr = $ldap->search( base => "$base", scope => "sub", filter => "$searchString", attrs => $attrs ); } sub DisplayResults { my ($results) = @_; #------------ # # Accessing the data as if in a structure # i.e. Using the "as_struct" method # my $href = $results->as_struct; # get an array of the DN names my @arrayOfDNs = keys %$href; # use DN hashes # process each DN using it as a key foreach (@arrayOfDNs) { print $_, "\n"; my $valref = $$href{$_}; # get an array of the attribute names # passed for this one DN. my @arrayOfAttrs = sort keys %$valref; #use Attr hashes my $attrName; foreach $attrName (@arrayOfAttrs) { # skip any binary data: yuck! next if ( $attrName =~ /;binary$/ ); # get the attribute value (pointer) using the # attribute name as the hash my $attrVal = @$valref{$attrName}; print "\t $attrName: @$attrVal \n"; } print "#-------------------------------\n"; # End of that DN } # # end of as_struct method # #-------- #------------ # # handle each of the results independently # ... i.e. using the walk through method # my @entries = $results->entries; my $entr; foreach $entr (@entries) { print "DN: ", $entr->dn, "\n"; my $attr; foreach $attr ( sort $entr->attributes ) { # skip binary we can't handle next if ( $attr =~ /;binary$/ ); print " $attr : ", $entr->get_value($attr), "\n"; } print "#-------------------------------\n"; } # # end of walk through method #------------ sub LDAPerror { my $unknown = "not known"; my ( $from, $mesg ) = @_; print "Return code: ", $mesg->code; print "\tMessage: ", $mesg->error_name; print " :", $mesg->error_text; print "MessageID: ", $mesg->mesg_id; my $dn = $mesg->dn; if ( !$dn ) { $dn = $unknown; } print "\tDN: ", $dn; #--- # Programmer note: # # "$mesg->error" DOESN'T work!!! # #print "\tMessage: ", $mesg->error; #----- } sub addAdUser { my ( $ldap, $dn, $cn, $sn, $displayName, $givenName ) = @_; $ldap->add( $dn, attr => [ 'cn' => $cn, 'sn' => $sn, 'displayName' => $displayName, 'givenName' => $givenName, 'objectclass' => [ "top", "person", "organizationalPerson", "user" ] ] ); } } }}} !! More Information There might be more information for this subject on one of the following: [{ReferringPagesPlugin before='*' after='\n' }]