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.
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/
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
}
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.
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
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.
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