Your 2nd search is wrong. Change "sub" to "base".
Also, whenever you are searching you should check your results. i.e.:
my $changeentry = $changeconn->search("$baseDN", "base", "$userDN");
unless ($changeentry) {
die( $changeconn->getErrorCode ?
"Error searching directory: " . $changeconn->getErrorString . "\n" :
"No match found for dn $baseDN\n"
);
# End example
Hth...
Cheers,
Dave K.
Kent Perrier wrote:
> Rich Megginson wrote:
> >
> > Kent Perrier wrote:
> >
> > > On 12/19/2001 11:11 AM, Jim McCullars wrote:
> > >
> > > > [EMAIL PROTECTED] wrote:
> > > >
> > > > : my $changeentry = $changeconn->search($baseDN, "sub", "($userDN)");
> > > >
> > > > This line is the problem. "($userDN)" is not a valid search filter, so
> > > > there is no result for $changeentry in the next line. If you have unique
> > > > UIDs, pick out the UID from the DN and replace your search filter with
> > > > "(uid=$uid)" or something like that.
> > > >
> > > > HTH...
> > >
> > > No, this doesn't help :(
> >
> > But did you try it? The previous poster was correct.
>
> Yes I did.
>
> >
> > > If you look at my origional post, the error is not in the bind
> > > operation. The error occures when I attempt to update the userPassword
> > > attribute with the new password.
> >
> > The error occurs when you try to "dereference" a "null" pointer. In this case,
>$changeentry is null, so you get an error doing
> > $changeentry->{userPassword}
> > Even if that succeeds, you will get an error with the conn->update operation
>because all of the other required fields of
> > changeentry will be null as well.
>
> Here is the output of my code:
>
> [~/jd]$ ./ldapchange jt950001 win98 a
> username = jt950001
> Password = win98
> new password = a
> Define anonymous connection.
> Starting search
> Search done
> LDAPServer is seawolf
> LDAPPort is 389
> userDN is uid=jt950001,ou=people, o=jdnet
> Can't use string ("") as a HASH ref while "strict refs" in use at
> ./ldapchange line 62.
> Password is win98[~/jd]$
>
> and here is the code:
>
> [~/jd]$ cat ldapchange
> #!/usr/local/bin/perl
>
> use warnings;
> use strict;
> use Mozilla::LDAP::Conn;
>
> my $username = $ARGV[0];
> my $currentUserPassword = $ARGV[1];
> my $newpassword = $ARGV[2];
> print "username = $username \n";
> print "Password = $currentUserPassword \n";
> print "new password = $newpassword\n";
>
> my $baseDN = "o=jdnet";
> my $AdminbindDN = "cn=admin,o=jdnet";
> my $AdminbindDNpassword = "password";
> my $LDAPServer = "seawolf";
> my $LDAPPort = "389";
>
> #first, do an anonymous bind to find the user's DN
> print "Define anonymous connection.\n";
> my $kent = new Mozilla::LDAP::Conn($LDAPServer,
> $LDAPPort);
>
> print "Starting search\n";
> my $entry = $kent->search($baseDN, "sub", "(cn=$username)") or die
> "Cannot search directory: $!";
> print "Search done\n";
> my $userDN = "";
> if ((! $entry)) {
> die "User not found: $!";
> } else {
> while ($entry) {
> my $currentuserDN = $entry->{dn};
> #print "currenentuserDN is $currentuserDN\n";
> my @dn = split(/,/,$currentuserDN);
> #print "dn[1] is $dn[1]\n";
> # if ($dn[1] =~ /Citrix/) {
> # } else {
> # $userDN = $currentuserDN;
> # print "userDN is set.\n";
> # }
> if ($dn[1] !~ /Citrix/) {
> $userDN = lc($currentuserDN);
> }
> $entry = $kent->nextEntry();
> }
> }
> $kent->close;
> #print "UserDN = $userDN\n";
> die "No userDN" unless ($userDN);
> print "LDAPServer is $LDAPServer
> LDAPPort is $LDAPPort
> userDN is $userDN
> Password is $currentUserPassword";
> my $changeconn = new Mozilla::LDAP::Conn($LDAPServer,
> $LDAPPort,
> $userDN,
> $currentUserPassword);
> die "Cannot bind: $!" unless($changeconn);
> my $changeentry = $changeconn->search("$baseDN", "sub", "$userDN");
> $changeentry->{userPassword} = [ "$newpassword" ];
> die "Cannot update password" unless($changeconn->update($changeentry));
> print "Password updated\n";
> $changeconn->close;
> [~/jd]$
>
> Any more clues?
>
> Kent
> --
> I would like to electrocute everyone who uses the word 'fair' in
> connection with income tax policies.
> -- William F. Buckley