Прочитать данные из AD (LDAP)

  • Автор темы phantom76
  • Дата начала
P

phantom76

Решаю задачу получения некоторых данных из AD для приложения на lotus.

Насколько я понял через LS прочитать их не удастся..

нашел пример взят с сайта IBM (код см. в сообщениях ниже), пример агента на java по доступу к LDAP-каталогу, как я понимаю для доступа к Microsoft AD он тоже сгодится?

скачал библиотеки Java Naming and Directory Interface (JNDI). установил на сервер и клиент, при выполнении агента на сервер появляются ошибки:

22.03.2011 12:37:18 RunJava: Agent printing:
22.03.2011 12:38:21 Agent error: Error loading Agent Class: JavaAgent
22.03.2011 12:38:21 Agent error: java.lang.ClassNotFoundException: JavaAgent
22.03.2011 12:38:21 Agent error: at lotus.domino.AgentLoader.loadClass(Unknown Source)
22.03.2011 12:38:21 Agent error: at java.lang.ClassLoader.loadClass(ClassLoader.java:609)
22.03.2011 12:38:21 Agent error: at lotus.domino.AgentLoader.runAgent(Unknown Source)

Может кто-то сориентирует что проверять?

для версии 8.5.1 и клиент и сервер , внешние jar нужно прописывать в ini или достаточно бросить в jvm\lib\ext ?
 
Z

Zeka

Достаточно бросить в jvm\lib\ext и рестартануть домино
 
P

phantom76

а по ошибкам никто не подскажет?

Кстати если AD подцепить как ldap-каталог в коллекцию АК в lotus , удастся ли программным путем осуществлять поиск в AD?

P.S для разбора технологии создавал агент как описанный в примере на сайте IBM ( смотри ссылку выше), но оживить не удалось.

Правильно я понимаю, что при создании нового агента java , я должен как в примере заменить созданный стандартный package public class JavaAgent переименовать на свой LDAPSearchWithFilter?

Java:
import lotus.domino.*;

import javax.naming.*;
import javax.naming.directory.*;

import java.util.Hashtable;
import java.util.Vector;

public class LDAPSearchWithFilter extends AgentBase {
    
    public void NotesMain() {
        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            Database _db = agentContext.getCurrentDatabase();
            
            // Used for running agent on server with docID being passed from the calling action
            Agent agent = agentContext.getCurrentAgent();
            String paramid = agent.getParameterDocID();
            Document doc = _db.getDocumentByID(paramid);
            
            String searchCN = doc.getItemValueString("SearchCN");
            String searchAttr = doc.getItemValueString("SearchAttr");
            // Set up the environment for creating the initial context
            String ldapCF = "com.sun.jndi.ldap.LdapCtxFactory";
            String ldapURL = "ldap://cm-test:389/";
            String ldapBaseDN = "ou=myou, o=myorg, c=us";
            String ldapUserID = "cn=Usertest";
            String ldapPassword = "";
            Hashtable env = new Hashtable(4);
            env.put(Context.INITIAL_CONTEXT_FACTORY, ldapCF);
            env.put(Context.PROVIDER_URL, ldapURL + ldapBaseDN);
            env.put(Context.SECURITY_PRINCIPAL, ldapUserID);
            env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
            
            try {
                // Create initial context
                DirContext ctx = new InitialDirContext(env);
                String[] attrIDs = {searchAttr};
                SearchControls ctls = new SearchControls();
                ctls.setReturningAttributes(attrIDs);
                
                // Specify the search filter
                String filter = "(|(cn=" + searchCN + ")(uid=" + searchCN + "))";
                // Search for objects using the above filter
                NamingEnumeration answer = ctx.search("", filter, ctls);
                findCN(answer, doc);
                
                // Close the context when we're done
                ctx.close();
            }
            catch (NamingException e) {
                e.printStackTrace();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void findCN(NamingEnumeration enum1, Document doc) {
        try {
            if (enum1.hasMore()) {
                while (enum1.hasMore()) {
                    SearchResult sr = (SearchResult)enum1.next();
                    System.out.println(">>>" + sr.getName());
                    findAttrs(sr.getAttributes(), doc);
                }
            }
            else {
                Item item = doc.getFirstItem("HiddenSearchResults");
                doc.replaceItemValue("HiddenSearchResults", "CN not found");
                doc.save(true);
            }
        }
        catch (NamingException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void findAttrs(Attributes attrs, Document doc) {
        try {
            Item item = doc.getFirstItem("HiddenSearchResults");
            Vector v = new Vector();
            String result;
            
            if (attrs.size() == 0)
                v.addElement("Name found but attribute is blank or not found. Try again ...");
            else {
                /* Get each attribute */
                try {
                    for (NamingEnumeration ae = attrs.getAll(); ae.hasMore();) {
                        Attribute attr = (Attribute)ae.next();
                        /* Get each value */
                        for (NamingEnumeration e = attr.getAll(); e.hasMore();) {
                            result = (String)e.next();
                            v.addElement(result);
                        }
                    }
                }
                catch (NamingException e) {
                    e.printStackTrace();
                }
            }
            doc.replaceItemValue("HiddenSearchResults", v);
            doc.save(true);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}
 
P

phantom76

После установке в свойствах агента базового класса - LDAPSearchWithFilter.class появился другой набор ошибок:

вероятнее всего связан с ошибкой контекста доступа к ldap, завтра проверю на другом..

23.03.2011 00:46:15 Agent error: javax.naming.CommunicationException: localhost:389. Root exception is
23.03.2011 00:46:15 Agent error: java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key connect_not_allowed
23.03.2011 00:46:15 Agent error: at java.util.ResourceBundle.getObject(ResourceBundle.java:329)
23.03.2011 00:46:15 Agent error: at java.util.ResourceBundle.getString(ResourceBundle.java:289)
23.03.2011 00:46:15 Agent error: at lotus.notes.JavaString.getFormattedString(JavaString.java:114)
23.03.2011 00:46:15 Agent error: at lotus.notes.AgentSecurityManager.checkConnect(AgentSecurityManager.java:214)
23.03.2011 00:46:15 Agent error: at java.net.InetAddress.getAllByName0(InetAddress.java:1075)
23.03.2011 00:46:15 Agent error: at java.net.InetAddress.getAllByName0(InetAddress.java:1056)
23.03.2011 00:46:15 Agent error: at java.net.InetAddress.getAllByName(InetAddress.java:1050)
23.03.2011 00:46:15 Agent error: at java.net.InetAddress.getByName(InetAddress.java:964)
23.03.2011 00:46:15 Agent error: at java.net.InetSocketAddress.<init>(InetSocketAddress.java:137)
23.03.2011 00:46:15 Agent error: at java.net.Socket.<init>(Socket.java:150)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.Connection.createSocket(Connection.java:376)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.Connection.<init>(Connection.java:211)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:136)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1685)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2616)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:307)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:190)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:208)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:151)
23.03.2011 00:46:15 Agent error: at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:81)
23.03.2011 00:46:15 Agent error: at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:675)
23.03.2011 00:46:15 Agent error: at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:257)
23.03.2011 00:46:15 Agent error: at javax.naming.InitialContext.init(InitialContext.java:233)
23.03.2011 00:46:15 Agent error: at javax.naming.InitialContext.<init>(InitialContext.java:209)
23.03.2011 00:46:15 Agent error: at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:94)
23.03.2011 00:46:15 Agent error: at LDAPSearchWithFilter.NotesMain(Unknown Source)
23.03.2011 00:46:15 Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
23.03.2011 00:46:15 Agent error: at lotus.domino.NotesThread.run(Unknown Source)
 
P

phantom76

Спасибо, вроде разобрался... агент запустился.

Добавлено:
Заметил особенность, на клиенте с теми же установленными библиотеками агент работает как надо, а на сервере награждает кучей ошибок написанной выше. Для тестирования обращаюсь к ldap-каталогу domino. В чем может быть причина ошибок на сервере?
 
Последнее редактирование модератором:
T

turumbay

После установке в свойствах агента базового класса - LDAPSearchWithFilter.class появился другой набор ошибок:

23.03.2011 00:46:15 Agent error: javax.naming.CommunicationException: localhost:389. Root exception is
23.03.2011 00:46:15 Agent error: java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key connect_not_allowed
...
Исключение брошено в AgentSecurityManager, но сообщение об ошибке домино сгенерить не смог.( java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key connect_not_allowed ). Очень похоже на нелокализованного клиента( или сервера ).
Установите пакет локализации, соответствующий системе - избавитесь от ошибки PropertyResourceBundle - сможете понять чего от вас хочет SecurityManager.

Судя по основной части стектрейса - чего-то не хватает в java.policy. Предположу, что нужен permission java.net.SocketPermission "localhost:389", "connect";
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!