Java JNDI未返回组的外部安全主体成员
我有下面的Java代码,可以获取广告组的成员。但是,当一个成员来自不同的信任域,因此是一个外部安全主体时,代码不会获取该成员。我想知道是否有人以前有这方面的经验,可以提供一些建议。提前多谢Java JNDI未返回组的外部安全主体成员,java,active-directory,ldap,jndi,Java,Active Directory,Ldap,Jndi,我有下面的Java代码,可以获取广告组的成员。但是,当一个成员来自不同的信任域,因此是一个外部安全主体时,代码不会获取该成员。我想知道是否有人以前有这方面的经验,可以提供一些建议。提前多谢 import java.util.ArrayList; 导入java.util.Hashtable; 导入java.util.Vector; 导入javax.naming.Context; 导入javax.naming.NameNotFoundException; 导入javax.naming.Naming
import java.util.ArrayList;
导入java.util.Hashtable;
导入java.util.Vector;
导入javax.naming.Context;
导入javax.naming.NameNotFoundException;
导入javax.naming.NamingEnumeration;
导入javax.naming.NamingException;
导入javax.naming.directory.Attribute;
导入javax.naming.directory.Attributes;
导入javax.naming.directory.SearchControls;
导入javax.naming.directory.SearchResult;
导入javax.naming.ldap.InitialLdapContext;
导入javax.naming.ldap.LdapContext;
公共类组成员
{
公共静态void main(字符串[]args)
{
ArrayList成员=新的ArrayList();
String ldapUsername=“cn=accountname,OU=Service Accounts,OU=JKL,DC=GHI,DC=DEF,DC=ABC,DC=COM”;
字符串ldapPassword=“密码”;
字符串servername=”ldaps://GHI.DEF.ABC.COM";
String searchbase=“DC=GHI,DC=DEF,DC=ABC,DC=COM”;
String searchfilter=“(&(objectCategory=group)(sAMAccountName=groupname))”;
Hashtable env=新的Hashtable();
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY\u主体,ldapUsername);
环境put(Context.SECURITY_凭证,ldapPassword);
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER\u URL,servername);
LdapContext ctx;
试一试{
ctx=新的InitialLdapContext(env,null);
NamingEnumeration结果=空;
试一试{
SearchControls=新的SearchControls();
控件.setSearchScope(SearchControls.SUBTREE_范围);
结果=ctx.search(searchbase、searchfilter、controls);
while(results.hasMore()){
SearchResult SearchResult=(SearchResult)results.next();
Attributes=searchResult.getAttributes();
Attribute attr=attributes.get(“成员”);
对于(int i=0;i您如何连接到Microsoft Active Directory?(连接到DC或全局目录或???)您的成员集合中有什么?我希望您有一个可分辨名称列表,其中包括外国安全主体。(DN将以CN=外部安全主体,DC=GHI,DC=DEF,DC=ABC,DC=COM
)结束,它可能是一个非常大的组吗?您只看到1000或1500个成员吗?AD一次只能返回1000或1500个(取决于Windows Server的版本),您需要询问下一批。此处描述:您如何连接到Microsoft Active Directory?(连接到DC或全局目录或???)您的成员集合中有什么?我希望您有一个可分辨名称列表,其中包括外国安全主体。(DN将以CN=Foreign Security Principals,DC=GHI,DC=DEF,DC=ABC,DC=COM
结尾)这可能是一个非常大的组吗?您只看到1000或1500名成员吗?AD一次只返回1000或1500名成员(取决于Windows Server的版本),您需要请求下一批。如下所述:
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.NameNotFoundException;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
public class GroupMembers
{
public static void main(String[] args)
{
ArrayList<String> members = new ArrayList<String>();
String ldapUsername = "cn=accountname,OU=Service Accounts,OU=JKL,DC=GHI,DC=DEF,DC=ABC,DC=COM";
String ldapPassword = "password";
String servername = "ldaps://GHI.DEF.ABC.COM";
String searchbase = "DC=GHI,DC=DEF,DC=ABC,DC=COM";
String searchfilter = "(&(objectCategory=group)(sAMAccountName=groupname))";
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, servername);
LdapContext ctx;
try {
ctx = new InitialLdapContext(env, null);
NamingEnumeration<?> results = null;
try {
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
results = ctx.search(searchbase, searchfilter, controls);
while (results.hasMore()) {
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attr = attributes.get("member");
for (int i=0;i<attr.size();i++) {
members.add((String) attr.get(i));
}
}
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (NamingException e) {
throw new RuntimeException(e);
} finally {
if (results != null) {
try {
results.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (ctx != null) {
try {
ctx.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// Loop through the memebers of the and print them out
for (int i = 0; i < members.size(); i++) {
System.out.println(members.get(i));
}
} catch (NamingException e1) {
e1.printStackTrace();
}
}
}