Active directory 使用javax.naming,我可以确定是否连接到AD或其他类型的服务器吗?

Active directory 使用javax.naming,我可以确定是否连接到AD或其他类型的服务器吗?,active-directory,ldap,Active Directory,Ldap,仅使用javax.naming API,是否有一些元数据或其他技巧可用于确定我是否连接到Active Directory服务器或其他类型的目录服务器 根DSE可能包含包含有关目录服务器软件信息的属性。但是,在所有目录服务器实现中,根DSE和/或属性可能不存在,或者属性的名称可能不相同。不过,您可以查询DSE,查看它为您的应用程序支持的目录软件提供了什么。下面是获取根DSE的LDAP搜索: ldapsearch -h HOST -b " " -s base objectclass=* 这假设DS

仅使用javax.naming API,是否有一些元数据或其他技巧可用于确定我是否连接到Active Directory服务器或其他类型的目录服务器

根DSE可能包含包含有关目录服务器软件信息的属性。但是,在所有目录服务器实现中,根DSE和/或属性可能不存在,或者属性的名称可能不相同。不过,您可以查询DSE,查看它为您的应用程序支持的目录软件提供了什么。下面是获取根DSE的LDAP搜索:

ldapsearch -h HOST -b " " -s base objectclass=*
这假设DSE与objectclass关联。供应商可采用专有方法提供相同的信息

有一个信息RFC3045;它讨论在根DSE中存储与供应商相关的信息。目录服务器软件可能填充的两个属性是
vendorname
vendorversion
。您可以在正在使用的服务器返回的根DSE中检查这些文件是否存在

下面是一个粗略的Java代码,用于从根DSE中提取这两个属性(使用LDAP提供程序,即):

import java.util.Hashtable;
导入javax.naming.Context;
导入javax.naming.NamingEnumeration;
导入javax.naming.directory.DirContext;
导入javax.naming.directory.InitialDirContext;
导入javax.naming.directory.SearchControls;
导入javax.naming.directory.SearchResult;
公共类RootDSE{
公共静态void main(字符串[]args)引发异常{
Hashtable jndiParms=新的Hashtable();
jndiParms.put(Context.PROVIDER\u URL,“ldap://my.ldap.server:389");
put(Context.INITIAL_Context_工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
DirContext ctx=新的初始DirContext(jndiParms);
字符串searchBase=“”;
字符串searchFilter=“(objectclass=*)”;
SearchControls searchCtls=新的SearchControls();
searchCtls.setSearchScope(SearchControls.OBJECT_范围);
searchCtls.SetReturningAttribute(新字符串[]{“vendorname”,“vendorversion”});
NamingEnumeration搜索结果=
ctx.search(searchBase、searchFilter、searchCtls);
if(searchResults.hasMore()){
SearchResult SearchResult=(SearchResult)searchResults.next();
System.out.println(searchResult.getAttributes());
}
否则{
系统错误打印项次(“无结果”);
}
}
}
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;    
import javax.naming.directory.SearchResult;

public class RootDSE {
    public static void main(String[] args) throws Exception{
        Hashtable<String, String> jndiParms = new Hashtable<String, String>();

        jndiParms.put(Context.PROVIDER_URL, "ldap://my.ldap.server:389");
        jndiParms.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

        DirContext ctx = new InitialDirContext(jndiParms);

        String searchBase = "";
        String searchFilter = "(objectclass=*)";

        SearchControls searchCtls = new SearchControls();
        searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
        searchCtls.setReturningAttributes(new String[] { "vendorname", "vendorversion" } );

        NamingEnumeration<SearchResult> searchResults = 
            ctx.search(searchBase, searchFilter, searchCtls);

        if (searchResults.hasMore()) {
            SearchResult searchResult = (SearchResult)searchResults.next();
            System.out.println(searchResult.getAttributes());
        }
        else {
            System.err.println("No results");
        }
    }
}