Java JNDI未返回组的外部安全主体成员

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

我有下面的Java代码,可以获取广告组的成员。但是,当一个成员来自不同的信任域,因此是一个外部安全主体时,代码不会获取该成员。我想知道是否有人以前有这方面的经验,可以提供一些建议。提前多谢

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();
        }
    }
}