Java eclipse - 活动目录,属性修改#2

时间:2013-02-15 18:27:56

标签: java eclipse attributes active-directory

首先感谢Sotirios Delimanolis帮助我解决第一个问题(第一部分是访问活动目录)。

现在我的代码是:

        DirContext ctx = null;

        Hashtable<String, Object> env = new Hashtable<String, Object>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://"+serverAddress+":389");

        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, DOMAIN+username);
        env.put(Context.SECURITY_CREDENTIALS, password);

        try {


            // Create the initial context
            ctx = new InitialDirContext(env);

            Attributes matchAttrs = new BasicAttributes(true); // ignore attribute name case
            matchAttrs.put(new BasicAttribute("mail", "XXXXXX@XXXX.com"));
            matchAttrs.put(new BasicAttribute("cn"));

            // Search for objects that have those matching attributes
            NamingEnumeration<SearchResult> answer = ctx.search("ou=People", matchAttrs);

            while (answer.hasMore()) {
                SearchResult sr = (SearchResult)answer.next();
                System.out.println(">>>" + sr.getName());
            }

我有错误: Failed to bind to LDAP / get account information: javax.naming.NamingException: [LDAP: error code 1 - 000020D6: SvcErr: DSID-03100754, problem 5012 (DIR_ERROR), data 0 ; remaining name 'ou=People'

我在http://docs.oracle.com/javase/jndi/tutorial/basics/directory/basicsearch.html中找到了此代码(后面的内容):

// Specify the attributes to match
// Ask for objects that has a surname ("sn") attribute with 
// the value "Geisel" and the "mail" attribute
Attributes matchAttrs = new BasicAttributes(true); // ignore attribute name case
matchAttrs.put(new BasicAttribute("sn", "Geisel"));
matchAttrs.put(new BasicAttribute("mail"));

// Search for objects that have those matching attributes
NamingEnumeration answer = ctx.search("ou=People", matchAttrs);
 You can then print the results as follows. 
while (answer.hasMore()) {
    SearchResult sr = (SearchResult)answer.next();
    System.out.println(">>>" + sr.getName());
    printAttrs(sr.getAttributes());
}

所以我想知道他是否定位上下文“ou = People”特定于每个活动目录,或者它对于“ou”和“People”始终相同:http://www.kouti.com/tables/userattributes.htm

非常感谢!

1 个答案:

答案 0 :(得分:1)

Active Directory是LDAP服务器。还有其他LDAP服务器(想到OpenLDAP)。它们中的每一个都有自己的或类似的对象类和属性,它们构成了您的目录模式。您可以在this Microsoft link下查看所有Active Directory对象类和属性。

在您的示例中snmailou是不同的属性名称,代表surnamemailorganizational unit , 分别。这些属性是名称 - 值对,因此ou=People表示具有值为organizational unit的{​​{1}}属性的对象。

您使用的搜索功能:

People

ctx.search("ou=People", matchAttrs) 的上下文中查找与您传递的属性匹配的属性。

参数ou=People并非特定于每个Active Directory。 ou=People只是他们决定使用的名称。我的目录使用People,另一个可能使用Users。但是,Accounts通常是用于唯一标识对象的属性。

我读过并且可以推荐的好资源是Building Java Enterprise Applications Volume I - Architecture。该链接包含pdf版本。它有一个关于如何使用LDAP来验证应用程序用户的部分,但解释了很多关于LDAP服务器条目的组织,我认为你会发现它很有用。