通过Java查询Active Directory

通过Java查询Active Directory,java,powershell,active-directory,Java,Powershell,Active Directory,从Java查询Active Directory的最佳方法是什么 现在我知道.NET内置了专门的方法来做这类事情。但在Java中,通过启动进程/命令行调用Powershell脚本是一种很好的方法吗 此外,为什么决定在Java需要访问Windows WMI数据时从Java调用C#?从Java调用的命令行运行pstools(它可以在远程计算机上启动进程/命令)这样的工具不起作用,有什么原因吗 谢谢 查询Active Directory的最佳方式是什么 来自Java的目录 我不知道这是否是最好的方法,但

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

现在我知道.NET内置了专门的方法来做这类事情。但在Java中,通过启动进程/命令行调用Powershell脚本是一种很好的方法吗

此外,为什么决定在Java需要访问Windows WMI数据时从Java调用C#?从Java调用的命令行运行pstools(它可以在远程计算机上启动进程/命令)这样的工具不起作用,有什么原因吗

谢谢

查询Active Directory的最佳方式是什么 来自Java的目录

我不知道这是否是最好的方法,但典型的方法是使用LDAP。您可以使用JNDI实现这一点。这方面的例子可以找到

现在我知道.NET有特殊的功能 用于执行此排序的内置方法 当然。但是在Java中,调用 通过启动 进程/命令行是一种很好的 这样做

那要看情况。我认为一些java人士会对此感到畏缩,因为这显然违反了“编写一次,在任何地方运行”的思维方式。然而,如果你能保证你的应用程序只在windows上使用,并且你没有其他选择,那么我看不出有什么害处

此外,为何作出这项决定 随时从Java调用C# 需要访问Windows WMI数据吗?是 为什么要做一些事情 像pstools(可以启动 远程计算机上的进程/命令 计算机)从名为 用Java,不会工作吗

我不太确定我是否知道这个问题的答案。我想我需要看一些清晰的例子来破解它


我希望这有帮助。

您可以使用此库。它使用方便,功能强大


请参考以下代码

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;

    }


}

可怕的库(v2.3.0)。几乎没有JavaDoc(现有的是法语),糟糕的API,错误跟踪中没有信息,很少有使用示例。。。最重要的是,它甚至没有大量简化开发!我最好使用纯LDAP。我发现这非常有用。您可以将
MY_FILTER
值更改为“mail=”以确定给定的过滤器是否存在。