0
僅使用javax.naming API,是否有一些元數據或其他技巧可用於確定實際上是否連接到Active Directory服務器或其他類型的目錄服務器?使用javax.naming,我可以確定我是否連接到AD或其他類型的服務器?
僅使用javax.naming API,是否有一些元數據或其他技巧可用於確定實際上是否連接到Active Directory服務器或其他類型的目錄服務器?使用javax.naming,我可以確定我是否連接到AD或其他類型的服務器?
根DSE可能包含的屬性包含有關目錄服務器軟件的信息。但是,根DSE和/或屬性可能不存在,或者屬性在所有目錄服務器實現中可能不會被命名爲相同。不過,您可以查詢DSE並查看它爲您的應用將支持的目錄軟件提供的內容。以下是LDAP搜索以獲取根DSE:
ldapsearch -h HOST -b " " -s base objectclass=*
這假設DSE與對象類相關聯。供應商可能有提供相同的專有方法。
有這個信息RFC 3045;它討論了在根DSE中存儲與供應商相關的信息。可能由目錄服務器軟件填充的兩個屬性是「verndorname」和「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");
}
}
}