从Java查询Active Directory的最佳方法是什么?
现在我知道.NET内置了特殊方法来执行此类操作。但是在Java中,通过启动进程/命令行来调用Powershell脚本是一种很好的方法吗?
此外,为什么在Java需要访问Windows WMI数据时决定从Java调用C#?是否有理由从Java调用的命令行运行类似pstools(可以在远程计算机上启动进程/命令)这样的东西?
由于
答案 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)
您可以使用此库。它易于使用且功能强大