Как узнать, что пользователь активен или неактивен в Active Directory
Я подключился к Active Directory, чтобы я проверил имя пользователя, но как я могу узнать, что пользователь активен или неактивен в AD?
Образец кода:
private Properties properties;
private DirContext dirContext;
private SearchControls searchCtls;
private String[] returnAttributes = { "sAMAccountName", "givenName", "cn", "mail"};
private String domainBase;
private String baseFilter = "(&((&(objectCategory=Person)(objectClass=User)))";
public ActiveDirectory(String username, String password, String domainController,String url) {
properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
properties.put(Context.PROVIDER_URL, url);
properties.put(Context.SECURITY_AUTHENTICATION,"simple");
properties.put(Context.SECURITY_PRINCIPAL,username+"@"+domainController);
properties.put(Context.SECURITY_CREDENTIALS, password);
//initializing active directory LDAP connection
try {
dirContext = new InitialDirContext(properties);
System.out.println("dirContext: "+dirContext);
} catch (NamingException e) {
e.printStackTrace();
log.severe(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
domainBase = getDomainBase(domainController);
//initializing search controls
searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchCtls.setReturningAttributes(returnAttributes);
}
public NamingEnumeration<SearchResult> searchUser(String searchValue, String searchBy, String searchBase) throws NamingException {
System.out.println("search value :: "+searchValue);
System.out.println("search base111 :: "+ ((null == searchBase) ? domainBase : getDomainBase(searchBase)));
String filter = getFilter(searchValue, searchBy);
String base = (null == searchBase) ? domainBase : getDomainBase(searchBase); // for eg.: "DC=myjeeva,DC=com";
System.out.println("this.dirContext : "+this.dirContext);
return this.dirContext.search(base, filter, this.searchCtls);
}
private String getFilter(String searchValue, String searchBy) {
String filter = this.baseFilter;
if(searchBy.equals("email")) {
filter += "(mail=" + searchValue + "))";
} else if(searchBy.equals("username")) {
filter += "(samaccountname=" + searchValue + "))";
}
System.out.println("filter : "+filter);
return filter;
}
Я сделал поиск с помощью этого this.dirContext.search(base, filter, this.searchCtls);
Как я могу узнать, что пользователь активен или неактивен?
Я нашел Google, чтобы получить active
пользователи (!(useraccountcontrol:1.2.840.113556.1.4.803:=2))
а также deactive
пользователи (useraccountcontrol:1.2.840.113556.1.4.803:=2)
Как реализовать эти два в коде JAVA.
2 ответа
1) взять атрибут "userAccountControl" из AD:
String s = (String) getAttribute(attrs, "userAccountControl");
2) разобрать его в длинное значение:
// 0 means not disabled (any value where value & 2 == 0 will do)
userAccountControl = StringUtils.isEmpty(s) ? 0 : Long.parseLong(s);
3) вернуть, если пользователь отключен:
public boolean isDisabled() {
return ((userAccountControl & 2) != 0);
}
Спасибо, ваша подсказка сработала, и мне удалось прочитать активных и неактивных пользователей.
Я успешно прочитал активных пользователей из Active Directory с помощью этого фильтра:
(&(objectClass=user)(objectCategory=person)(!(useraccountcontrol:1.2.840.113556.1.4.803:=2)))
И все неактивные пользователи с этим фильтром:
(&(objectClass=user)(objectCategory=person)(useraccountcontrol:1.2.840.113556.1.4.803:=2))