[Java] Referenz / Update von Active Directory

Einführung

Ich möchte in der Lage sein, die Benutzerliste abzurufen und zu aktualisieren, um die Funktion zum Verwalten von AD-Benutzern bereitzustellen. In Java können Sie mit JNDI auf AD zugreifen.

AD-Referenz

Holen Sie sich einen einzelnen Benutzer

Informationen zur Suche durch Angabe einer Benutzer-ID für die AD-Authentifizierung finden Sie unter der folgenden URL.

https://www.earthlink.co.jp/engineerblog/intra-mart-engineerblog/3336/

Benutzerliste abrufen

Bei Suchvorgängen, bei denen mehrere Ergebnisse erwartet werden, z. B. eine Liste von Benutzern, die zu einer bestimmten Organisationseinheit gehören, müssen Sie die LDAP-Seitengröße kennen. Für Active Directory unter Windows ist möglicherweise 1.000 die maximale Größe des Ergebnisses. Wenn Sie mehr als das erhalten möchten, wiederholen Sie die Suche während des Paging.

Beispiel, um eine Benutzerliste beim Blättern zu erhalten


Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://server"); //AD-Serveradresse
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "userid@domain"); //Benutzer-ID zum Anmelden am AD-Server@Domain
env.put(Context.SECURITY_CREDENTIALS, "password"); //Passwort

final int PAGE_SIZE = 1000;

InitialLdapContext context = null;
try {
	context = new InitialLdapContext(env, null);

	//Suchbedingungen festlegen
	String name = "OU=aaa, DC=bbb, DC=ccc";
	String filter = "(objectCategory=user)";

	SearchControls control = new SearchControls();
	control.setSearchScope(SearchControls.SUBTREE_SCOPE);

	byte[] cookie = null;

	do {
		context.setRequestControls(new Control[] { new PagedResultsControl(PAGE_SIZE, cookie,
				Control.CRITICAL) });

		//Suchausführung
		NamingEnumeration<SearchResult> results = context.search(name, filter, control);

		//Ergebnisse bekommen
		while (results.hasMore()) {
			SearchResult result = results.next();
			AdUserBean user = new AdUserBean(result);

			System.out.println(user);
		}

		//Überprüfen Sie, ob es eine nächste Seite gibt
		cookie = null;

		if (context.getResponseControls() != null) {
			Optional<Control> found = Arrays.stream(context.getResponseControls())
					.filter(c -> c instanceof PagedResultsResponseControl).findFirst();

			if (found.isPresent()) {
				PagedResultsResponseControl prrc = (PagedResultsResponseControl) found.get();
				cookie = prrc.getCookie();
			}
		}

	} while (cookie != null);

} finally {
	try {
		if (context != null) {
			context.close();
		}
	} catch (NamingException e) {
	}
}

AdUserBean


public class AdUserBean {

	private String cn = null;
	private String name = null;
	/**Name*/
	private String displayName = null;
	/**Benutzer-ID + Domain*/
	private String userPrincipalName = null;
	/**LDAP Distinguished Name*/
	private String distinguishedName = null;
	/**Mail Adresse*/
	private String mail = null;
	/**Taschenglocke*/
	private String pager = null;

	/**
	 *Konstrukteur
	 */
	public AdUserBean() {

	}


	/**
	 *Konstrukteur
	 *
	 *Abrufen von Inhalten aus Active Directory-Suchergebnissen
	 *
	 * @param result
	 * @throws NamingException
	 */
	public AdUserBean(SearchResult result) throws NamingException {
		NamingEnumeration<? extends Attribute> attributes = result.getAttributes().getAll();

		while (attributes.hasMoreElements()) {
			Attribute attribute = attributes.next();
			Object value = attribute.get();

			if ("name".equals(attribute.getID())) {
				if (value instanceof String) {
					name = (String) value;
				}

			} else if ("displayName".equals(attribute.getID())) {
				if (value instanceof String) {
					displayName = (String) value;
				}

			} else if ("cn".equals(attribute.getID())) {
				if (value instanceof String) {
					cn = (String) value;
				}

			} else if ("userPrincipalName".equals(attribute.getID())) {
				if (value instanceof String) {
					userPrincipalName = (String) value;
				}

			} else if ("pager".equals(attribute.getID())) {
				if (value instanceof String) {
					pager = (String) value;
				}

			} else if ("mail".equals(attribute.getID())) {
				if (value instanceof String) {
					mail = (String) value;
				}

			} else if ("distinguishedName".equals(attribute.getID())) {
				if (value instanceof String) {
					distinguishedName = (String) value;
				}

			}
		}

	}

//Folgendes wird weggelassen
}

Unterschied zwischen "hasMore" und "hasMoreElements"

Es gibt zwei Arten von "NamingEnumeration" -Klassen, nämlich den Rückgabewert der "search ()" - Methode, die "hasMoreElements" -Methode in der normalen "Enumeration" -Klasse und die ursprüngliche "hasMore" -Methode.

while (results.hasMore()) {
	SearchResult result = results.next();
	//Abkürzung
}

Die Methode "hasMore" löst eine "NamingException" aus, wenn beispielsweise versucht wird, mehr als die Seitengröße zu ermitteln. https://docs.oracle.com/javase/jp/11/docs/api/java.naming/javax/naming/NamingEnumeration.html

Bei der Suche nach AD während des Paging wie im vorherigen Beispiel tritt jedoch kein Fehler auf, selbst wenn die auf der Codeseite angegebene Seitengröße> die Seitengröße auf der Serverseite und das Suchergebnis die Seitengröße auf der Serverseite ist. ist zurückgekommen.

Wie man Attributwerte nimmt

Active Directory-Attribute umfassen Elemente mit einem einzelnen Wert und Elemente mit mehreren Werten. Bitte beachten Sie, dass die Erfassungsmethode für jeden unterschiedlich ist.

Auszug aus dem Erfassungsteil des Attributwerts


/**Taschenglocke*/
private String pager = null;
/**Taschenglocke(Andere) */
private List<String> otherPager = null;

public AdUserBean(SearchResult result) throws NamingException {
	NamingEnumeration<? extends Attribute> attributes = result.getAttributes().getAll();

	while (attributes.hasMoreElements()) {
		Attribute attribute = attributes.next();
		Object value = attribute.get();

		if ("pager".equals(attribute.getID())) {
			//Taschenglocke(Einzelexemplar)
			if (value instanceof String) {
				pager = (String) value;
			}

		} else if ("otherPager".equals(attribute.getID())) {
			//Taschenglocke(Andere) (Mehrere Elemente)
			NamingEnumeration<?> values = attribute.getAll();

			while (values.hasMore()) {
				if (value instanceof String) {
					if (otherPager == null) {
						otherPager = new ArrayList<String>();
					}

					value = values.next();

					otherPager.add((String) value);
				}
			}

		}
	}
}

Benutzerattribute ändern

Benutzerattribute ändern


private static void update() throws NamingException {

	Hashtable<String, String> env = new Hashtable<String, String>();
	env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	env.put(Context.PROVIDER_URL, "ldap://server"); //AD-Serveradresse
	env.put(Context.SECURITY_AUTHENTICATION, "simple");
	env.put(Context.SECURITY_PRINCIPAL, "user@domain"); //Benutzer-ID zum Anmelden am AD-Server@Domain
	env.put(Context.SECURITY_CREDENTIALS, "password"); //Passwort

	DirContext context = null;
	try {
		context = new InitialDirContext(env);

		Attributes attrs = new BasicAttributes();
		attrs.put(new BasicAttribute("pager", "123456"));
		attrs.put(new BasicAttribute("telephoneNumber", "1234567"));

		String name = "CN=username, OU=xxx, DC=yyy, DC=zzz";

		context.modifyAttributes(name, DirContext.REPLACE_ATTRIBUTE, attrs);

	} finally {
		try {
			if (context != null) {
				context.close();
			}
		} catch (NamingException e) {
		}
	}
}

Der im Argument von "modifyAttributes" angegebene DN muss die Organisationseinheit angeben, zu der der Benutzer (das Objekt) gehört. Wenn Sie die OU-Hierarchie weglassen, wird die Fehlermeldung "Objekt nicht gefunden" angezeigt.

Referenz von Attributen und Suchfiltern

Die E-Mail-Adresse ist ein einzelnes Element, es können jedoch mehrere Telefonnummern angegeben werden.

Erläuterung der Benutzerattribute in Active Directory (Für jeden Attributtyp gibt es weitere Erklärungsseiten.) https://docs.microsoft.com/en-us/windows/win32/ad/naming-properties

Active Directory-Attributliste https://docs.microsoft.com/en-us/windows/win32/adschema/attributes-all

Syntax des LDAP-Suchfilters http://software.fujitsu.com/jp/manual/manualfiles/M050000/B1WN4911/01/idmgr07/idmgr447.htm https://www.ibm.com/support/knowledgecenter/ja/SSYJ99_8.5.0/admin-system/rbug_ldapfltrxprns.html

Recommended Posts

[Java] Referenz / Update von Active Directory
Denken Sie an eine Java-Update-Strategie
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Java8-Methodenreferenz
Java8-Methodenreferenz
JAVA Referenzmaterialien
Erstellung eines Java-Verzeichnisses
Meine Java-Referenz
[Java] Übersicht über Java
Java-Überprüfung ③ (grundlegende Verwendung von Arrays / Referenztyp)
Abgelaufene Java-Sammlung
Voraussichtliche Funktionen von Java
[Java] Bedeutung der serialVersionUID
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Mac Java-Ausgangsverzeichnis
Java - Vereinigung von Kommentaren
Verwendung von Active Hash
Geschichte der Java-Annotationen
Java (Verdienste des Polymorphismus)
Die Fallstricke von Active Hash
NIO Bewertung von Java
[Java] Drei Funktionen von Java
Zusammenfassung der Java-Unterstützung 2018
[Java] Unterschied zwischen der Zuweisung der Basistypvariablen und der Zuordnung der Referenztypvariablen
Die schwache Referenz von JAVA hat die für jeden Thread zugewiesene Instanz wiederverwendet
[Java] Integer-Wrapper-Klassenreferenz
Über Java-Instanzen
[Java] Mirage-Basic-Verwendung von SQL
Java VB.net-Dienstreferenz auf halbem Weg
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Grundlagen der Zeichenoperation (Java)
Java-Lerntag 4
[Java] Anfängerverständnis von Servlet-①
Java Ende des Monats plusMonate
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
[Java] Implementierung des Faistel-Netzwerks
Aktualisieren Sie das Timing von Eclipse org.eclipse.wst.common.component
[Java] Komparator der Collection-Klasse
Zusammenfassung der Grundlagen der Java-Sprache
Zusammenfassung der Java Math Klasse
Aufzählung aller Kombinationen Java
Java (Vererbung von is-ein Prinzip)
Vor- und Nachteile von Java
Vorteile der statischen Java-Methode
[Java] Zusammenfassung der Steuerungssyntax
Java-Implementierung von Tri-Tree
Stoppen Sie das automatische Update von Ubuntu
Aktualisieren Sie das Timing von Eclipse org.eclipse.wst.common.component
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der Entwurfsmuster
[Java] Zusammenfassung der mathematischen Operationen
Umgang mit Java-Gleitkomma Beim Lesen des Nachschlagewerks [Hinweis]
Die Geschichte, das Verhalten von String durch Passieren von Java nicht zu kennen