179 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY 
 | 
						|
 * Version 4.0.4
 | 
						|
 * 
 | 
						|
 * PHP Version 5 with SSL and LDAP support
 | 
						|
 * 
 | 
						|
 * Written by Scott Barnett, Richard Hyland
 | 
						|
 *   email: scott@wiggumworld.com, adldap@richardhyland.com
 | 
						|
 *   http://adldap.sourceforge.net/
 | 
						|
 * 
 | 
						|
 * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
 | 
						|
 * 
 | 
						|
 * We'd appreciate any improvements or additions to be submitted back
 | 
						|
 * to benefit the entire community :)
 | 
						|
 * 
 | 
						|
 * This library is free software; you can redistribute it and/or
 | 
						|
 * modify it under the terms of the GNU Lesser General Public
 | 
						|
 * License as published by the Free Software Foundation; either
 | 
						|
 * version 2.1 of the License.
 | 
						|
 * 
 | 
						|
 * This library is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
 * Lesser General Public License for more details.
 | 
						|
 * 
 | 
						|
 * @category ToolsAndUtilities
 | 
						|
 * @package adLDAP
 | 
						|
 * @subpackage Folders
 | 
						|
 * @author Scott Barnett, Richard Hyland
 | 
						|
 * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
 | 
						|
 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
 | 
						|
 * @revision $Revision: 97 $
 | 
						|
 * @version 4.0.4
 | 
						|
 * @link http://adldap.sourceforge.net/
 | 
						|
 */
 | 
						|
require_once(dirname(__FILE__) . '/../adLDAP.php');
 | 
						|
 | 
						|
/**
 | 
						|
* FOLDER / OU MANAGEMENT FUNCTIONS
 | 
						|
*/
 | 
						|
class adLDAPFolders {
 | 
						|
    /**
 | 
						|
    * The current adLDAP connection via dependency injection
 | 
						|
    * 
 | 
						|
    * @var adLDAP
 | 
						|
    */
 | 
						|
    protected $adldap;
 | 
						|
    
 | 
						|
    public function __construct(adLDAP $adldap) {
 | 
						|
        $this->adldap = $adldap;
 | 
						|
    }
 | 
						|
    
 | 
						|
    /**
 | 
						|
    * Delete a distinguished name from Active Directory
 | 
						|
    * You should never need to call this yourself, just use the wrapper functions user_delete and contact_delete
 | 
						|
    *
 | 
						|
    * @param string $dn The distinguished name to delete
 | 
						|
    * @return bool
 | 
						|
    */
 | 
						|
    public function delete($dn){ 
 | 
						|
        $result = ldap_delete($this->adldap->getLdapConnection(), $dn);
 | 
						|
        if ($result != true) { 
 | 
						|
            return false; 
 | 
						|
        }
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    
 | 
						|
    /**
 | 
						|
    * Returns a folder listing for a specific OU
 | 
						|
    * See http://adldap.sourceforge.net/wiki/doku.php?id=api_folder_functions
 | 
						|
    * 
 | 
						|
    * @param array $folderName An array to the OU you wish to list. 
 | 
						|
    *                           If set to NULL will list the root, strongly recommended to set 
 | 
						|
    *                           $recursive to false in that instance!
 | 
						|
    * @param string $dnType The type of record to list.  This can be ADLDAP_FOLDER or ADLDAP_CONTAINER.
 | 
						|
    * @param bool $recursive Recursively search sub folders
 | 
						|
    * @param bool $type Specify a type of object to search for
 | 
						|
    * @return array
 | 
						|
    */
 | 
						|
    public function listing($folderName = NULL, $dnType = adLDAP::ADLDAP_FOLDER, $recursive = NULL, $type = NULL) 
 | 
						|
    {
 | 
						|
        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
 | 
						|
        if (!$this->adldap->getLdapBind()) { return false; }
 | 
						|
 | 
						|
        $filter = '(&';
 | 
						|
        if ($type !== NULL) {
 | 
						|
            switch ($type) {
 | 
						|
                case 'contact':
 | 
						|
                    $filter .= '(objectClass=contact)';
 | 
						|
                    break;
 | 
						|
                case 'computer':
 | 
						|
                    $filter .= '(objectClass=computer)';
 | 
						|
                    break;
 | 
						|
                case 'group':
 | 
						|
                    $filter .= '(objectClass=group)';
 | 
						|
                    break;
 | 
						|
                case 'folder':
 | 
						|
                    $filter .= '(objectClass=organizationalUnit)';
 | 
						|
                    break;
 | 
						|
                case 'container':
 | 
						|
                    $filter .= '(objectClass=container)';
 | 
						|
                    break;
 | 
						|
                case 'domain':
 | 
						|
                    $filter .= '(objectClass=builtinDomain)';
 | 
						|
                    break;
 | 
						|
                default:
 | 
						|
                    $filter .= '(objectClass=user)';
 | 
						|
                    break;   
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            $filter .= '(objectClass=*)';   
 | 
						|
        }
 | 
						|
        // If the folder name is null then we will search the root level of AD
 | 
						|
        // This requires us to not have an OU= part, just the base_dn
 | 
						|
        $searchOu = $this->adldap->getBaseDn();
 | 
						|
        if (is_array($folderName)) {
 | 
						|
            $ou = $dnType . "=" . implode("," . $dnType . "=", $folderName);
 | 
						|
            $filter .= '(!(distinguishedname=' . $ou . ',' . $this->adldap->getBaseDn() . ')))';
 | 
						|
            $searchOu = $ou . ',' . $this->adldap->getBaseDn();
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            $filter .= '(!(distinguishedname=' . $this->adldap->getBaseDn() . ')))';
 | 
						|
        }
 | 
						|
 | 
						|
        if ($recursive === true) {
 | 
						|
            $sr = ldap_search($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
 | 
						|
            $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
 | 
						|
            if (is_array($entries)) {
 | 
						|
                return $entries;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            $sr = ldap_list($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
 | 
						|
            $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
 | 
						|
            if (is_array($entries)) {
 | 
						|
                return $entries;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
    * Create an organizational unit
 | 
						|
    * 
 | 
						|
    * @param array $attributes Default attributes of the ou
 | 
						|
    * @return bool
 | 
						|
    */
 | 
						|
    public function create($attributes)
 | 
						|
    {
 | 
						|
        if (!is_array($attributes)){ return "Attributes must be an array"; }
 | 
						|
        if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
 | 
						|
        if (!array_key_exists("ou_name",$attributes)) { return "Missing compulsory field [ou_name]"; }
 | 
						|
        if (!array_key_exists("container",$attributes)) { return "Missing compulsory field [container]"; }
 | 
						|
        
 | 
						|
        $attributes["container"] = array_reverse($attributes["container"]);
 | 
						|
 | 
						|
        $add=array();
 | 
						|
        $add["objectClass"] = "organizationalUnit";
 | 
						|
        $add["OU"] = $attributes['ou_name'];
 | 
						|
        $containers = "";
 | 
						|
        if (count($attributes['container']) > 0) {
 | 
						|
            $containers = "OU=" . implode(",OU=", $attributes["container"]) . ",";
 | 
						|
        }
 | 
						|
 | 
						|
        $containers = "OU=" . implode(",OU=", $attributes["container"]);
 | 
						|
        $result = ldap_add($this->adldap->getLdapConnection(), "OU=" . $add["OU"] . ", " . $containers . $this->adldap->getBaseDn(), $add);
 | 
						|
        if ($result != true) { 
 | 
						|
            return false; 
 | 
						|
        }
 | 
						|
        
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
?>
 |