+[+] New Feature: Ability to delete a group $adldap->group()->delete($groupName);

+[+] New Feature: #30 Add magic __isset method to adLDAPCollection

+[-] Feature Change: #34 A better recursiveGroups() implementation

+[-] Feature Change: Changed $adldap->user()->getLastLogon from using the lastLogin attribute to lastLogonTimestamp. The difference between the two is detailed here http://blogs.technet.com/b/askds/archive/2009/04/15/the-lastlogontimestamp-attribute-what-it-was-designed-for-and-how-it-works.aspx

+[-] Bug Fix: $adldap->user()->getLastLogon('mySAMAccountName') produced a PHP error 'Non-static method adLDAPUtils::convertWindowsTimeToUnixTime() should not be called statically'

+[+] New feature: Version 4 is a complete re-write of the class and is backwards incompatible with version 3 and below. Groups, users, contacts, etc have been seperated into seperate classes and can be called like this $adldap->user()->modify(); or $adldap->group()->create();

+

+Version 3.3.2

+-------------

+[+] New feature: Move the user to a new OU using user_move() function

+[-] Bug fix: Force user_info to find objectCategory of person as if a sAMAccountName also exists in a group it will return that group. (Tracker ID:3006096)

+[-] Bug fix: Return false for user_info if the user does not exist

+[-] Bug fix: user_info, checks for for a "count" value that not exist in $entries array if "memberof" isn't passed in $fields array. (Tracker ID:2993172)

+[-] Bug fix: In authenticate() if user authentication fails function returns and does not rebind with admin credentials - so the other funcions don't work anymore as $this->_bind === false. (Tracker ID:2987887)

+[-] Bug fix: When calling $ldap->user_modify('user', array("expires"=>0)) the function fails due to the value being 0. Changed to isset (Tracker ID:3036726)

+[-] Bug fix: When calling user_info allow the username to be either a sAMAccountName or userPrincipalName attribute

+

+

+Version 3.3.1

+-------------

+[-] Bug fix: Prevent empty $username and $password in authenticate from falling through to the default administrator login

+

+Version 3.3

+-----------

+

+[+] New feature: Calling adLDAP without LDAP support in PHP will now throw an adLDAPException

+[+] New feature: Specifying a NULL $_base_dn will now automatically attempt to detect the base_dn from your domain controller

+[+] New feature: Most user objects can now be queried using a user's GUID as well as their username (samAccountName). Set the $isGUID optional parameter to true. To obtain a user's GUID either use the username2guid() function or decodeGuid()

+[+] New function: username2guid($username) will return a string representation of the GUID for a given username

+[+] New function: decodeGuid($binaryGuid) will convert a binary GUID to a string

+[+] New function: find_base_dn() will return the base_dn from your domain controller

+[+] New function: get_root_dse($attributes) will return root domain controller configuration attributes such as the default naming context, current DC time, etc

+[+] New function: exchange_servers($attributes) will return a list of Exchange servers in your domain

+[+] New function: exchange_storage_groups($exchangeServer, $attributes, $recursive) will return a list of Storage groups on any given Exchange server. Setting $recursive to true (or inheriting from the $_recursive_groups setting will automatically query the databases within a storage group)

+[+] New function: exchange_storage_databases($storageGroup, $attributes) will return a list of Databases in any given storage group on any given Exchange server