Запросы Active Directory через Java - PullRequest
4 голосов
/ 16 декабря 2010

Каков наилучший способ запроса Active Directory из Java?

Теперь я знаю, что в .NET есть специальные методы, встроенные для такого рода вещей. Но будет ли в Java хорошим способом сделать это вызов скрипта Powershell путем запуска процесса / командной строки?

Кроме того, почему принимается решение вызывать C # из Java в любое время, когда Java требуется для доступа к данным Windows WMI? Есть ли причина, по которой запуск чего-то вроде pstools (который может запускать процессы / команды на удаленных компьютерах) из командной строки, называемой Java, не будет работать?

Спасибо

Ответы [ 3 ]

6 голосов
/ 16 декабря 2010

Каков наилучший способ запроса Active Directory из Java?

Я не знаю, является ли это BEST , но типичный подходиспользовать LDAP.Вы можете сделать это с помощью JNDI.Примеры этого можно найти здесь .

Теперь я знаю, что .NET имеет специальные методы, встроенные для такого рода вещей.Но в Java хорошим ли будет способ вызова сценария Powershell путем запуска процесса / командной строки?

Это зависит.Я думаю, что некоторые java-люди будут смущаться этому, поскольку это довольно явное нарушение менталитета типа «пиши один раз, беги куда угодно».Однако, если вы можете гарантировать, что ваше приложение будет использоваться только на Windows, и у вас нет других альтернатив, я не вижу вреда.

Кроме того, почему принято решение вызывать C # изJava в любое время Java нужен для доступа к данным Windows WMI?Есть ли причина, по которой запуск чего-то вроде pstools (который может запускать процессы / команды на удаленных компьютерах) из командной строки, называемой Java, не будет работать?

Не уверен, что знаюответ на этот.Я думаю, мне нужно было бы увидеть несколько четких примеров, чтобы разобраться с этим.

Надеюсь, это поможет.

4 голосов
/ 30 марта 2012

Пожалуйста, передайте следующий код.

package active.security.util.ldap;

import java.util.Date;
import java.util.Hashtable;
import javax.naming.*;
import javax.naming.directory.*;
//import javax.naming.ldap.PagedResultsControl;

import active.security.util.DateTool;


public class JNDISearch {
    public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory"; // driver
    public static String MY_HOST = "ldap://dcserver:389"; // server and port
    public static String MY_SEARCHBASE = "DC=active,DC=local"; // base DC
    public static String MY_FILTER = "(&(objectclass=User)(!(objectclass=computer)))"; // filter
    public static String MGR_DN = "domain\\username"; // username
    public static String MGR_PW = "password"; // password
    public static String MY_ATTRS[] = {/* "cn","userpassword","mail", */"cn" };
    public static String temp = new String();

    public static void main(String[] ags) throws Exception{
        new JNDISearch().search();
    }


    @SuppressWarnings({ "rawtypes", "unchecked" })
    public String search() throws Exception {

        int userCount = 0;
        Date begin = new Date();

        try {
            Hashtable env = new Hashtable();

            //PagedResultsControl control = new PagedResultsControl(5000, true);
            env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
            env.put(Context.PROVIDER_URL, MY_HOST);
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, MGR_DN);
            env.put(Context.SECURITY_CREDENTIALS, MGR_PW);
            DirContext ctx = new InitialDirContext(env);

            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER,constraints);

            while (results != null && results.hasMore()) {
                SearchResult sr = (SearchResult) results.next();
                // String dn = sr.getName();
                String dn = sr.getName() + "," + MY_SEARCHBASE;

                Attributes ar = ctx.getAttributes(dn, MY_ATTRS);
                if (ar == null) {
                    System.out.println("Entry " + dn
                            + " has none of the specified attributes\n");
                } else {
                    Attribute attr = ar.get("cn");
                    String cn = (String)attr.get(0);
                    System.out.println(cn);

                }
                userCount++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            Date end = new Date();

            long seconds = DateTool.getSenconds(begin, end);

            System.out.println("total user: "+userCount);
            System.out.println("time cost: "+seconds+" seconds");

        }

        return null;

    }


}
1 голос
/ 21 апреля 2011

Вы можете использовать эту библиотеку.Это простой в использовании и мощный

http://code.google.com/p/jedi-obi/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...