Synchronisation Active Directory

De Wiki de Jordan LE NUFF
< Technique‎ | PHP‎ | Scripts
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de présenter un script PHP permettant de se connecter à un Active Directory pour y récupérer une liste d'utilisateurs sous forme de tableau.

get_ADusers.php

Ce script, pouvant se nommer get_ADusers.php, contient, à ce jour, le contenu suivant :

<?php
function get_ADusers(array $ADgroups = array())
{
	/////////////////////////////////////////////////////////////////
	// Cette fonction a pour but de retourner une liste            //
	// d'utilisateurs sous forme d'un tableau (array) $users       //
	//                                                             //
	// Cette fonction prend en argument la liste des groupes sous  //
	// forme d'un tableau (array) $ADgroups                        //
	//                                                             //
	// Cette fonction va interroger l'Active Directory et          //
	// rechercher les utilisateurs appartenants aux groupes donnés //
	/////////////////////////////////////////////////////////////////

	///////////////////////////////
	// Déclaration des variables //
	///////////////////////////////

	// Variable contenant la liste des utilisateurs à retourner
	$users = array();

	//////////////////////////////////////
	// Fin de déclaration des variables //
	//////////////////////////////////////

	////////////////
	// Paramètres //
	////////////////

	// Serveur AD
	$ADserver = 'ldap://myADserver.myDomain.com';

	// Port du serveur AD
	$ADport = '389';

	// Utilisateur autorisé à interroger l'AD
	$ADuser = 'CN=myQueryADuser,OU=AppUsers,OU=Users,DC=myDomain,DC=com';

	// Mot de passe de l'utilisateur autorisé à interroger l'AD
	$ADpassword = 'xxxxxxxxxxxxxx';

	// Branche de base de l'AD à partir de laquelle faire la recherche
	$ADbaseDN = 'DC=myDomain,DC=com';

	////////////////////////
	// Fin des paramètres //
	////////////////////////


	/////////////////////////
	// Recherche dans l'AD //
	/////////////////////////

	// Construction du filtre de recherche de l'AD
	// Si qu'un seul groupe défini
	if (count($ADgroups) == 1)
		// Définition d'un filtre unique
		$ADfilter = "(cn=$ADgroups[0])";
	// Sinon, si plusieurs groupes définis
	elseif (count($ADgroups) > 1)
	{
		// Définition d'un filtre multiple
		$ADfilter = "(|";
		foreach ($ADgroups as $group)
			$ADfilter .= "(cn=$group)";
		$ADfilter .= ")";
	}
	
	// Connexion à l'AD
	$ADcnx = ldap_connect($ADserver);
	
	// Définition des options de la connexion à l'AD
	ldap_set_option($ADcnx, LDAP_OPT_REFERRALS, 0);
	ldap_set_option($ADcnx, LDAP_OPT_PROTOCOL_VERSION, 3);
	
	// Authentification sur l'AD
	$ADauth = ldap_bind($ADcnx, $ADuser, $ADpassword);

	// Construction de la requête de recherche
	$ADquery = ldap_search($ADcnx, $ADbaseDN, $ADfilter);
	
	// Interrogation et récupération des résultats
	$ADresults = ldap_get_entries($ADcnx, $ADquery);

	///////////////////////////////////
	// Fin de la recherche dans l'AD //
	///////////////////////////////////


	//////////////////////////////
	// Traitement des résultats //
	//////////////////////////////

	// Si la recherche a retouné au moins 1 résultat
	if ($ADresults["count"] > 0)
	{
		// Variable contenant la liste des utilisateurs récupérés depuis l'AD
		$ADusers = array();

		// Pour chaque résultat
		for ($i=0; $i<$ADresults["count"]; $i++)
			// Si le résultat a une section "membre"
			if (!empty($ADresults[$i]["member"]))
				// Pour chaque membre
				for ($j=0; $j<$ADresults[$i]["member"]["count"]; $j++)
					// Enregistrement de l'utilisateur récupéré depuis l'AD
					$ADusers[]=$ADresults[$i]["member"][$j];

		// Astuce pour supprimer les doublons et réorganiser l'index du tableau
		$ADusers = array_values(array_unique($ADusers));

		// Pour chaque utilisateur récupéré de l'AD
		foreach($ADusers as $ADuserDN)
		{
			// Initialisation du tableau contenant les informations de l'utilisateur
			$user = array();
			
			// Construction du filtre de recherche de l'AD
			$ADfilter = "(distinguishedName=$ADuserDN)";
			// Construction de la requête de recherche
			$ADquery = ldap_search($ADcnx, $ADbaseDN, $ADfilter);
			// Interrogation et récupération des résultats
			$ADresults = ldap_get_entries($ADcnx, $ADquery);

			// Si la recherche a retourné un résultat
			if (!empty($ADresults))
				// Si la recherche a retourne un unique résultat
				if ($ADresults["count"] == 1)
				{
					// Initialisation d'un tableau pour mettre en minuscule les clés.
					// En effet, bien que Windows soit insensible à la casse, PHP, quant
					// à lui, ne l'est pas. Certaines désignations d'attribut sont en minuscules
					// alors que d'autres comportent des majuscules (exemple : displayname et displayName)
					// Pour pallier cette situation, ce script va mettre toutes les désignations (clés)
					// en minuscules.
					$ADlowercaseResults = array();
					// Pour chaque résultat de la recherche
					foreach($ADresults[0] as $key => $value)
						// Création d'une clé en minuscule depuis le résultat
						$ADlowercaseResults[strtolower($key)] = $value;
					
					// Alimentation de la variable $user avec les différentes informations de l'AD
					// Il est possible de rajouter autant d'information que disponible
					if (isset($ADlowercaseResults['cn']))
						$user['cn'] = $ADlowercaseResults['cn'][0];
					if (isset($ADlowercaseResults['company']))
						$user['company'] = $ADlowercaseResults['company'][0];
					if (isset($ADlowercaseResults['department']))
						$user['department'] = $ADlowercaseResults['department'][0];
					if (isset($ADlowercaseResults['displayname']))
						$user['displayname'] = $ADlowercaseResults['displayname'][0];
					if (isset($ADlowercaseResults['givenname']))
						$user['surname'] = $ADlowercaseResults['givenname'][0];
					if (isset($ADlowercaseResults['mail']))
						$user['mail'] = $ADlowercaseResults['mail'][0];
					if (isset($ADlowercaseResults['manager']))
						$user['manager'] = $ADlowercaseResults['manager'][0];
					if (isset($ADlowercaseResults['msexchuserculture']))
						$user['language'] = $ADlowercaseResults['msexchuserculture'][0];
					if (isset($ADlowercaseResults['sn']))
						$user['name'] = $ADlowercaseResults['sn'][0];
					if (isset($ADlowercaseResults['title']))
						$user['title'] = $ADlowercaseResults['title'][0];
					//if (isset($ADlowercaseResults['thumbnailphoto']))
					//	$user['thumbnailPhoto'] = $ADlowercaseResults['thumbnailphoto'][0];
					
					// Une fois les informations récupérées, ajout de l'utilisateur à la liste à retourner
					$users[] = $user;
				}
		}
	}

	/////////////////////////////////////
	// Fin du traitement des résultats //
	/////////////////////////////////////
	
	// Fermeture de la connexion à l'AD
	ldap_close($ADcnx);

	// Retour de la liste des utilisateurs
	return $users;
}
?>