首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得最大值。用Java动态调整Active Directory的页面大小

如何获得最大值。用Java动态调整Active Directory的页面大小
EN

Stack Overflow用户
提问于 2020-09-07 17:50:41
回答 1查看 363关注 0票数 0

当组有超过1500个成员时,我的ldap连接出现了问题。我可以用下面的代码片段来解决这个问题。尽管这样可以工作,但我对硬编码的PAGESIZE变量非常不满意。因为这是AD-Server上的一个设置,所以我不知道它是否以及何时会改变。所以我的问题是,我是否可以用javax-library或任何其他库动态地获得这个pagesize值?如果有人知道解决这个问题的完全不同的方法,我也很好奇。我认为一定有比在generateRangeString(int i)函数中生成这个成员更好的方法--字符串。

代码语言:javascript
复制
package main.java;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.Properties;

public class LdapService {

    private static final int PAGESIZE = 1500;

    public void printAllMembersOfSpecificGroup() throws Exception {
        // Initialize
        LdapContext ldapContext = null;
        NamingEnumeration<SearchResult> results = null;
        NamingEnumeration<?> members = null;

        try {

            Properties properties = new Properties();
            properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            properties.put(Context.PROVIDER_URL, "ldap://url");
            properties.put(Context.SECURITY_AUTHENTICATION, "simple");
            properties.put(Context.SECURITY_PRINCIPAL, "Security Principle");
            properties.put(Context.SECURITY_CREDENTIALS, "password");


            ldapContext = new InitialLdapContext(properties, null);

            int range = 0;
            boolean finish = false;
            while (finish != true) {
                // Set search controls
                SearchControls searchCtls = new SearchControls();
                searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
                searchCtls.setReturningAttributes(generateRangeArray(range));

                // Get results
                results = ldapContext.search("base string", String.format("(CN=%s)", "Group name"), searchCtls);
                if (results.hasMoreElements() == true) {
                    SearchResult result = results.next();
                    try {
                        if(result.getAttributes().get(generateRangeString(range)) == null){
                            members = result.getAttributes().get(generateLastRangeString(range)).getAll();
                        } else {
                            members = result.getAttributes().get(generateRangeString(range)).getAll();
                        }
                        while (members.hasMore()) {
                            String distinguishedName = (String) members.next();
                            System.out.println(distinguishedName);
                        }
                        range++;
                    } catch (Exception e) {
                        // Fails means there is no more result
                        e.printStackTrace();
                        finish = true;
                    }
                }
            }
        } catch (NamingException e) {
            throw new Exception(e.getMessage());
        } finally {
            if (ldapContext != null) {
                ldapContext.close();
            }
            if (results != null) {
                results.close();
            }
        }
    }

    public static String[] generateRangeArray(int i) {
        String range = "member;range=" + i * PAGESIZE + "-" + ((i + 1) * PAGESIZE - 1);
        String[] returnedAtts = { range };

        return returnedAtts;
    }

    public static String generateRangeString(int i) {
        String range = "member;range=" + i * PAGESIZE + "-" + ((i + 1) * PAGESIZE - 1);

        return range;
    }
    public static String generateLastRangeString(int i) {
        String range = "member;range=" + i * PAGESIZE + "-" + "*";

        return range;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-08 23:08:41

如果仅使用默认查询策略,则在CN=Default查询策略、CN=查询策略、CN=Directory服务、CN=Windows NT、CN=Services、CN=Configuration、域名上下文(例如,CN=Default查询策略、CN=查询策略、CN=Directory服务、CN=Windows NT、CN=Services、CN=Configuration、DC=example、DC=com)进行搜索,并使用类似“(&(cn=*)”)这样的筛选器进行搜索

返回ldapAdminLimits。从属性中解析出MaxPageSize:

lDAPAdminLimits (13):MaxValRange=1500;MaxReceiveBuffer=10485760;MaxDatagramRecv=4096;MaxPoolThreads=4;MaxResultSetSize=262144;MaxTempTableSize=10000;MaxQueryDuration=120;MaxPageSize=1000;MaxNotificationPerConn=5;MaxActiveQueries=20;MaxConnIdleTime=900;InitRecvTimeout=120;MaxConnections=5000;

要查找所有查询策略,请搜索CN= query -Policies,CN=Directory服务,CN=Windows NT,CN=Services,CN=Configuration,域名上下文(&(objectClass=queryPolicy)) ...要么大量研究查询策略,找出如何确定哪种策略适用于您的连接,要么采用最低的值并知道您是安全的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63775179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档