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

phantom76

Lotus team
25.02.2005
360
4
#1
Решаю задачу получения некоторых данных из 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 ?
 

Zeka

Well-known member
01.09.2009
219
0
#2
Достаточно бросить в jvm\lib\ext и рестартануть домино
 

phantom76

Lotus team
25.02.2005
360
4
#3
а по ошибкам никто не подскажет?

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

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


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

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">много буков</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='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 {
Database _db;
Document _doc;
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

_db = agentContext.getCurrentDatabase();

// Used for running agent on server with docID being passed from the calling action
Agent ag1 = agentContext.getCurrentAgent();
String paramid = ag1.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();
}
}

}[/CODE]
 

phantom76

Lotus team
25.02.2005
360
4
#4
После установке в свойствах агента базового класса - 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)
 

phantom76

Lotus team
25.02.2005
360
4
#6
Заметил особенность, на клиенте с теми же установленными библиотеками агент работает как надо, а на сервере награждает кучей ошибок написанной выше. Для тестирования обращаюсь к ldap-каталогу domino. В чем может быть причина ошибок на сервере?
 
13.03.2009
625
1
#7
После установке в свойствах агента базового класса - 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)
Исключение брошено в 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";