Robert, I have been using Net::LDAP to create accounts one at a time for about a year now. Based on the error you are seeing, I suspect that you are forgetting to add the correct objectClass that contains the attribute you want to store the attribute in.
Searching your code, I don't see you adding any objectClasses. You just createa DN, and then add the the password to the userPassword attribute. I don't know what schema(s) you are using, but for my OpenLDAP server, I would need to add the objectClass 'top', and then the objectClass of 'person', 'organizationalPerson', or 'inetOrgPerson' before I can add the userPassword attribute. You can find out exactly what you need by inspecting your own schema. Here's a sample of my code. I hope it's still readable after it gets line-wrapped by our mail clients. $entry = Net::LDAP::Entry->new($dn, objectClass =>['top', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'inetLocalMailRecipient', 'eduPerson' ], uid => $uid, uidNumber => $uidnumber, gidNumber => $gidnumber, cn => $cn, sn => $sn, gecos => $gecos, homeDirectory => $homedir, loginShell => $loginshell, mail => $mail, mailHost => $mailhost, mailRoutingAddress => $mailroutingaddress ); -- Prentice Robert Threet wrote: > I have a working Net::LDAP::Entry program for adding users so I decided > to gut it to create a userPassword changer. > > I keep getting "Error changing password: no objectClass attribute". > > I cannot find examples doing simple one-at-a-time adds like this. All I > can find are examples using arrays and hashes and cannot seem to > translate it to this. Any tips? > > sub resetMacAcct($newuid,$pw,$newpw){ > $time = localtime time; > $theirIP = $q->remote_addr(); > # create mac account > $macldapsvr = "XXX.XXX.XXX.XXX"; > $macADMdn = "uid=admin,cn=people,dc=lib-mac,dc=local"; > $macadmpwd ="XXXXXXXX"; > $macBind = Net::LDAP->new($macldapsvr, > port => 389, > debug => 0, > timeout => 60, > version => 3 > ) or die "Couldn't connect to Mac LDAP server: $@"; > my $conn = $macBind->bind(dn => $macADMdn, > password => $macadmpwd); > if ($conn->code){ > die 'Cannot bind:' . $conn->error . "\n";} > > my $macEntry = Net::LDAP::Entry->new; > $newdn="uid=" . $username . ",cn=people,dc=lib-mac,dc=local"; > $macEntry->dn($newdn); > # added sha1 hashing > $salt=XX; > $ctx = Digest::SHA1->new; > $ctx->add($newpw); > $ctx->add($salt); > $newMacpw = '{SSHA}' . encode_base64($ctx->digest . $salt ,''); > $macEntry->replace(userPassword => $newMacpw); > my $add = $macBind->add($macEntry); > die "Error changing password: " . $add->error()."\n" if > $add->code(); > print LOG "$time;$cn;$theirIP;$username\n"; > $macBind->unbind(); > } > > >