Chris, My "Final Solution" from the last email does work fine, but to follow up on your last email I've included a bit more info below on responses from AD.
3 Test Cases ================= I've outlined three types of user below for testing against Active Directory. All three examples result in $message->code()==0 when you do a bind($dn,'noauth'=>'1'). However, the only case where a subsequent search operation will be successful is case 1). 1) A user who exists and has a blank password DN: cn=Joe,ou=London,o=axomic Password: '' 2) A user who doesn't exist DN: cn=Joe,ou=London,o=axomic 3) A user who exists and has a NON-blank password DN: cn=Joe,ou=London,o=axomic Password: 'jo3lond' #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Net::LDAP; my $dn = 'cn=Joe,ou=London,o=axomic'; my $ldapServer = new Net::LDAP('ldap://localhost', 'port' =>'389', 'timeout'=>'2'); my $message = $ldapServer->bind($dn,'noauth'=>'1'); print 'Code: '.$message->code()."\n"; print Dumper($message); Turning Debugging On ========================= $ldapServer->debug(12); All three cases above get the same response from AD (see below). So I guess there is nothing Net::LDAP can do to differentiate them! Net::LDAP=HASH(0x8e2b69c) received: 0000 16: SEQUENCE { 0006 1: INTEGER = 1 0009 7: [APPLICATION 1] { 000F 1: ENUM = 0 0012 0: STRING = '' 0014 0: STRING = '' 0016 : } 0016 : } The 3 Test Cases With ldapsearch ===================================== The following does both a bind and a search and so unfortunately we can't just compare it directly to a bind() with Net::LDAP. ldapsearch -h 'localhost' -x -w '' -D 'cn=Joe,ou=London,o=axomic' -s base -b 'cn=Joe,ou=London,o=axomic' As we would expect, case 1 is the only one that's successful. My ldapsearch isn't compiled with LDAP_DEBUG on so I can't test what it sends and receives for the bind in the 3 cases. ========= OpenAsset - Image Management for Architects, Designers & Engineers Axomic Ltd http://www.axomic.com