【问题标题】:How to get the max. page size of Active Directory dynamically with Java如何获得最大值。使用 Java 动态显示 Active Directory 的页面大小
【发布时间】:2020-09-07 09:50:40
【问题描述】:

当群组的成员超过 1500 人时,我的 ldap 连接出现问题。我可以用下面的代码 sn-p 来解决它。尽管如此,我对硬编码的 PAGESIZE 变量非常不满意。由于这是 AD-Server 上的设置,我不知道这是否会改变以及何时改变。所以我的问题是,如果我可以使用 javax-library 或任何其他库动态获取此 pagesize 值? 如果有人知道解决此问题的完全不同的方法,我也很感兴趣。我认为必须有更好的方法在generateRangeString(int i) 函数中生成这个成员字符串。

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;
    }
}

【问题讨论】:

    标签: java active-directory ldap jndi


    【解决方案1】:

    如果只使用默认查询策略,搜索 CN=Default Query Policy,CN=Query-Policies,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,域命名上下文(例如 CN=Default Query Policy,CN=Query-Policies,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=example,DC=com) 带有类似“(&(cn=*) )"

    返回 ldapAdminLimits。解析 MaxPageSize 出属性:

    lDAPAdminLimits (13):MaxValRange=1500;最大接收缓冲区=10485760; MaxDatagramRecv=4096;最大池线程=4; MaxResultSetSize=262144; MaxTempTableSize=10000;最大查询持续时间=120; MaxPageSize=1000; MaxNotificationPerConn=5;最大活动查询=20; MaxConnIdleTime=900; InitRecvTimeout=120;最大连接数=5000;

    要查找所有查询策略,请在 CN=Query-Policies,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,域命名上下文中搜索 (& (objectClass=queryPolicy)) ...要么对查询策略进行大量研究并弄清楚如何确定哪个适用于您的连接,要么取最低值并知道您是安全的。

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多