【问题标题】:Wanted to delete ldap node and delete all the subtree node under it想删除ldap节点并删除它下面的所有子树节点
【发布时间】:2016-09-12 17:31:36
【问题描述】:

我想删除ldap节点并删除它下面的所有子树节点。 例如,我想删除 ou=F115630019 及其子节点,即快照中显示的 cn =xxxxx 和 ou=115630019。

在运行以下代码时,我遇到了以下错误。请告诉我如何解决此问题。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1911)
    at deleteorg.deleteDN(deleteorg.java:28)
    at deleteorg.deleteDN(deleteorg.java:58)
    at deleteorg.main(deleteorg.java:96)

java代码:-

  import java.util.*;
    import javax.naming.Context;
    import javax.naming.ContextNotEmptyException;
    import javax.naming.NameNotFoundException;
    import javax.naming.NamingEnumeration;
    import javax.naming.NamingException;
    import javax.naming.directory.Attributes;
    import javax.naming.directory.BasicAttributes;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    import javax.naming.directory.SearchControls;
    import javax.naming.directory.SearchResult;

    public class deleteorg {

        public boolean deleteDN(String srchost, String srcport, String srcuserId,String srcpasswd, String srcBaseDn, String deleteDn) {
            String attribList = "";
            String temp = null;
            try {
                DirContext srcCtx = createContext(srchost, srcport, srcBaseDn,
                        srcuserId, srcpasswd);

                SearchControls srcont = new SearchControls();
                srcont.setSearchScope(SearchControls.SUBTREE_SCOPE);
                int i = deleteDn.indexOf(",");
                System.out.println("i: "+i);
                System.out.println("deleteDN="+deleteDn);
                deleteDn = deleteDn.substring(0,deleteDn.indexOf(","));
                System.out.println("index->>"+i+"------" + deleteDn);

                NamingEnumeration answer = null;
                try {
                 answer = srcCtx.search(deleteDn, "objectclass=*", srcont);
                 System.out.println("Answer"+ answer);
                } catch (NameNotFoundException ne) {
                    System.out.println("name not found exception");
                }
                if (answer != null) {
                    while (answer.hasMore()) {
                        Attributes attrs = new BasicAttributes(true);
                        System.out.println("Attr"+ attrs);
                        SearchResult sr = (SearchResult) answer.next();
                        System.out.println("Search Result"+sr);
                        String addDN = sr.getName() + "," + deleteDn;
                        System.out.println("adDN"+addDN);
                        String attribnamevalues = "";
                        if (addDN.indexOf(',') == 0)
                            addDN = addDN.substring(1); // get rid of the leading
                                                        // ","

                        try {
                            System.out.println("AddDN"+addDN);
                            srcCtx.destroySubcontext(addDN);
                    System.out.println("destroyed");
                        } catch (ContextNotEmptyException e) {
                        }
                    }
                    deleteDN(srchost, srcport, srcuserId, srcpasswd, srcBaseDn,
                            deleteDn);
                }
                srcCtx.close();
                return true;
            } catch (NamingException e) {
                e.printStackTrace();
                return false;
            }
        }

        public DirContext createContext(String servername, String port, String basedn, String username, String password) {
            System.out.println("sername=" + servername + "#port=" + port + "#baseDn="+ basedn + "#uid=" + username + "#pwd=" + password);

            DirContext ctx;
            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://" + servername + ":" + port + "/"
                    + basedn);
            env.put(Context.SECURITY_PRINCIPAL, username);
            env.put(Context.SECURITY_CREDENTIALS, password);
            env.put(Context.SECURITY_AUTHENTICATION, "simple");

            try {
                ctx = new InitialDirContext(env);
                return (ctx);

            } catch (NamingException e) {
                e.printStackTrace();
                return (null);
            }
        }


        public static void main(String[] args) {

            deleteorg ctx = new deleteorg();

            ctx.deleteDN("localhost", "1389","cn=Directory Manager","Welcome1","ou=organizations,dc=xyz,dc=com","ou=F115630019  ,ou=organizations,dc=xyz,dc=com");


        }

    }

【问题讨论】:

标签: java apache ldap jndi spring-ldap


【解决方案1】:

只有叶节点可以从 ldap 中删除。您需要按照以下步骤操作。

  1. 遍历subtre,找到最后一个元素
  2. 以相反的顺序删除此节点并向上移动直到到达目标/突出显示的节点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多