仅使用javax.naming API,是否有一些元数据或其他技巧可用于确定我是否实际连接到Active Directory服务器或其他类型的目录服务器?
答案 0 :(得分:2)
根DSE可能包含包含有关目录服务器软件信息的属性。但是,根DSE和/或属性可能不存在,或者在所有目录服务器实现中可能不会将属性命名为相同。不过,您可以查询DSE并查看它为您的应用程序支持的目录软件提供的功能。这是一个获取根DSE的LDAP搜索:
ldapsearch -h HOST -b " " -s base objectclass=*
这假定DSE与对象类相关联。供应商可能拥有提供相同方法的专有方法。
有这个信息RFC 3045;它讨论了在根DSE中存储供应商相关信息。目录服务器软件可以填充的两个属性是vendorname
和vendorversion
。您可以在您正在使用的服务器返回的根DSE中检查这些是否存在。
这是一个粗略的Java代码,用于从根DSE中提取这两个属性(使用LDAP提供程序,即):
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");
}
}
}