通过Java查询Active Directory

时间:2010-12-15 23:59:17

标签: java powershell active-directory

从Java查询Active Directory的最佳方法是什么?

现在我知道.NET内置了特殊方法来执行此类操作。但是在Java中,通过启动进程/命令行来调用Powershell脚本是一种很好的方法吗?

此外,为什么在Java需要访问Windows WMI数据时决定从Java调用C#?是否有理由从Java调用的命令行运行类似pstools(可以在远程计算机上启动进程/命令)这样的东西?

由于

3 个答案:

答案 0 :(得分:6)

  

查询Active的最佳方法是什么   来自Java的目录?

我不知道它是否是 BEST 方式,但典型的方法是使用LDAP。您可以使用JNDI执行此操作。可以找到here的例子。

  

现在我知道.NET很特别   用于执行此类操作的内置方法   事情但在Java中,会调用一个   通过启动一个Powershell脚本   进程/命令行是一个很好的方法   这样做?

这取决于。我认为一些java人会对此感到畏缩,因为它明显违反了“一次编写,随处运行”类型的心态。但是,如果您可以保证您的应用程序只能在Windows上使用而您没有其他选择,那么我看不到它的危害。

  

此外,为什么要做出决定   随时随地从Java调用C#   需要访问Windows WMI数据?是   有什么理由为什么运行   像pstools(可以启动   远程进程/命令   计算机)来自命令行   通过Java,将无法正常工作?

我不太确定我知道这个问题的答案。我想我需要看一些明确的例子来解决它。

我希望这会有所帮助。

答案 1 :(得分:4)

请参阅以下代码。

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;

    }


}

答案 2 :(得分:1)

您可以使用此库。它易于使用且功能强大

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