fussel01
Goto Top

Ldap Zugriff auf Active directory um einen neuen Account zu erstellen mit php Script

Hallo,
Weiß nicht ob ich das hier oder im php Bereich erstellen sollte. Naja.
Meine Daten
Windows Server 2008
Active Directory installiert
IIS 7.0 auch installiert

So nun zu meinem Problem,
Ich möchte auf meiner hp die über dyndns über meinen Server läuft ein Login-System einbauen, dies soll aus dem Login-Bereich und dem Regestrieungsbereich bestehen.
Zum Login habe ich bereits mehrer Beispiel Scripts mit php gefunden.
Aber wie sieht der php Script aus der für die regestrieung eines neuen Accounts aus. Dieser Account soll ein ganz normaler Benutzer sein, der sich dann auch in der Domäne anmelden kann.
Hoffe mir kann einer ein Beispiel geben.

MfG

Fussel

Content-ID: 164283

Url: https://administrator.de/contentid/164283

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

60730
60730 10.04.2011 um 15:32:45 Uhr
Goto Top
moin,

da in deinen Daten keine Firewall oder ein VPN genannt wurde....


Hoffe mir kann einer ein Beispiel geben.

php, windows und Konsorten sind per anno unsicher und ich vermute, dir wird hier keiner ein Tool zusammenzimmern, dass eine so gefährliche Nummer, wie es nunmal das anlegen eines AD Users via php ist.

Besorg dir ein Firewall, bau dir einen VPN Tunnel und mach das ohne PHP.....

Gruß
dog
dog 10.04.2011 um 15:51:44 Uhr
Goto Top
Was soll daran gefährlich sein, dass via PHP zu machen?
Ich habe auch schon Massenimports mit PHP gemacht, das ist ja nichts anderes als was Microsoft bei seinen LDAP-VBScripts auch zeigt.
Geht problemlos wenn man eine verschlüsselte LDAP-Verbindung hat.

Und ich glaube eher der TO meint, dass seine Website auf dem AD-Server liegt.
Fussel01
Fussel01 10.04.2011 um 15:57:31 Uhr
Goto Top
Danke für eure Antworten.
Ja ich habe eine VPN-Verbindung eingerichtet.
Ich dachte es so: also du hast du hast keinen Account klickst auf registrieren und dann fragt er nach Name vorname Passwort usw.
Diese neue Account wird dann Active Directory erstellt
Hoffe ihr versteht was ich meine

MfG

Fussel

Achso: Server sitzt mit zwei Firewalls hinter einem Router
richardfrick
richardfrick 11.04.2011 um 07:56:58 Uhr
Goto Top
Guten Morgen,

Mit google findest Du einige Klassen, die das AD via LDAP ansteuern lässt.

Falls Du Dich etwas tiefer damit beschäftigen willst (und auch mit dem Konsumieren von Exchange-Services, usw.) kann ich Dir von Microsoft Press "PHP programmieren unter Windows" empfehlen.
Fussel01
Fussel01 11.04.2011 um 08:01:49 Uhr
Goto Top
Habe schon gegoogelt und immer nur was um Login aber nichts zum erstellen neuer Benutzer gefunden.trotzdem danke
MfG
Fussel
richardfrick
richardfrick 11.04.2011 um 09:13:42 Uhr
Goto Top
http://sourceforge.net/projects/adldap/

Nach dem Download schau' Dir examples.php an, dort siehst Du ein Beispiel, wie Du Benutzer eröffnest, zu Gruppen hinzufügst, etc.
Fussel01
Fussel01 11.04.2011 um 14:53:53 Uhr
Goto Top
Vielen,vielen Dank erstmal.
Eine Frage habe ich noch man muss doch jetzt den Script teil rauskopieren und eine neue php Datei erstellen.
Dann muss man noch eine Tabelle erstellen und dann include(,oder?
Aber wie macht man es das die php-Datei die Felder erkennt ?

MfG

Fussel
richardfrick
richardfrick 11.04.2011 um 15:07:06 Uhr
Goto Top
Ja, klasse mit include laden, instantiieren ($adldap = new adLDAP($options);) und dann den Benutzer eröffnen.

Das Stichwort für "Felder erkennen" nennt sich in HTML-Formular.
http://de.selfhtml.org/html/formulare/eingabe.htm
http://php.net/manual/de/tutorial.forms.php
Fussel01
Fussel01 11.04.2011 um 19:07:01 Uhr
Goto Top
Habe eig. alles verstanden.
Doch zur Sicherheit :
Man lädt welche php-datei in die html mit dem formular ?
Und was bedeutet die instantiieren ($adldap = new adLDAP($options) Option ?

Mfg

Fussel
richardfrick
richardfrick 12.04.2011 um 08:23:29 Uhr
Goto Top
Also, ohne wirkliche PHP-Erfahrung würde ich das so machen:

index.html
form mit den frei zu wählenden Daten (Name, Passwort, usw.).
form mittels POST auf addADUser.php zeigen

addADUser.php:
Klasse includen, und dann instantiieren.
Du musst Dir das so vorstellen: Du gehst in eine Bibliothek und nimmst es zu Dir (include).
Nun legst Du es auf den Tisch, um damit arbeiten zu können (das wäre übersetzt das instantiieren. Du lädst die Klasse in eine Variable, von welcher Du die Methoden abrufen kannst).

Du kannst hierbei eigentlich alles von examples.php rauskopieren, wichtig ist:
Bei den Attributen-Array ($attributes) für user_create musst Du die Werte ändern, entweder mit Konstante (also feste Werte, zum Beispiel wenn alle Benutzer bei der Erstellung des Accounts das gleiche Standard-Passwort haben sollte), oder eben mit den Werten des Formulars (z.B. $attributes["surname"] = $_POST["nachname"];)


ACHTUNG:
Du hast hier absolut keine Sicherheitsmechanismen eingebaut, es ist daher wichtig, dass unter keinen Umständen ein Dritter dieses Script (auf Deinem Server) benutzen kann.
yannick-server
yannick-server 12.04.2011 um 09:17:05 Uhr
Goto Top
Schau dir mal LiveUser an. Ist eine Pear Klasse für PHP und ermöglicht die Authentifikation über Samba, POP3... vielleicht ist auch was für Windows dabei. Ob man darüber Benutzer anlegen kann weiß ich nicht ist aber vielleicht als Grundlage zu gebrauchen. Habe es selber noch nicht verwendet, nur mal irgentwo gelesen face-smile Viel Glück!
Fussel01
Fussel01 12.04.2011 um 18:32:18 Uhr
Goto Top
OK erstmal danke für deine Mühe.
Wahrscheinlich bin ich einfach zu dumm.
Es geht nicht so wie es soll. Es die php datei wird zwar ausgeführt, aber es entsteht kein neuer benutzer.
Deswegen schreibe ich mal wie bei mir die addADUser.php aussieht:
<?
/*
Examples file

To test any of the functions, just change the 0 to a 1.
*/

//error_reporting(E_ALL ^ E_NOTICE);

include ("../adLDAP.php");  
try {
    $adldap = new adLDAP($options);
}
catch (adLDAPException $e) {
    echo $e; exit();   
}
//var_dump($ldap);

echo ("<pre>\n");  

if (1){
	$attributes=array(
		"username" = "fred",  
		"logon_name"= "freds@mydomain.local",  
		"firstname"= "Fred",  
		"surname" = $_POST["nachname"],  
		"company"= "Benni",  
		"email"= "$_POST["username"]@domain.de",  
		"container"= array("Container Parent","Container Child"),  
		"enabled"= 1,  
		"password"= "Password123",  
	);
	
  try {
    	$result=$ldap->user_create($attributes);
	    var_dump($result);
    }
        catch (adLDAPException $e) {
        echo $e;     exit();   
    }
}

?>
Habe extra es noch nicht mit einer eingabe gemacht! Da ich einen festen Wert testen wollte.
Natürlich auch der adldap-code, aber nur der Anfang
?php
/**
 * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY 
 * Version 3.3.2
 * 
 * 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-2010 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
 * @author Scott Barnett, Richard Hyland
 * @copyright (c) 2006-2010 Scott Barnett, Richard Hyland
 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
 * @revision $Revision: 91 $
 * @version 3.3.2
 * @link http://adldap.sourceforge.net/
 */

/**
 * Define the different types of account in AD
 */
define ('ADLDAP_NORMAL_ACCOUNT', 805306368);  
define ('ADLDAP_WORKSTATION_TRUST', 805306369);  
define ('ADLDAP_INTERDOMAIN_TRUST', 805306370);  
define ('ADLDAP_SECURITY_GLOBAL_GROUP', 268435456);  
define ('ADLDAP_DISTRIBUTION_GROUP', 268435457);  
define ('ADLDAP_SECURITY_LOCAL_GROUP', 536870912);  
define ('ADLDAP_DISTRIBUTION_LOCAL_GROUP', 536870913);  
define ('ADLDAP_FOLDER', 'ldap://localhost');  
define ('ADLDAP_CONTAINER', 'Users');  

/**
* Main adLDAP class
* 
* Can be initialised using $adldap = new adLDAP();
* 
* Something to keep in mind is that Active Directory is a permissions
* based directory. If you bind as a domain user, you can't fetch as 
* much information on other users as you could as a domain admin.
* 
* Before asking questions, please read the Documentation at
* http://adldap.sourceforge.net/wiki/doku.php?id=api
*/
class adLDAP {
    /**
    * The account suffix for your domain, can be set when the class is invoked
    * 
    * @var string
    */   
	protected $_account_suffix = "@ben-server.dyndns.org";  
    
    /**
    * The base dn for your domain
    * 
    * @var string
    */
	protected $_base_dn = "DC=benni,DC=de";   
	
    /**
    * Array of domain controllers. Specifiy multiple controllers if you
    * would like the class to balance the LDAP queries amongst multiple servers
    * 
    * @var array
    */
    protected $_domain_controllers = array ("win-pxwzhli6ijn.benni.de");  
	
    /**
    * Optional account with higher privileges for searching
    * This should be set to a domain admin account
    * 
    * @var string
    * @var string
    */
	protected $_ad_username=NULL;
    protected $_ad_password=NULL;
    
    /**
    * AD does not return the primary group. http://support.microsoft.com/?kbid=321360
    * This tweak will resolve the real primary group. 
    * Setting to false will fudge "Domain Users" and is much faster. Keep in mind though that if 
    * someone's primary group is NOT domain users, this is obviously going to mess up the results 
    * 
    * @var bool
    */
	protected $_real_primarygroup=true;
	
    /**
    * Use SSL (LDAPS), your server needs to be setup, please see
    * http://adldap.sourceforge.net/wiki/doku.php?id=ldap_over_ssl
    * 
    * @var bool
    */
	protected $_use_ssl=false;
    
    /**
    * Use TLS
    * If you wish to use TLS you should ensure that $_use_ssl is set to false and vice-versa
    * 
    * @var bool
    */
    protected $_use_tls=false;
    
    /**
    * When querying group memberships, do it recursively 
    * eg. User Fred is a member of Group A, which is a member of Group B, which is a member of Group C
    * user_ingroup("Fred","C") will returns true with this option turned on, false if turned off      
    * 
    * @var bool
    */
	protected $_recursive_groups=true;
	
	// You should not need to edit anything below this line
Hoffe es hilft Ihnen etwas

MfG

Fussel
dog
dog 12.04.2011 um 19:21:19 Uhr
Goto Top
Ich sehe an keiner Stelle, dass du eine Bindung an das AD mit Administratorzugangsdaten machst.
Zudem willst du ein Passwort setzen und das lässt AD nur über SSL zu.
Fussel01
Fussel01 12.04.2011 um 21:16:02 Uhr
Goto Top
Ja das klingt einleuchtend !
Es tut mir echt Leid ,aber ich kann nur html und kein php. Deswegen wäre jemand so freundlich, dass er mir den Code oben so ändert.
Tausend Dank wenn das jemand macht !

Hatte noch so eine andere Idee
Man könnte den user im MySQL datenbank erstellen und dies sollte sich um 00:00 immer abgleichen.
Geht das?

MfG

Fussel

So habe nach dem ich nach meiner Idee gegoogelt hatte endlich viel gefunden.
Hier ein Link http://de.php.net/manual/de/function.ldap-bind.php
Dort ist eine Bindung mit dem Server erklärt. Will diese mit dem Include heute einbinden

MfG

Fussel
richardfrick
richardfrick 13.04.2011 um 11:10:45 Uhr
Goto Top
gude,

Also, folgendes:
Der "Benutzer", der php.exe initialisiert, muss sicher mal Domänen-Admin sein.

Packe nun erstmal die Datei "adLDAP.php" in den gleichen Ordner wie "addADUser.php".
Ändere die Zeile "include ("../adLDAP.php"); " durch "include ("adLDAP.php");


Natürlich könntest Du auch die ganzen User in eine MySQL-Tabelle packen und dann per Task-Scheduler auslesen, aber was wäre der Vorteil?
dog
dog 13.04.2011 um 12:24:49 Uhr
Goto Top
Der "Benutzer", der php.exe initialisiert, muss sicher mal Domänen-Admin sein.

PHP verbindet sich explizit über LDAP, das hat nichts damit zu tun auf welchem Server und unter welchem Benutzer es läuft.
Fussel01
Fussel01 13.04.2011 um 12:31:46 Uhr
Goto Top
Habe jetzt einen apache server dann kommt
Warning: ldap_add() [function.ldap-add]: Add: Server is unwilling to perform in F:\xampp\htdocs\aduser.php on line 43

MfG

Fussel
Fussel01
Fussel01 14.04.2011 um 09:58:00 Uhr
Goto Top
Verbessert mich fals ich falsch liege :

man verbinden sich mit
ldap_connect
dann binden man mit
ldap_bind
das klappt ja aber dann
ldap_add

Kann mir einer bitte den genauen Aufbau von ldap_add erklären.

MfG

Fussel
Fussel01
Fussel01 16.04.2011 um 18:54:42 Uhr
Goto Top
So habe es jetzt hinbekommen mit vbs und php,
vielen Dank an euch

MfG

Fussel