Четверг, 18 февраля 2021 19:00

Правим и удаляем записи в каталоге LDAP. Работа с LDAP в Qt5. Часть 7.

Россия
Оцените материал
(0 голосов)

Сегодня мы рассмотрим правку и удаление записей на сервере LDAP-каталога.

Мы будем использовать проект из предыдущей статьи.

Удаление записей

Для начала рассмотрим самое простое – удаление пользователя записей из каталога LDAP.

Для удаления записей в OpenLDAP существует функция:

ldap_delete_ext_s( ldap, baseDN, NULL, NULL );

Добавим новый метод в класс QLdap:

int QLdap::del(const QString &baseDN)
{
    char *baseDNp = _strdup(baseDN.toStdString().c_str());

    qDebug() << "Delete DN = " << baseDN;

    int result = ldap_delete_ext_s( this->ldp, baseDNp, NULL, NULL );

    free(baseDNp);

    qDebug() << "Deleted";

    return result;
}

В конструктор главной формы добавим:

    result = ldap->del("CN=Иванов И. И.,OU=Company,DC=altuninvv,DC=local");

    if ( result != LDAP_SUCCESS )
    {
        QString msg = QString("QLDAP del() error: ") + QString(ldap_err2string(result));
        qDebug("%s",msg.toLatin1().constData());
    }

Запустим:

GetMods
new dn =  "CN=Иванов И. И.,OU=Company,DC=altuninvv,DC=local"
Added
QLDAP add() error: Already exists
QLDAP del() error: Insufficient access
Close result =  Success

Как видите, у пользователя ldap-bind не хватает прав. Давайте это исправим.

Предоставление прав на удаление учетных записей

Внимание. Никогда не удаляйте учетные записи через LDAP это небезопасно!

Откроем свойства и вкладку Безопасность – Дополнительно.

Нажмите Добавить и выберите пользователя ldap-bind

Установите галочки напротив:

  • Удаление объектов: account (Delete account object)
  • Удаление объектов: InetOrgPerson (Delete InetOrgPerson object)
  • Удаление объектов: Пользователь (Delete User object)

Нажмите Ок, чтобы закрыть все окна.

Удаление

Запустим еще два раза. На второй раз результат у нас будет таким:

GetMods
new dn =  "CN=Иванов И. И.,OU=Company,DC=altuninvv,DC=local"
Added
Deleted
Close result =  Success

Это значит, что учетная запись успешно удаляется!

Модифицируем класс QLdapMod

Нам необходимо модифицировать класс, для того, чтобы обеспечить замену информации  в записи.

Перед тем, как изменять записи в мы должны настроить права доступа для пользователя ldap-bind.

Забегая вперед скажу – если вы просто попробуете запустить код правки для созданной нами записи, у вас всё получится без ошибок, почему?

Если мы откроем вкладку Дополнительно, раздела Безопасность, данной записи, то сможем увидеть, что владельцем является ldap-bind:

2021-02-18_09-33-44.png

Если мы создадим учетную запись вручную, с помощью административных инструментов windows, то получим ошибку:

QLDAP edit() error: Insufficient access

Нам нужно выставить дополнительные права для пользователя ldap-bind. Делается это таким же образом, как и для удаления, только на этот раз мы ставим галочки напротив:

  • Записать все свойства (Write all properties)

Модернизируем класс QLdapMod

Добавим приватное поле:

int opMode = LDAP_MOD_ADD;

Внесем изменение в конструктор QLdapMod::QLdapMod(QLdapEntry *entry)

Добавим аргумент:

QLdapMod::QLdapMod(QLdapEntry *entry, const int &opMod)

Добавим строку в конструктор класса QLdapMod:

this->opMode = opMod;

В методе LDAPMod **QLdapMod::getMods() изменим строку на:

mods[j]->mod_op = this->opMode;

Таким образом мы каждый раз задаем режим работы.

Модифицируем класс QLdap

Добавим новый метод для правки записей:

int QLdap::edit(const QString &baseDN, LDAPMod **mods)
{

    char *baseDNp = _strdup(baseDN.toStdString().c_str());

    qDebug() << "Edit DN = " << baseDN;

    int result = ldap_modify_ext_s( this->ldp, baseDNp, mods, NULL, NULL );

    free(baseDNp);

    qDebug() << "Edited";

    return result;
}

Добавим в конструктор главной формы код:

    QLdapEntry *user1 = new QLdapEntry();
    QLdapUser u1 = QLdapUser(user1);

    u1.setDisplayName("Россиянин Иван Иванович");
    u1.setOfficePhone("aaaaaa");


    QLdapMod *mod1 = new QLdapMod(user1, LDAP_MOD_REPLACE);
    LDAPMod **m1 = mod1->getMods();

    result = ldap->edit("cn=Иванов И. И.,OU=Company,DC=altuninvv,DC=local", m1);

    delete mod1;

    if ( result != LDAP_SUCCESS )
    {
        QString msg = QString("QLDAP edit() error: ") + QString(ldap_err2string(result));
        qDebug("%s",msg.toLatin1().constData());
        //return;
    }

Закомментируем строку

result = ldap->del("CN=Иванов И. И.,OU=Company,DC=altuninvv,DC=local");

Нам не нужно, чтобы только что созданный пользователь сразу удалялся.

Запустим:

GetMods
OP:  2
Edit DN =  "cn=Иванов И. И.,OU=Company,DC=altuninvv,DC=local"
Edited
Close result =  Success

Откроем пользователя в оснастке администрирования AD:

2021-02-18_12-40-20.png

Значение записи обновилось.

Заключение

Сегодня мы рассмотрели удаление и правку записей в каталоге LDAP.

Были созданы методы для удаления и правки записей в классе QLdap.

Был модернизирован класс QLdapMod – в конструктор класса добавлен аргумент задающий текущую операцию.

В следующей части мы рассмотрим добавление, правку и удаление OU в каталоге LDAP.

Скачать исходный код проекта вы можете с Github.

Прочитано 82 раз Последнее изменение Четверг, 18 февраля 2021 19:32