package encode;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.ldap.LdapContext;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.NamingEnumeration;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import java.util.Enumeration;
public class LDAPGetDomain {
public static String getFormatOU(String ou) {
String[] splt = ou.split(",");
String realFormat = "";
for (int i = splt.length - 1; i >= 0; i--) {
realFormat = realFormat + "OU=" + splt[i] + ",";
}
if (',' == realFormat.charAt(realFormat.length() - 1)) {
realFormat = realFormat.substring(0, realFormat.length() - 1);
}
return realFormat;
}
public static String getFormatDoamin(String domainName) {
String[] splt = domainName.split("//.");
String realFormat = "";
for (int i = 0; i < splt.length; i++) {
if (!"".equals(splt[i]))
realFormat += "DC=" + splt[i] + ",";
}
if (',' == realFormat.charAt(realFormat.length() - 1)) {
realFormat = realFormat.substring(0, realFormat.length() - 1);
}
return realFormat;
}
public static String GetRemoteDomainUser(LdapContext ctx, String ou,
String domainName) throws NamingException {
String xml = "";
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
String searchFilter = "objectClass=User";
String searchBase = "";
searchBase = ou + "," + getFormatDoamin(domainName);
String returnedAtts[] = { "name", "telephoneNumber", "mobile", "mail" };
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration answer = ctx.search(searchBase, searchFilter,
searchCtls);
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();
int oulenth = 0;
Attributes Attrs = sr.getAttributes();
if (Attrs != null) {
try {
xml += "<User ";
for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
Attribute Attr = (Attribute) ne.next();
if ("name".equals(Attr.getID())) {
xml += "name=";
}
if ("telephoneNumber".equals(Attr.getID())) {
xml += "tel=";
}
if ("mobile".equals(Attr.getID())) {
xml += "mobile=";
}
if ("mail".equals(Attr.getID())) {
xml += "email=";
}
Enumeration values = Attr.getAll();
if (values != null) {
while (values.hasMoreElements()) {
xml += "/"" + values.nextElement() + "/" ";
oulenth = oulenth + 1;
}
}
}
xml += "/>";
} catch (NamingException e) {
System.err.println("Throw Exception : " + e);
}
}
}
return xml;
}
public String GetRemoteDomainGroupDie(LdapContext ctx, String ou,
String domainName) throws NamingException{
String xml="";
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
String searchFilter = "objectClass=organizationalUnit";
String searchBase = "";
searchBase =ou + "," + getFormatDoamin(domainName);
String returnedAtts[] = { "name" };
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration answer = ctx.search(searchBase, searchFilter,
searchCtls);
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();
String ouName = sr.getName();
//System.out.println(ouName);
if (ouName != null && !"".equals(ouName)) {
Attributes Attrs = sr.getAttributes();
if (Attrs != null) {
try {
for (NamingEnumeration ne = Attrs.getAll(); ne
.hasMore();) {
Attribute Attr = (Attribute) ne.next();
if ("name".equals(Attr.getID())) {
Enumeration values = Attr.getAll();
if (values != null) { // 迭代
while (values.hasMoreElements()) {
String v=(String)values.nextElement();
xml+="<Group name=/""+v+"/">";
xml += GetRemoteDomainUser(ctx, "OU="+v+","+ou, domainName);
xml+=GetRemoteDomainGroupDie(ctx,"OU="+v+","+ou,domainName);
xml+="</Group>";
}
}
}
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}else{
xml += GetRemoteDomainUser(ctx,
getFormatOU(ou), domainName);
}
}
return xml;
}
public String GetRemoteDomainGroup(String ip, String port,
String adminName, String adminPassword, String domainName, String ou) {
String xml = "<?xml version=/"1.0/" encoding=/"gbk/" ?>";
Hashtable<String, String> HashEnv = new Hashtable<String, String>();
String rport = port;
if (port == null || "".equals(port))
rport = "389";
String LDAP_URL = "ldap://" + ip + ":" + rport;
adminName = adminName + "@" + domainName;
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
HashEnv.put(Context.SECURITY_PRINCIPAL, adminName);
HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword);
// Password
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
HashEnv.put(Context.PROVIDER_URL, LDAP_URL);
try {
LdapContext ctx = new InitialLdapContext(HashEnv, null);
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
String searchFilter = "objectClass=organizationalUnit";
String searchBase = "";
searchBase = getFormatOU(ou) + "," + getFormatDoamin(domainName);
String returnedAtts[] = { "name" };
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration answer = ctx.search(searchBase, searchFilter,
searchCtls);
int oulenth = 0;
String[] splt = ou.split(",");
for (int j = 0; j < splt.length; j++) {
if (!"".equals(splt[j])) {
xml = xml + "<Group name=/"" + splt[j] + "/">";
oulenth = oulenth + 1;
}
}
xml += GetRemoteDomainUser(ctx, getFormatOU(ou), domainName);
xml+=GetRemoteDomainGroupDie(ctx, getFormatOU(ou), domainName);
for (int i = 0; i < oulenth; i++) {
xml += "</Group>";
}
ctx.close();
}
catch (NamingException e) {
e.printStackTrace();
}
return xml;
}
public static void main(String args[]) {
LDAPGetDomain ad = new LDAPGetDomain();
System.out.println(ad.GetRemoteDomainGroup("192.168.2.44", "389",
"administrator", "qqqqqqqq1!", "Test.bomb", "hongan,rtrt"));
}
}
输出结果:
<?xml version="1.0" encoding="gbk" ?><Group name="hongan"><Group name="rtrt"><User name="small" /><Group name="ggd"><Group name="343"><Group name="6677"></Group></Group></Group><Group name="gggg"><Group name="111"><Group name="ggg"></Group><Group name="iiii"></Group></Group><Group name="222"><Group name="lllk"></Group></Group></Group></Group></Group>