我设计了一个应用程序,它将用户从活动目录带到MySQL数据库,并在GUI上显示它们。它还带来了用户所属的组。
所以,我的程序以这种方式工作:
for(String domain : allConfiguredADomains) {
LdapContext domainCtx = getDomainCtx(domain);
// Bring all users from this domain and store them in DB
getAllUsersForDomain(domain, domainCtx);
// Bring all the groups for every user
getAllGroupsForUsersInTheDomain(domain, domainCtx)
}
void getAllUsersForDomain(String domain, LdapContext domainCtx) {
String filter = "(objectClass=User)"
NamingEnumeration<SearchResult> result = domainCtx.search(domain, filter, ..);
while(result.hasMoreElements()) {
SearchResult searchResult = (SearchResult) result.nextElement();
// Process and store in database
storeUserInDatabase(searchResult);
}
}
void getAllGroupsForUsersInTheDomain(String domain, LdapContext domainCtx) {
List<String> userDistinguishedNames = getAllUsersFromDatabase("distinguishedName");
for(String userDn : userDistinguishedNames) {
String filter = "(&(objectClass=Group)(distinguishedName=" + userDn + "))";
NamingEnumeration<SearchResult> result = domainCtx.search(domain, filter, ..);
List<String> allGroupsOfUser = new List<String>();
while(result.hasMoreElements()) {
SearchResult searchResult = (SearchResult) result.nextElement();
String groupDistinguishedName = searchResult.getAttributes().get("distinguishedName").get();
allGroupsOfUser.add(groupDistinguishedName);
}
// Store them in database
storeAllGroupsOfUserInDatabase(userDn, allGroupsOfUser);
}
}
但是,当活动目录中的用户太多时,此应用程序会花费大量时间。所以,我决定实现并行(使用线程)。我使用用户distinguishedName
上的搜索过滤器对此进行了划分。
String filter = "(&(objectClass=User)(distinguishedName=a*"))";
等等..在每个线程中获取用户。
请注意:阅读用户属性memberOf
并未提供所有群组,因此我会单独提取群组。
答案 0 :(得分:0)
我不是Active Directory专家 - 只是想分享一些想法。
按字母表线程进行线程处理最多允许26个线程。您是否考虑过通过其他一些属性,组成员身份等创建搜索线程?这可能会让您创建更多线程。
查看Active Directory文档以查看是否有提高搜索性能的方法(例如,使用数据库我们可以创建索引)。