Change Password in Active Directory using LDAP/PHP/IIS/SSL

24,086

Just two pieces of advice:

  1. During the AD CS setup, in the Specify Setup Type page, click Enterprise, and then click Next.
  2. AD service is supposed to take himself his own certificate, but if it works like in Windows server 2003, you must reboot the server to make it work. Perhaps just stop and restart the service in W2K8 R2.

Afer that, you can just try to build a certificate and install it on the AD service account, like you can find it done with ADAM.

Share:
24,086
compcentral
Author by

compcentral

Updated on July 07, 2020

Comments

  • compcentral
    compcentral almost 4 years

    First of all, this may be less of a programming question and more of a how do I configure LDAPS question, but here goes...

    Background Info:

    I have two Windows 2008 R2 servers. One is a domain controller (DC) with Active Directory (AD) that I want to communicate with via LDAP. This one is named TestBox.TestDomain.local. The other server is running IIS, PHP (with ldap and openssl), and mySQL.

    What is/isn't working:

    I can successfully connect to the DC unsecured over port 389 and read/write data to AD. What I can't do is change or set user passwords since this requires a secure connection using LDAPS (LDAP w/ SSL) over port 636.

    What I need help with:

    I have tried installing Active Directory Certificate Services (AD CS) and configuring the DC to act as a Certificate Authority (CA) using information found here: http://technet.microsoft.com/en-us/library/cc770357(WS.10).aspx but no matter what I try I can't get a connection over LDAPS to work.

    Sample Code:

    Creating the LDAP Connection

    function ldapConnect(){
        $ip = "100.200.300.400";  // WAN IP goes here;
        $ldap_url = "ldap://$ip";
        $ldaps_url = "ldaps://$ip";
        $ldap_domain = 'testdomain.local';
        $ldap_dn = "dc=testdomain,dc=local";
    
        // Unsecure - WORKS
        $ldap_conn = ldap_connect( $ldap_url ) or die("Could not connect to LDAP server ($ldap_url)");
        //alternate connection method 
        //$ldap_conn=ldap_connect( $ip, 389 ) or die("Could not connect to LDAP server (IP: $ip, PORT: 389)");  
    
        // Secure - DOESN'T WORK
        //$ldap_conn = ldap_connect( $ldaps_url ) or die("Could not connect to LDAP server ($ldaps_url)");
        //alternate connection method 
        //$ldap_conn=ldap_connect( $ip, 636 ) or die("Could not connect to LDAP server (IP: $ip, PORT: 636)");  
    
        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
    
        $username = "AdminUser";
        $password = "AdminPass"; 
    
        // bind using admin username and password
        // could also use dn... ie. CN=Administrator,CN=Users,DC=TestDomain,DC=local
        $result = ldap_bind($ldap_conn, "$username@$ldap_domain", $password ) or die("<br>Error: Couldn't bind to server using supplied credentials!");
    
        if($result){
            return $ldap_conn;
        }else{
            die("<br>Error: Couldn't bind to server using supplied credentials!");
        }
    }
    

    Adding a New User to Active Directory

    function ldapAddUser($ldap_conn, $ou_dn, $firstName, $lastName, $username, $pwdtxt, $email){
        $dn = "CN=$firstName $lastName,".$ou_dn;
    
        ## Create Unicode password
        $newPassword = "\"" . $pwdtxt . "\"";
        $len = strlen($newPassword);
        $newPassw = "";
        for($i=0;$i<$len;$i++) {
            $newPassw .= "{$newPassword{$i}}\000";
        }
    
        $ldaprecord['cn'] = $firstName." ".$lastName;
        $ldaprecord['displayName'] = $firstName." ".$lastName;
        $ldaprecord['name'] = $firstName." ".$lastName;
        $ldaprecord['givenName'] = $firstName;
        $ldaprecord['sn'] = $lastName;
        $ldaprecord['mail'] = $email;
        $ldaprecord['objectclass'] = array("top","person","organizationalPerson","user");
        $ldaprecord["sAMAccountName"] = $username;
        //$ldaprecord["unicodepwd"] = $newPassw;
        $ldaprecord["UserAccountControl"] = "544"; 
    
        $r = ldap_add($ldap_conn, $dn, $ldaprecord);
    
        // set password .. not sure if I need to base64 encode or not
        $encodedPass = array('userpassword' => base64_encode($newPassw));
        //$encodedPass = array('unicodepwd' => $newPassw);
    
        echo "Change password ";
        if(ldap_mod_replace ($ldap_conn, $dn, $encodedPass)){ 
            echo "succeded";
        }else{
            echo "failed";
        }
    }
    
    • Jerry Saravia
      Jerry Saravia almost 11 years
      Hey, just wanted to know if this worked for you in the end and what you had to do. I am having very similar issues. Did you just restart the windows server?
    • compcentral
      compcentral almost 11 years
      It's I wound up changing how I approached this issue. In the end, I set passwords using an LDIF script.
  • out_sid3r
    out_sid3r about 11 years
    what has this to do with anything?