Je veux pouvoir obtenir et mettre à jour la liste des utilisateurs afin de fournir la fonction de gestion des utilisateurs AD. En Java, vous pouvez accéder à AD à l'aide de JNDI.
Pour effectuer une recherche en spécifiant un ID utilisateur pour l'authentification AD, reportez-vous à l'URL ci-dessous.
https://www.earthlink.co.jp/engineerblog/intra-mart-engineerblog/3336/
Pour les recherches censées avoir plusieurs résultats, comme une liste d'utilisateurs appartenant à une unité d'organisation particulière, vous devez connaître la taille de la page LDAP. Pour Active Directory sous Windows, peut-être 1 000 est la taille maximale du résultat. Si vous souhaitez obtenir plus que cela, répétez la recherche pendant la pagination.
Exemple pour obtenir la liste des utilisateurs lors de la pagination
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"); //Adresse du serveur AD
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "userid@domain"); //ID utilisateur pour se connecter au serveur AD@domaine
env.put(Context.SECURITY_CREDENTIALS, "password"); //mot de passe
final int PAGE_SIZE = 1000;
InitialLdapContext context = null;
try {
context = new InitialLdapContext(env, null);
//Spécifier les conditions de recherche
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) });
//Exécution de la recherche
NamingEnumeration<SearchResult> results = context.search(name, filter, control);
//Obtenir des résultats
while (results.hasMore()) {
SearchResult result = results.next();
AdUserBean user = new AdUserBean(result);
System.out.println(user);
}
//Vérifiez s'il y a une page suivante
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;
/**Nom*/
private String displayName = null;
/**ID utilisateur + domaine*/
private String userPrincipalName = null;
/**Nom distinctif LDAP*/
private String distinguishedName = null;
/**adresse mail*/
private String mail = null;
/**Cloche de poche*/
private String pager = null;
/**
*constructeur
*/
public AdUserBean() {
}
/**
*constructeur
*
*Obtenir du contenu à partir des résultats de recherche Active Directory
*
* @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;
}
}
}
}
//Ce qui suit est omis
}
Il existe deux types de classe NamingEnumeration
, qui est la valeur de retour de la méthode search ()
, la méthode hasMoreElements
dans la classe ordinaire ʻEnumeration et la méthode d'origine
hasMore`.
while (results.hasMore()) {
SearchResult result = results.next();
//Abréviation
}
La méthode hasMore
lève une NamingException
, par exemple, en essayant d'obtenir plus que la taille de la page.
https://docs.oracle.com/javase/jp/11/docs/api/java.naming/javax/naming/NamingEnumeration.html
Cependant, lors de la recherche d'AD lors de la pagination comme dans l'exemple précédent, aucune erreur ne se produira même si la taille de page spécifiée du côté code> la taille de la page côté serveur et le résultat de la recherche sera la taille de la page côté serveur. revenu.
Les attributs Active Directory incluent des éléments avec une seule valeur et des éléments avec plusieurs valeurs. Veuillez noter que la méthode d'acquisition est différente pour chacun.
Extrait de la partie acquisition de la valeur d'attribut
/**Cloche de poche*/
private String pager = null;
/**Cloche de poche(Autre) */
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())) {
//Cloche de poche(Un seul article)
if (value instanceof String) {
pager = (String) value;
}
} else if ("otherPager".equals(attribute.getID())) {
//Cloche de poche(Autre) (Articles multiples)
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);
}
}
}
}
}
Modifier les attributs utilisateur
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"); //Adresse du serveur AD
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "user@domain"); //ID utilisateur pour se connecter au serveur AD@domaine
env.put(Context.SECURITY_CREDENTIALS, "password"); //mot de passe
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) {
}
}
}
Le DN spécifié dans l'argument de «modifyAttributes» doit spécifier l'unité d'organisation à laquelle appartient l'utilisateur (objet). Si vous omettez la hiérarchie de l'unité d'organisation, vous obtiendrez une erreur indiquant «Objet introuvable».
L'adresse e-mail est un élément unique, mais plusieurs numéros de téléphone peuvent être spécifiés.
Explication des attributs utilisateur dans Active Directory (il existe d'autres pages d'explication pour chaque type d'attribut) https://docs.microsoft.com/en-us/windows/win32/ad/naming-properties
Liste des attributs Active Directory https://docs.microsoft.com/en-us/windows/win32/adschema/attributes-all
Syntaxe du filtre de recherche LDAP 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