【问题标题】:Querying Active Directory via Java通过 Java 查询 Active Directory
【发布时间】:2010-12-15 23:59:17
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: java powershell active-directory


    【解决方案1】:

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

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

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

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

    此外,为什么要做出决定 随时从 Java 调用 C# 需要访问 Windows WMI 数据?是 运行某事是有原因的 像 pstools (可以启动 远程进程/命令 计算机)从命令行调用 用Java,不行吗?

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      请参考以下代码。

      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=”以查看给定的 是否存在。
      【解决方案3】:

      你可以使用这个库。它易于使用且功能强大

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

      【讨论】:

      • 糟糕的库 (v2.3.0)。几乎没有 JavaDoc(现有的法语版本)、糟糕的 API、错误跟踪中没有信息、使用示例很少……最重要的是,它甚至没有显着简化开发!我最好使用纯 LDAP。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多