Правим и удаляем записи в каталоге LDAP. Работа с LDAP в Qt. Часть 6
Сегодня мы рассмотрим правку и удаление записей на сервере 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:
Если мы создадим учетную запись вручную, с помощью административных инструментов 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:
Значение записи обновилось.
Заключение
Сегодня мы рассмотрели удаление и правку записей в каталоге LDAP.
Были созданы методы для удаления и правки записей в классе QLdap.
Был модернизирован класс QLdapMod – в конструктор класса добавлен аргумент задающий текущую операцию.
В следующей части мы рассмотрим добавление, правку и удаление OU в каталоге LDAP.
Скачать исходный код проекта вы можете с GitFlic
Добавить комментарий