Netzwerksache:Aus Benutzername werde Vor- und Nachname

RealHAZZARD

Erfahrenes Mitglied
Tag auch.

Ich hab ein großes Problem.
Folgende Vorabinfo:

In dem bestehenden Netzwerk werden Benutzer wie folgt angelegt.
Wenn ich Max Mustermann heiße, wäre mein Benutzername z.B. Mum,
weil Mustermann Max. Ich hoffe ihr versteht. Ist auch nicht ganz so
wichtig das zu verstehen. Interessant wird es erst jetzt:

Ich soll ein Programm entwerfen, welches einige Sachen im Hintergrund
für den Benutzer macht. Was das im einzelnen macht, ist nicht wichtig.
Es geht mir vielmehr darum, dass ich für die Arbeiten die da folgen den
Namen und Vornamen des Benutzers brauch.

Im Klartext: ich frage“wer steht hinter mum“ und als Antwort will ich „Max Mustermann“.

Und mein Chef meinte das muss über Active Directory oder LDAP gehen.
Ich hab schon mal etwas gesucht, aber so richtig bin ich nicht vorangekommen.
Ich habe herausgefunden, dass das wohl über JNDI geht. Mein großes Problem ist dass,
ich bei Java nur Anfänger und bei AD oder LDAP ein Nichtswisser bin :-(

Ich hoffe ihr könnt mir weiterhelfen.

Danke
 
Bin schon wieder ein Stück weiter.
...zumindest soweit um zu sagen, dass ich
ein ldapsearch brauch. Nur halt nicht so umfangreich.
Mir reichen 2 Attribute Namen und Vornamen eben.
 
Also ich hänge zur zeit in "javax.naming.ldap" und ldapname .
Nur drängt sich mir die Frage auf, ob ich nicht
erstmal ne Verbindung zu dem LDAP brauch.
Aber keine Ahnung wo das wieder stehen, kann,
und ob ich dort überhaupt meinen Namen auflösen kann.
Hilfe!
 
Hallo!

Schau mal hier:
Code:
  package de.tutorials;
  
  import java.util.ArrayList;
  import java.util.Hashtable;
  import java.util.Iterator;
  import java.util.List;
  
  import javax.naming.Context;
  import javax.naming.NamingEnumeration;
  import javax.naming.directory.SearchControls;
  import javax.naming.directory.SearchResult;
  import javax.naming.ldap.InitialLdapContext;
  import javax.naming.ldap.LdapContext;
  
  public class ActiveDirectorySearchExample {
  
  	final static String ADMIN_NAME = "CN=Administrator,CN=Users,DC=home,DC=tutorials,DC=de";
  
  	final static String ADMIN_PASSWORD = "DUMMYDUMMYDUMMY";
  
  	final static String SEARCH_BASE = "DC=home,DC=tutorials,DC=de";
  
  	static LdapContext ctx;
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) throws Exception {
  		init();
  		List list = findUsersByAccountName("MuM");
  		for (Iterator iter = list.iterator(); iter.hasNext();) {
  			String element = (String) iter.next();
  			System.out.println(element);
  		}
  		ctx.close();
  	}
  
  	static void init() throws Exception {
  		Hashtable env = new Hashtable();
  		env.put(Context.INITIAL_CONTEXT_FACTORY,
 				"com.sun.jndi.ldap.LdapCtxFactory");
  		env.put(Context.SECURITY_AUTHENTICATION, "simple");
  		env.put(Context.SECURITY_PRINCIPAL, ADMIN_NAME);
  		env.put(Context.SECURITY_CREDENTIALS, ADMIN_PASSWORD);
  		//Der entsprechende Domänen-Controller
  		env.put(Context.PROVIDER_URL, "ldap://192.168.75.96:389");
  		ctx = new InitialLdapContext(env, null);
  	}
  
  	static List findUsersByAccountName(String accountName) throws Exception{
  		List list = new ArrayList();
  
  		String snPrefix = accountName.substring(0, 2) + "*";
  		String givenNamePrefix = accountName.substring(2) + "*";
  
  		//Unsere LDAP Abfrage...
  		String searchFilter = "(&(objectClass=user)(sn=" + snPrefix
 				+ ")(givenName=" + givenNamePrefix + "))";
  
  		//System.out.println(searchFilter);
  
  		SearchControls searchControls = new SearchControls();
  		String[] resultAttributes = { "sn", "givenName", "sAMAccountName" };
  		searchControls.setReturningAttributes(resultAttributes);
  		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  		
  		NamingEnumeration results = ctx.search(SEARCH_BASE, searchFilter,
  				searchControls);
  		
  		while(results.hasMoreElements()){
 			SearchResult searchResult = (SearchResult)results.nextElement();
  			list.add(searchResult.toString());
  		}
  		return list;
  	}
  }

Zum Zugriff auf LDAP Verzeichnisse brauchst du aber noch einen JNDI Zusatz, den du hier findest:
http://java.sun.com/products/jndi/downloads/index.html#DOWNLOAD12
(Download JNDI 1.2.1 & More) -> https://sdlcweb3b.sun.com/ECom/docs/pics/generic/dload-sm.gifLDAP Service Provider, 1.2.4

Gruß Tom
 
Hey,

danke für die Lösung ich bastel sie nachher mal ein.
Aber da ich es nicht nur einfach abschreiben. sondern verstehen will,
wäre es echt schön, wenn du mir noch ausführliche Kommentare mit
rein schreibst. Denn sonst kann ich das vielleicht meinem Chef geben,
aber verstanden hätte ich dann wohl nix.
Wäre echt nett.
Aber danke schonmal dafür.
 
Hallo,

Java:
 package de.tutorials;
 
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 
 import javax.naming.Context;
 import javax.naming.NamingEnumeration;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import javax.naming.ldap.InitialLdapContext;
 import javax.naming.ldap.LdapContext;
 
 public class ActiveDirectorySearchExample {
 
 	//Der Vollqualifizierte Name des Administrators im AD
 	final static String ADMIN_NAME = "CN=Administrator,CN=Users,DC=home,DC=tutorials,DC=de";
 
 	final static String ADMIN_PASSWORD = "DUMMYDUMMYDUMMY";
 
 	//User Standardpfad von dem die Suche im AD ausgehen soll
 	final static String SEARCH_BASE = "DC=home,DC=tutorials,DC=de";
 
 	static LdapContext ctx;
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		init();
 		List list = findUsersByAccountName("MuM");
 		for (Iterator iter = list.iterator(); iter.hasNext();) {
 			String element = (String) iter.next();
 			System.out.println(element);
 		}
 		ctx.close();
 	}
 
 	/**
 	 * Wir initialisieren die Verbindung zum LDAP Service
 	 * Die zum Zugriff notwendigen Daten legen wir in einer
 	 * Hashtable ab und übergeben diese an den InitialLdapContext, der
 	 * mit den darin enthaltenen Informationen die Verbindung aufbaut.
 	 * @throws Exception
 	 */
 	static void init() throws Exception {
 		Hashtable env = new Hashtable();
 		env.put(Context.INITIAL_CONTEXT_FACTORY,
 				"com.sun.jndi.ldap.LdapCtxFactory");
 		env.put(Context.SECURITY_AUTHENTICATION, "simple");
 		env.put(Context.SECURITY_PRINCIPAL, ADMIN_NAME);
 		env.put(Context.SECURITY_CREDENTIALS, ADMIN_PASSWORD);
 		//Der entsprechende Domänen-Controller:LDAP-Port
 		env.put(Context.PROVIDER_URL, "ldap://192.168.75.96:389");
 		ctx = new InitialLdapContext(env, null);
 	}
 
 	/**
 	 * Wir bekommen ein Namenskürzel hineingereicht und bauen uns damit einen
 	 * LDAP Suchfilter um nach dem vermeindlichen Benutzer zu suchen. Die gefundenen
 	 * Kandidaten werden in einer Liste zurückgegeben.
 	 * @param accountName
 	 * @return
 	 * @throws Exception
 	 */
 	static List findUsersByAccountName(String accountName) throws Exception{
 		List list = new ArrayList();
 
 		//Die ersten beiden Zeichen sind Präfix des Nachnamens (sn)
 		String snPrefix = accountName.substring(0, 2) + "*";
 		//Das letze Zeichen ist Präfix des Vornamens (givenName)
 		String givenNamePrefix = accountName.substring(2) + "*";
 
 		//Unsere LDAP Abfrage...
 		String searchFilter = "(&(objectClass=user)(sn=" + snPrefix
 				+ ")(givenName=" + givenNamePrefix + "))";
 
 		//System.out.println(searchFilter);
 
 		//Wir definieren den "Suchapparat" für die LDAP Suche...
 		SearchControls searchControls = new SearchControls();
 		String[] resultAttributes = { "sn", "givenName", "sAMAccountName" };
 		searchControls.setReturningAttributes(resultAttributes);
 		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
 		
 		//Wir führen die Suche im LDAP durch
 		NamingEnumeration results = ctx.search(SEARCH_BASE, searchFilter,
 				searchControls);
 		
 		//Wir iterieren über alle Resultate und speichern die gefundenen Namen
 		//in einer Liste.
 		while(results.hasMoreElements()){
 			SearchResult searchResult = (SearchResult)results.nextElement();
 			list.add(searchResult.toString());
 		}
 		return list;
 	}
 }

Gruß Tom
 
OK. Hab mir das mal angeschaut.
Danke dir Thomas. Das hat mir einigen erklärt.
Nur kann ichs erstmal nicht umsetzten, da ich
schon wieder andere Aufgabe hab. (Arrg)

Mal sehen wann ich das dann erledigen kann.
Aber tausend dank@Thomas

PS: wieso steigt eigentlich meine Beitragszahl nie?
 
Habe folgendes Problem in Bezug auf eine LDAP-Anbindung aus Java heraus: Ich möchte die Benutzername / Passwort Kombination, die ein Benutzer im Startbildschirm meiner Anwendung eingibt, über LDAP verifizieren und des weiteren prüfen, ob er Mitglied in einer berechtigten Nutzergruppe ist. Allerdings loggen sich die Nutzer mit Ihrem Kürzel, das in LDAP in der Variable sAMAccountName gespeichert ist, ein, und nicht mit dem eigentlichen Account-Namen (CN in LDAP).

Angedacht war nun eigentlich, das ich mit den vom Nutzer eingegebenen Daten versuche mich am LDAP-Server anzumelden, wenn dies klappt wird noch die Gruppenzugehörigkeit geprüft, wenn es nicht klappt wird der Loginversuch abgewiesen. Allerdings ist so wie ich das sehe wohl der Login nur möglich, wenn man den CN hat.

Brauche ich also auf jeden Fall noch einen "LDAP-User" Account für ein Login am LDAP-Server um die Benutzereingabe zu verifizieren oder gibt es noch eine Möglichkeit die ich übersehen habe?
 
Zurück