通过Java查询Active Directory
从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,不会工作吗 我不太确定我是否知道这个问题的答案。我想我需要看一些清晰的例子来破解它通过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的目录 我不知道这是否是最好的方法,但
我希望这有帮助。您可以使用此库。它使用方便,功能强大
请参考以下代码
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=”以确定给定的过滤器是否存在。