Добавление пользователя в AD LDS (ADAM) с Java и LDAP - PullRequest
1 голос
/ 16 марта 2012

EDIT4: Получил мое приложение для записи пользователя в активный каталог, но активный каталог жалуется, когда я пытаюсь включить пользователя

enter image description here


Предыдущие сообщения


Я пытаюсь добавить пользователя в мою локальную Active Directory (с AD LDS), используя Java (1.4) и LDAP.Тем не менее я получаю следующую ошибку:

javax.naming.directory.SchemaViolationException: [LDAP: код ошибки 65 - 0000207B: UpdErr: DSID-030511CF, проблема 6002 (OBJ_CLASS_VIOLATION), данные 0];оставшееся> имя 'CN = тестовый пользователь, OU = учетные записи, DC = PORTAL, DC = COMPANY, DC = BE'

Мой код:

public static void main(String[] args) {
        try {
            DirContext ctx = new InitialDirContext(X_Ldap.getEnvironment());
            user usr = new user("Test user", "FALSE");

            ctx.bind(
                    "CN=Test user,OU=Accounts,DC=PORTAL,DC=COMPANY,DC=BE",                      usr);

            // X_Ldap.checkIfUserExists("Test User");
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        }
}

public class user implements DirContext {
    String type;

    /**
     * 
     * @param isDisabled
     *            TRUE or FALSE (literally)
     */
    public user(String username, String isDisabled) {
        String type = username;

        Attributes attr = new BasicAttributes(true);
        Attribute oc = new BasicAttribute("objectclass");
        oc.add("top");
        oc.add("person");
        oc.add("organizationalPerson");
        oc.add("user");
        Attribute memberOf = new BasicAttribute("memberOf");
        memberOf.add("CN=Users,CN=Roles,DC=PORTAL,DC=COMPANY,DC=BE");

        attr.put(oc);
        attr.put("msDS-UserAccountDisabled", isDisabled);
        attr.put(memberOf);

        attr.put("comment", username);
    }

    public String toString() {
            return type;
    }
}

edit Я проверил один из моих пользовательских объектов на наличие обязательных атрибутов, но я не уверен, что я должен заполнить для всех них:

cn:Джейн Доу - строка Unicode
instanceType: 0x4 = (WRITE) - целое число
objectCategory: CN = персона, CN = схема, CN = конфигурация, CN = {EDBEACA1-6F60-413C-80F2-6C5CE265F22F} -- Отличительное имя
objectClass: top;человек;organizationalPerson;пользователь - Идентификатор объекта
objectSid: S-1-372665300-2234744891-519896106-1336725265-1748609191-3385095770 - SID


РЕДАКТИРОВАТЬ 2: Мой текущий код:

public class newuser {
    public static void main(String[] args) {

        String userName = "cn=Albert Einstein,ou=Accounts,DC=PORTAL,DC=COMPANY,DC=BE";
        // String groupName =
        // "cn=Users,cn=Roles,DC=PORTAL,DC=COMPANY,DC=BE";

        try {

            // Create the initial directory context
            System.out.println("Creating initial directory context...");
            LdapContext ctx = new InitialLdapContext(X_Ldap.getEnvironment(),
                    null);

            // Create attributes to be associated with the new user
            Attributes attrs = new BasicAttributes(true);

            // some useful constants from lmaccess.h
            int UF_ACCOUNTDISABLE = 0x0002;
            int UF_PASSWD_NOTREQD = 0x0020;
            int UF_PASSWD_CANT_CHANGE = 0x0040;
            int UF_NORMAL_ACCOUNT = 0x0200;
            int UF_DONT_EXPIRE_PASSWD = 0x10000;
            int UF_PASSWORD_EXPIRED = 0x800000;


            attrs.put("objectClass", "user");
            attrs.put("cn", "Albert Einstein");

            // These are some optional (but useful) attributes
            attrs.put("givenName", "Albert");
            attrs.put("sn", "Einstein");
            attrs.put("displayName", "Albert Einstein");
            attrs.put("description", "Research Scientist");
            attrs.put("userPrincipalName", "AlbertE@antipodes.com");
            attrs.put("mail", "relativity@antipodes.com");
            attrs.put("telephoneNumber", "999 123 4567");
            String newQuotedPassword = "\"Pass123\"";
            byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
            attrs.put("unicodePwd", newUnicodePassword);
            attrs.put("msDS-User-Account-Control-Computed",
            Integer.toString(UF_NORMAL_ACCOUNT + UF_DONT_EXPIRE_PASSWD));

            // Create the context
            System.out.println("Creating context...");
            Context result = ctx.createSubcontext(userName, attrs);
            System.out.println("Created disabled account for: " + userName);

            ctx.close();

            System.out.println("Successfully created User: " + userName);

        } catch (NamingException e) {
            System.err.println("Problem creating object: " + e);
        }

        catch (IOException e) {
            System.err.println("Problem creating object: " + e);
        }


    }
}

По-прежнему возникает следующая проблема:

String newQuotedPassword = "\"Pass123\"";
        byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
        attrs.put("unicodePwd", newUnicodePassword);

дает мне следующее исключение:

Создание начального контекста каталога ... Проблема создания объекта: java.io.UnsupportedEncodingException: UTF16LE

примечание: я отключил требование SSL для смены пароля

РЕДАКТИРОВАТЬ 3: очевидно, «Контроль учетной записи пользователя»"не поддерживается AD LDS и разделен на ряд различных атрибутов.

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

Возможно, вы можете взглянуть на Использование кода JAVA с Active Directory особенно Создание новых пользователей и демистификация userAccountControl

Для меня вы забыли "CN"атрибут.

1 голос
/ 19 марта 2012

Вот некоторые ноу-хау, которые я узнал при разработке приложения для управления учетными записями пользователей (ASP .NET) для Active Directory 2008:

  1. Вы должны заполнить sAMAccountName или userPrincipalName

  2. Учетная запись остается отключенной, пока вы не установите для нее пароль в соответствии с политиками паролей домена

  3. Любые операции, связанные с паролем, необходимо выполнять с использованием безопасного соединения

  4. При создании учетной записи откройте контекст OU, если вы хотите создать объект пользователя. Затем вызовите метод для его добавления

Прочитайте этот документ: http://msdn.microsoft.com/en-us/magazine/cc135979.aspx

(я знаю, для .NET, но очень ли он похож на Java LDAP API)

Надеюсь, это поможет вам

1 голос
/ 16 марта 2012

Проверьте документацию схемы, какие атрибуты разрешены и необходимы для классов объектов person, user и organizationalPerson. Убедитесь, что запись, которую пытается добавить код, содержит все обязательные атрибуты и только разрешенные или обязательные атрибуты.

0 голосов
/ 16 марта 2012

Нарушение схемы класса объекта означает, что в объекте, который вы пытаетесь создать, отсутствует один или несколько обязательных атрибутов.Поэтому вам нужно взглянуть на схемы для top, person, organizPerson и user и убедиться, что вы устанавливаете все необходимые атрибуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...