LDAP Synchronisation Script

Für einen Kunden wurde ich angefragt, ob ich ein Synchronisationsscript in PHP erstellen könne, welches die User samt Telefonnummer aus dem LDAP / AD ausliest und in eine MySQL-Tabelle umspeichert, so dass diese danach auf der Intranet-Seite angezeigt werden können. Leider wurde aus dem Auftrag nichts, da sich der User plötzlich nicht mehr gemeldet hatte, also dachte ich mir, veröffentlichen wir das Script halt, das es anderen vielleicht auch hilft.
Damit das ganze funktioniert, muss das LDAP-Modul in der PHP.ini einkommentiert und die passende SO-Datei vorhanden sein.
Unter Ubuntu und Debian geht das ganz einfach:

apt-get install php5-ldap

Auch andere Distros sind nicht allzu wild, genaueres dazu findet man zum Beispiel hier.

Das Script selbst war dann auch ganz einfach geschrieben, geplant war es, dieses jeweils mittels Cronjob alle paar Stunden laufen zu lassen, da sich die Benutzerdatenbank ja nicht gerade alle Minuten ändert. Also durchaus angemessen so!

So und hier ist also das Script.

<?php 
	// Adresse des Domänencontrollers:
	$ldap_server = "ldap://173.194.35.24";

	// Konto für den Zugriff:
	$auth_user = "sync@domain.local";
	$auth_pass = 'password';

	//Login für MySQL:
	$server = "localhost";
	$user = "sync";
	$pass = "password";
	$db = "users";

	// Mit LDAP Server verbinden:
	if (!($connect=@ldap_connect($ldap_server))) {
		die("Keine Verbindung zum Verzeichnis-Server möglich.");
	}

	// Diese Parameter sind nötig für den Zugriff auf ein Active Directory:
	ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
	ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);

	// An Server binden:
	if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) {
		die("Bind fehlgeschlagen.");
	}

	// BaseDN festlegen:
	$base_dn = "CN=Users,DC=DOMAIN,DC=local";

	// LDAP filter setzen: Nur Kontakt- und Benutzer-Objekte sollen zurückgegeben werden
	$filter = "(|(objectClass=contact)(objectClass=user))";

	// Mit MySQL Server verbinden:
	mysql_connect($server,$user,$pass) or die ("Keine Verbindung mit SQL Server möglich");
	mysql_select_db($db) or die ("Die Datenbank existiert nicht.");

	// Suche starten:
	if (!($search=@ldap_search($connect,$base_dn,$filter))) {
		die("Durchsuchen des LDAP-Servers fehlgeschlagen.");
	}
	$anzahl = ldap_count_entries($connect,$search);

	// Ergebnis der Suche in der Variablen $info ablegen:
	$info = ldap_get_entries($connect, $search);

	// Nur die relevanten Teile des $info-Arrays in ein $ergebnis-Array übernehmen und Umlaute dekodieren:
	for ($i=0; $i		//$ergebnis[$i]["displayname"]    = utf8_decode($info[$i]["displayname"][0]);
		$ergebnis[$i]["cn"] = utf8_decode($info[$i]["cn"][0]);
		$ergebnis[$i]["telephonenumber"] = $info[$i]["telephonenumber"][0];
	}

	// Array alphabetisch sortieren anhand einer Vergleichsfunktion:
	usort($ergebnis, 'vergleich');

	// Datenbank leeren:
	$leeren = mysql_query("TRUNCATE TABLE users") or die("Datenbank konnte nicht geleert werden");

	// Array $ergebnis in einer Tabelle ausgeben:
	for ($i=0; $i
		//Leere Namen ausschliessen:
		if (!empty($ergebnis[$i]["cn"]))
		{
			//Variabeln aufbereiten:
			$name = $ergebnis[$i]["cn"];
			$phone = $ergebnis[$i]["telephonenumber"];

			// Daten in Datebank schreiben:
			$eintrag = "INSERT INTO users (name, phone) VALUES ('$name', '$phone')";

			//Datensätze einfügen:
			$eintragen = mysql_query($eintrag) or die("Datensätze konnten nicht komplett eingefügt werden");
		}
	}

	//Abschliessende Meldung ausgeben:
	echo "Synchronisation done!";

	function vergleich($wert_a, $wert_b)
	{
		// Sortierung nach dem surename
		$a = $wert_a["cn"];
		$b = $wert_b["cn"];
		if ($a == $b) {
			return 0;
		}
			return ($a < $b) ? -1 : +1; 	} 
?>

Die Datenbank, in welche geschrieben wird, trägt den Namen „Users“ und muss die beiden Spalten „name“ und „phone“ aufweisen.
Ich hoffe, es hilft irgendwem!

4 Kommentare bei „LDAP Synchronisation Script

  1. Falls du das mal bei ’nem „größeren“ Kunden mit AD einsetzt, behalte mal MaxPageSize im Hinterkopf. Standardmäßig geben die DC’s da nur 1000 Ergebnisse zurück, wenn man mehr möchte muss man den Wert auf dem DC ändern…
    just my 2cent

  2. Super, hab ich ewig im Netz nach gesucht, kann man nicht die Datenbank Tabelle nur updaten, also nur die geänderten Sachen updaten (neue tel., neuer user, deaktivierte user markeren oder so..)

    die mysql datenbank bietet sich ja dafür an da noch mehr informationen rein zu legen.. 

    1. Durchaus, das ist möglich, nur müsste ich da noch einiges an Arbeit reinstecken. Falls trotzdem erwünscht kannst du mich gerne kontaktieren, dann können wir näheres besprechen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.