通过Java查询Active Directory

4
什么是从Java查询Active Directory的最佳方法?
现在我知道.NET有特殊的内置方法来做这种事情。但在Java中,通过启动进程/命令行调用Powershell脚本是否是一个好方法?
此外,为什么决定在Java需要访问Windows WMI数据时调用C#?是否有原因可以解释为什么无法从Java调用类似pstools(可以在远程计算机上启动进程/命令)的命令行?
谢谢
3个回答

6

如何使用Java查询Active Directory?

我不确定这是最好的方法,但典型的做法是使用LDAP。您可以使用JNDI来实现。可以在这里找到示例。

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

这取决于情况。我认为一些Java开发人员可能会对此感到不满,因为它明显违反了“编写一次,随处运行”的理念。但是,如果您可以保证您的应用程序仅在Windows上使用且没有其他选择,则我认为没有什么损害。

此外,为什么需要在Java需要访问Windows WMI数据时调用C#?是否有理由从Java调用命令行启动pstools(可以在远程计算机上启动进程/命令)而不起作用?我不确定我知道这个问题的答案。我认为我需要看一些明显的例子才能尝试解决它。希望这可以帮到你。

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;

    }


}

我发现这非常有用。您可以更改MY_FILTER的值为“mail=<emailaddress>”,以查找给定的<emailaddress>是否存在。 - Haphazard

1

3
可怕的库(v2.3.0)。几乎没有JavaDoc(现有的都是法语),API糟糕,错误追踪中没有任何信息,使用示例很少……最重要的是,它甚至不能显著地简化开发!我最好直接使用纯LDAP。 - Alex Abdugafarov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接