Zimbra+LDAP

 Приветствую всех обладателей Zimbra.

Недавно познакомился с этим продуктом. В итоге приняли решение его внедрять. Внедрение, разбор полетов, настройка, запуск перезапуск все легло на меня. Я довольно много шерстил по инету пока знакомился сZimbra, неплохой хелп, даже отличный на ZimbraWiki.
Но вот работающего скрипта синхронизации ZIMBRA + LDAP так и не нашел. Пришлось изобретать свой собственный велосипед. Путь написания был довольно долгим и муторным, но думаю что скрипт пригодится не только мне, но и послужит в дальнейшем кому-нибудь основой для его целей. Думаю что мне будет приятно вложить свои 5 копеечек во всемирную копилку.

Я постараюсь как можно подробней описать и рассказать как работает скрипт.


Задача.

В организации МЕГО_ДОМЕН.ру поднят и успешно функционирует АД. Заносятся новые пользователи. Жили не тужили. Но вдруг возникла необходимость переехать на свой email и мало того чтобы переехать, необходимо его привязать к АД и не только привязать но чтобы и старых пользователей не обидеть. А условия такие:

1.       Переезд с одного сервера на другой должен пройти совершенно не заметно.
2.       При блокировки пользователя в АД блокируется его почта
3.       При создании пользователя и почты в АД, автоматически создается пользователь в Zimbra
4.       Логин(АД)=почте(Zimbra)(по крайне мере чтобы можно было зайти на почту(zimbra) по email(АД)
          но с паролем(АД) , пароль(АД)=пароль(Zimbra)
5.       При удалении почты из АД, автоматически удаляется почта из Zimbra.

И как было это все осуществить, не было не одной мысли и идеи. Но кто копает и делат тот всегда откопает и сделает. Решение проблемы находилось постепенно и поэтапно я лишь теперь передам его суть.         
   Суть заключается в том что Zimbra работает (как мне объеснили знающие люди) почти как и Exchange. Вот только одна проблемка и там и тут логин пользователя и email должны совпадать. Что я только не делал. В общем долго ли коротко ли но был выработан алгоритм. Выяснилось, что если на Zimbra создать пользователя (любого например test) завести в АД такого же пользователя с таким же логином, на Zimbra поднять проверку подлинности (что необходимо для выполнения условий 2-4) и создавая в Zimbra для пользователя test alias test2. То можно войти на почту zimbra используя либо логин test либо его alias test2 с паролем от пользователя test в АД.
   Тут немного поясню, когда на Zimbra настроена проверка подлинности, создан ящик test@test.ru а на него навешано куча alias test1@test.ru test2@test.ru и тд. и тп. То не зависимо под каким из test вы зайдете главное чтобы основная почта на Zimbra была = логину в АД. Это и есть ключ к решению и одновременно камнем преткновения и началом головных болей.


И так скрипт.
*внимание в моем случаи МЕГО_ПОЧТА.ру и МЕГО_ДОМЕН.ру это одно и тоже.

-------------------------------------------------------------

#!/bin/bash

Domain="МЕГО_ДОМЕН.ру" # ДНС имя или IP адресс вашего Актив Директори
ADDOMAIN="ПОЧТА_ДОМЕН.ру" # имя домена которое у вас будет на почте напримертруляля@ПОЧТА_ДОМЕН.ру

LDAPSEARCH=/opt/zimbra/bin/ldapsearch # ну тут вроде бы понятно
ZMPROV=/opt/zimbra/bin/zmprov # тут вроде тоже все ясненько
DOMAIN_NAME="ПОЧТА_ДОМЕН.ру" # канечно не обезательно, но если у вас на зебре несколько доменов то тогда пригодится а так не обезательно. 
TIMESTAMP=`date +%N` # красатульная и бестолковая приблудина :)
TMP_DIR=/tmp

########################### всякие файлы где будет идти обработка
ADM_TMP=$TMP_DIR/ads_mail.lst 
ADS_TMP=$TMP_DIR/users_ads.lst
SORT_TMP=$TMP_DIR/sort.lst
ZCS_TMP=$TMP_DIR/users_zcs.lst
DIF_TMP=$TMP_DIR/users_dif.lst
SED_TMP=$TMP_DIR/SED.lst
######################################

# Переменные номбер 2
LDAP_SERVER="ldap://МЕГО_ДОМЕН.ру" # сопсно вроде и так ясно
BASEDN="dc=МЕГО_ДОМЕН,dc=ru" # пишем по слогам
BINDDN="CN=ЗЕБРА,CN=users,DC=МЕГО_ДОМЕН,DC=ру" # вот тут указывается аккаунт для синхронизации с АД, сопсно для начало его нужно в АД создать.
BINDPW="УСИПУСИ" #это сопсно пароль к акаунту ЗЕБРА
FILTER="(mail=*)" # всякие переменные
FIELDS="mail" #-------------/-/--------------

# Сначала выгружаем почту с АД мы же не хотим вносить всех пользователей. А вносим только тех у кого есть мыло
echo -n "Выгружение почты с AD... "
$LDAPSEARCH -x -H $LDAP_SERVER -b $BASEDN -D "$BINDDN" -w $BINDPW "$FILTER" $FIELDS | \
grep "@$DOMAIN_NAME" | \
awk '{print $2}' | \
sort > $ADM_TMP
echo "Found `cat $ADM_TMP | wc -l` users ($ADM_TMP)"

# Следующий шаг мы ищем в АД почту (которую мы уже выгрузили) и запоминаем её sAMAccountName (логин)
echo -n "POISK: "
cat $ADM_TMP | wc -l
for x in $(cat $ADM_TMP | sed s/^+//g);
do
echo -n " $x ";

#тут я решил показать подробно как все устроено
sv=`ldapsearch -x -h МЕГО_ДОМЕН.ру -b dc=МЕГО_ДОМЕН,dc=ру -D "cn=ЗЕБРА,cn=users,dc=МЕГО_ДОМЕН,dc=ру" -w "УСИПУСИ" -LLL "(mail=$x)" sAMaccountName | grep sAMAccountName `
un=`echo -n $sv | grep -w sAMAccountName: | awk '{split ($0, a, "sAMAccountName: "); print a[2]}' | awk '{print $1}'`
 # таким образом получаем чистый логин
un1=`echo -n $un@$DOMAIN_NAME` # сопсно к логину добавляем @ПОЧТА_ДОМЕН.ру 

# все это дело записываем в фаил
RES=$?
if [ "$RES" == "0" ]; then echo -n $un1 | sort >> $ADS_TMP ; else echo "[Err]"; fi 
done
sort $ADS_TMP > $SORT_TMP
 
# А теперь мы этот фаил сортируем по алфовиту. Это очень важно.


# Теперь выгружаем всех пользователей (аккаунты) с zimbra это нужно для составления файла, чтобы добавлять или удалять новых или старых пользователей.
$ZMPROV -l gaa $DOMAIN_NAME | sort > $ZCS_TMP
echo "Found `cat $ZCS_TMP | wc -l` users ($ZCS_TMP)"

# Теперь у нас есть 2 файла 1 с АД другой с зимброй. Сравниваем их если есть почта в Зибмре но её нет в АД ставим -. 
#Если наоборот ставим + если не то не другое ничего не ставим :)
echo "Generating diff file ($DIF_TMP)"
diff -u $ZCS_TMP $SORT_TMP | grep "$DOMAIN_NAME" > $DIF_TMP
# и канечно результат записываем в другой фаил

#####################################################
И так первый этап мы прошли у нас есть фаил в котором есть логин из АД, которые будет являться основной почтой (аккаунтом) в зимбре по которому будет проходит
проверка подлинности (это так в зимбре называется)
следующим шагом у нас идет занесение ALIAS для опредленных пользователей. Так как в АД нет таких записей как логин@ПОЧТА_ДОМЕН.ру
у меня например ПОЧТА_ДОМЕН.ру и МЕГО_ДОМЕН.ру одинаковые. Но в любовм случаи нам нужно в файле $DIF_TMP убрать @ПОЧТА_ДОМЕН.ру
 потому как мы будем производить поиск по логинам из АД, для выгрузки поля email ( в зимбре это будет наш alias для этих пользователей) 
######################################################

sed '/@ПОЧТА_ДОМЕН.ру/s/@ПОЧТА_ДОМЕН.ру//g' $DIF_TMP > $SED_TMP # результат записываем в фаил.

# Теперь шерстим этот фаил. Если напротив логина стоит + мы ищем поле email для этого логина в АД и заносим его в Зимбру а найденый email как ALIAS для этого логина 

echo -n "New USER: "
cat $SED_TMP | grep ^+ | wc -l
for i in $(cat $SED_TMP | grep ^+ | sed s/^+//g);
do
echo -n " - Adding $i ";
searchValues1=`ldapsearch -x -h $Domain -b $BASEDN -D $BINDDN -w $BINDPW -LLL "(sAMAccountName=$i)" mail`
Username=`echo $searchValues1 | grep -w mail: | awk '{split ($0, a, "mail:"); print a[2]}' | awk '{print $1}'`

printf "Creating User $Username \n"; # эту строку можно закоментить просто она удобна при отладки
$ZMPROV ca $i"@ПОЧТА_ДОМЕН.ру" passwd > /dev/null; # создаем основной аккаунт на зимбре но без пароля, так как у нас будет настроена в зимбре проверка подлинности
$ZMPROV aaa $i"@ПОЧТА_ДОМЕН.ру" $Username; # вносим ALIAS для этого аккаунта
RES=$?
if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
done

# Эта часть отвечает за удаление пользователей из зимбры. То есть есть ли есть пользователь в зимбре но его нет в АД то из зимбры он удаляется
# В данный момент у меня пока идет прибавление пользователей.
#echo -n "Old users: "
#cat $DIF_TMP | grep ^- | wc -l
#for i in $(cat $DIF_TMP | grep ^- | sed s/^-//g);
#do
#echo -n " - Deleting $i ";
#$ZMPROV deleteAccount $i > /dev/null;
#RES=$?
#if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
#done

# удаление файлов обработки удобно их просматривать при дебаге.
#rm -f $ADM_TMP 
#rm -f $ADS_TMP
#rm -f $SORT_TMP
#rm -f $ZCS_TMP
#rm -f $DIF_TMP
#rm -f $SED_TMP
-----------------------------------------------------------------------------------

Теперь для закрепления полученного материала разберем его по полочкам на примере.

Допустим у меня в АД есть:
Пользователь Вася Пупкин Медведевич
Его логин (sAMAccountName) vasiazubr
Пароль на его логин 3.14zdec
и также у него есть почта vasiok@МЕГО_ДОМЕН.ру

Как видно из исходных данных его логин и его почта разные.
После того как мы прогоним скрипт сделается следующее.

В zimbre появиться: 
пользователь vasiazubr@ПОЧТА_ДОМЕН.ру
у него будет alias vasiok@ПОЧТА_ДОМЕН.ру (в данном случаи я подставляю переменные но у нас ПОЧТА_ДОМЕН и МЕГО_ДОМЕН это одно и тоже)
и пароль для входа в zimbra у него будет 3.14zdec (так как мы настроем проверку подлинности)
 

Вывод.

Данный пользователь может зайти в zimbr-у как под vasiazubr так и под vasiok пароль будет один и тот же. Он попадает в основную почту vasiazubr@ПОЧТА_ДОМЕН.ру
НО! чтобы он отправлял свою почту от vasiok@ПОЧТА_ДОМЕН.ру придется ручками поправить в настройках его адрес с которого буду уходить письма. И тогда все будет четко.

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

Я тут решил добавить кое что.

Это скрипт тот что выше. Но уже с проверкой на пинг и на наличие пользователя. Думаю так будет проще для усвоения материала :)

!!!!!!!!!!!!!!!!!!!! ВНИМАНИЕ !!!!!!!!!!!!!!!!!!!!!

Скачав фаил просто удалите его разширение. .txt на конце просто оставте .sh

Замените переменные на свои и готово.

Скрипт боевой.

docs.google.com/file/d/0B--g3UL9ysp5M2tZUWliTlRLRkU/edit

4825
Прикрепленные файлыРазмер
skript.sh_.txt4.39 кб

Комментарии

Спасибо автору, очень помог. Вот бы еще имя,фамилия пользователя из АД переносились, цены б не было ;)

Какие-то у меня сомнения есть в том, что это способно помочь, потому что авторизация пользователей Zimbra в AD есть "из коробки".

 Авторизация есть, создания почтовых ящиков для пользователей АД нету...

Сорри, понял, что статья немного не о том... Вообще можно попробовать это сделать с OpenLDAP+backend meta+overlay translucent - тогда ещё проще будет. Но заниматься этим не хочется, поскольку не вижу необходимости никакой: если бы речь шла об автоматческой авторизации пользователей домена по керберос-тикету, в этом ещё был бы какой-то смысл, а так я не очень понимаю, в чём проблема завести всех, кого нужно, в Зимбра руками.

 Руками 200 пользователей? Потом в ручную добалять/удалять? Как-то неохота :) 

Ну на самом деле вносить Имя фамилию это не проблема. Добавить буквально несколько строг в конфиг. А именно в то место где мы создаем полльзователя и alias

echo -n "New USER: "
cat $SED_TMP | grep ^+ | wc -l
for i in $(cat $SED_TMP | grep ^+ | sed s/^+//g);
do
echo -n " - Adding $i ";
searchValues1=`ldapsearch -x -h $Domain -b $BASEDN -D $BINDDN -w $BINDPW -LLL "(sAMAccountName=$i)" mail`

# вот тут мы будем искать имя фамилию (точнее поле в котором это будет писаться думаю что будет как-то так)

#searchValues2=`ldapsearch -x -h $Domain -b $BASEDN -D $BINDDN -w $BINDPW -LLL "(sAMAccountName=$i)" mail` # только вместо поле которое мы будем искать надо поставить не mail  а например поле name
ну и потом каким-то способом с помощью zmprov подставим переменную как на примере ниже.
Username=`echo $searchValues1 | grep -w mail: | awk '{split ($0, a, "mail:"); print a[2]}' | awk '{print $1}'`
-------------------------------------------------------------
.............
-------------------------------------------------------------
$ZMPROV aaa $i"@ПОЧТА_ДОМЕН.ру" $Username; # вносим ALIAS для этого аккаунта
RES=$?
if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
done

В моем случаи это не нужно было. Так как пользователи юзают почтовызх клиентов мелкомягких (такая политика компании) а уже там к ней прекручена адресная книга LDAP (из АД).

Насчет автоматизации я пока не особо парюсь потому как появилась проблема, Zimbra отваливается через несколько часов. После последней клизмы она работает стабильно уже больше суток. Решение и выводы пока не публикую, потому как идет опкатка. Так небольшие наработки и вопросы все в форуме постю. Как разберусь обезательно запишу в блог.

Я рад что кому-то скрипт помог. И буду рад ещё больше если кто предложит альтернативу более компактную и функциональную. Всегда интересно.

Желаю удачного дня.

 Спасибо. То что нужно. Тестил вариант на перле, работал нормально в 6 версии, в 7 русские символы в ФИО отображаться вЗимбре стали некорректно, разобраться сложно, не силен в этом. Если надо могу код выложить.

 Тоже пробовал этот скрипт, ничего не получилось.

Зато нашел элегантное решение импортировать учетные записи АД средствами zimbra (ZCS 7, Ubuntu 10.04 x64).

В консоли управления Сервис-Перенос учетной записи есть мастер переноса, который без проблем помогает перенести учетные записи из Active Directory в Zimbra. Причем переносит без дублирования записей, которые успел уже вручную занести. Удивляюсь, почему этот способ не описан. Искал долго. 

 +Спасибо, если бы не ваш комментарий, то я скорее всего тоже стал бы пользовать скрипт, а я в Линухах ваще впервые (автору статьи тоже огромное спасибо).

И я так же удивлен, почему не описана процедура переноса пользователей с помощью встроенного мастера... там так же через LDAP можно задать различные фильтры.

PS
Zimbra Collaboration Suite 8.0.7 Open source edition.
Всё до безумия просто. Когда я писал этот пост и делал свой скрипт этой процедуры просто небыло как таковой :D
Точнее она была но она была вроде как связана с  эксчанджейм. Помоему... Но скрипт в первую очередь создавался не для переноса писем. А для автоматического создания пользователей. В зимбре. Просто слишком долго мне своим ребятам говорить что да как создавать какие нюансы. А так написал скрипт. Ребята в ад вбили пользователя. И он появился через 10 минут в зимбре. А за это время они уже и комп поднастроили. И осталось только почту настроить на пользовательском компе. И мне меньше головной боли. А уже если что там совсем беда с почтой то званят мне. А на момент внедрения зимбры вбивать 500 человеков руками ну его нафиг.
Изначально цель была такая.
И то я считаю этот скрипт огромнейшим костылищем. И описывал его именно под свой случай. Я не настаиваю на том чтобы использовался только он. Мне он пригодился только 2 раза :) Но зато как это удобно знать что тут лежит заметочка и можно оп и посмотреть почитать и скопировать. Изначально я скрипты на основе которых делал свой увидел на англ форуме зимбры :).
Ка-а-ароче. Я вам кстатит буду благодарен если вы напишете мануальчик по переносу, который можно осуществить уже средствами самой зимбра. Ну а также если есть автоматическая привязка её к ад. Чтобы и там и там всё было огонь. Будет вам огромное спасибо.
К сожалению написание статей от меня сейчас очень сильно затруднено. Я просто физически не успеваю слишком много дел. Да кстати я тут потихонечку готовлю мануальчики по IP телефонии на основе Elastix так что я думаю должны в скором времени появится статейки по нему от меня.
P.S. спс за отзывы. Я рад что пусть и не пригодилася скрипт зато благодоря ему человек оставил комент и этот комент комуто помог. Этож Здорово.
 Здравствуйте.

По поводу мануала... а давайте попробуем.
И раз уж те, у кого возникает вопрос об импорте пользователей из AD в каталог Zimbra, скорее всего попадут на этот форум, то свои шаги я размещу здесь.

Задача:
Имеется домен AD CompanyGroup.local, деление по фирмам осуществляется посредством OU. По требованиям бизнеса, каждая фирма, входящая в состав группы компаний, должна обладать своим собственным почтовым доменом, например firm1.ru, firm2.ru, firm3.ru etc.

Решение:
Регистрируем почтовый домен для каждой фирмы, создаем эти домены в Zimbra, настраиваем проверку подлинности как "Внешний Active Directory" (в терминалогии Zimbra).
В AD, прописываем каждому пользователю атрибут -EmailAddress, в зависимости от его принадлежности к OU.

Я делал это посредством PowerShell:

Get-ADUser -SearchBase 'ou=Пользователи Фирмы 1,ou=ООО Фирма 1,dc=companygroup,dc=local' -Filter * |
ForEach-Object {Set-ADUser -identity $_ -EmailAddress ("{0}@{1}" -f $_.sAMAccountName, "firm1.ru") -Company "ООО Фирма 1" }

NB: Если у вас в AD заполнены поля почтового адреса для сотрудника, то данные команды их заменят новыми значениями: sAMAccountName@firmN.ru.

Собственно на этом, подготовка к импорту закончена.

Импорт:
Через консоль администрирования, заходим последовательно в пункты Средства и миграция/Перенос учетной записи/Мастер переноса


Запускается Мастер Переноса.

На 1-й странице мастера (Введение) устанавливаем значение полей следующим образом:
  • Тип почтового сервера: Общий сервер IMAP
  • Импортировать учетные записи?: Да
  • Импортировать почту?: Нет.
На 2-й странице мастера (Обзор) выбираем "Импортировать из каталога LDAP"
На 3-й странице мастера (Параметры массового создания) я выбрал использование одного и того же пароля для всех создаваемых пользователей. Но на самом деле, этот параметр нам не важен, т.к. настроена аутентификация через AD.
На этой же странице, поля "узел SMTP" и "порт SMTP" оставляем пустыми.

На 4-й странице (Подключение каталога)




Убираем галочку с поля "Автоматически создавать отсутствующие домены", указываем URL LDAP, DN привязки, пароль привязки.
Так как мы не собираемся импортировать отключенные учетные записи (в т.ч. и шаблоны учетных записей), то строка фильтра LDAP принимет следующий вид:

(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

Более подробно, про использование фильтров AD описано на TechNet'е, статья Active Directory:Использование LDAP-фильтров. (ссылку приводить не стал, т.к. правила форума читал по диагонали ;) ). 

В поисковой базе LDAP указываем базу поиска. В моем случае, я выгружал пользователей поэтапно, отдельно по каждой фирме, соответственно для 1-й фирмы: ou=Пользователи Фирмы 1, ou=Фирма 1,dc=companygroup,dc=local

Ну вот собственно и все.
Жмем далее, готово. При этом имеется возможность сохранить список импортированных (и не импортированных) пользователей в формате csv.

Желаю успехов, и буду рад, если кому-нибудь сие пригодится.

PS
DruGoeDeLo, my respest and best regards!
Клева. Я люблю смотреть готовое и работающее. Чувствую надо потихонечку как-нибудь переходить с 6 версии зимбра. На более свеженькую. Я тут смотрел в пожеланих пользователей в будущии версии зимбра. И не нашел синхронизации с ад. Я думаю если она появится то будет вобще крутяк. И всякие рода костыли типа скриптов канут в лету. И будем своим внукам рассказывать. А вот в МОЁ времня... чото ржу.

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

В итоге получилось, что один и тот же пользователь хранится в двух LDAP-каталогах, причём не находящихся в состоянии синхронизации друг с другом. Фактически это два разных объекта, два разных пользователя.

А самый главный мега-косяк вообще всей этой конструкции - в том, что люди вообще непонятно для чего ставили Zimbr'у: получается, первичным источником информации об объекте "Сотрудник" является Active Directory. Но при этом предполагается, что средством коллективной работы является Zimbra, которая AD использовать именно как хранилище настроек - не умеет.

В итоге мы в общем случае получили дублирование данных об одних и тех же объектах IT-инфраструктуры, что можно было бы частично компенсировать только написанием полноценного инструмента синхронизации между AD и OpenLDAP, что не только сложное, но и неблагодарное занятие: ведь всё равно часть настроек будет только в учётке Zimbra, потому что соотв. атрибутов в AD просто нет!

И здесь принципиально правильных выходов только два:

1) Отказаться от AD и построить инфраструтуру Windows-домена на Samba 3+Zimbra (по этому поводу здесь была замечательная статья)

2) Не использовать Zimbra, а пользоваться либо специализированным ПО, ориентированным на работу с AD (да-да, это MS Exchange), либо неспециализированным, но всё же худо-бедно работать с  AD умеющим - eGroupWare, например.

Вообще же если вы строите инфраструктуру на OpenSource, делайте это. Если вы подсели на иглу Microsoft - седите на ней и дальше. Полумеры и костылеподобные решения аля "заплаты от Васи Пупкина" - это инфантилизм на грани маразма.

Интересные отзывы. А не чо что например АД до моего прихода уже было купленно настроено и функионировало уже наверное как лет 5. Да да именно АД необоходим как воздух. Ну а если не понравилось то ну чтоуж теперь. Ну и 7 версия зимбры мне не понравилась. Сыровата она. А так меня вполне удовлитворило. Кароче не понравилось ну что уж тут теперь предложите свою идею.

Товарищи, лучше помогите настроить GAL в 7-ой версии....  Уже все перепробывал, не могу натравить  на Ad(2003).

Тест проходит, но контакты не отображает

такая же проблема с GAL в 7 версии. Никто случаем не нашел ответ на вопрос?

В общем кому интересно, проблему решил. Весь затык был в том, что по умолчанию фильтр для AD в зимбре настроен на работу и поиск почты по атрибуту mailNickname (который используется например в Exchange). А в AD2003 по умолчанию для этих целей используется атрибут mail.(посмотреть можно через оснастку ад - свойства - редактор атрибутов) Соответственно необходимо изменить злосчастный фильтр.
Все команды выполняем из под пользователя zimbra:
1.zmprov gcf zimbraGalLdapFilterDef >> /tmp/someconfigfile
2.меняем значение mailNickname внутри файла на mail
3.подсовываем его обратно используя zmprov mcf zimbraGalLdapFilterDef < /tmp/someconfigfile. или так как описано здесь.
4. заходим в консоль управления по вебке и проверяем в настройке gal находит ли определенный майл или нет.

команда

 zmprov mcf zimbraGalLdapFilterDef < /tmp/someconfigfile

не срабатывает

Собственно решил не портить саму статью.

И дописать в коментах. Скрипт на данный момент прикручен в кроне на исполнение каждый 10 минут. В моем случаи (проведя нехитрые подсчеты) это наилучшая зона комфорта. Есть только 1 нюанс это то что когды вы будете скрипт загонять в crontab не забудьте указать полные пути до исполняемы команд.

Например команда ldapsearch

в скрипте она выгядет вот так

sv=`ldapsearch -x -h МЕГО_ДОМЕН.ру -b dc=МЕГО_ДОМЕН,dc=ру -D..........

а для запуска в crontab и чтобы все работало нужно сделать так.

sv=`/opt/zimbra/bin/ldapsearch -x -h МЕГО_ДОМЕН.ру -b dc=МЕГО_ДОМЕН,dc=ру -D.......

После небольших исправлений скрипт заработал как часы.

Единственная проблема если падает все и АД тоже (например перебой с электричеством) то как назло zimbra поднимается быстрее AD и скрипт запускается тоже. Вот только если AD поднимется после ZImbra то скрипт похерет все почтовики. Поэтому советую прикрутить в скрипт проверку доступности AD (у самого пока руки не дошли, если сделаете раньше выложите скрипт буду очень благодарен)

 


 

При выполнении скрипта выдаюет такую вот ошибку
Выгружение почты с AD... ldap_bind: Invalid credentials (49)
        additional info: 80090308: LdapErr: DSID-0C090334,
у кого нибудь возникало данная ошибка?

что-то гдето с переменными не так.

или что-то гдето не от туда взяли.

В ообще можно отладить всё это дело ручками рописав команду запроса/поиска по АД и посмотреть что она выдаст (или запишет в фаил и исходя из этого уже смотреть что за ошибка)

1. разбейте скрипт на несколько частей

2. каждую часть прогоните по несколько раз дабы понять как всё устроенно.

3. скрипт рабочий :). и работает не только у меня а ещё у парочки моих знакомых и у человека  гдето в штатах.

Анализ Анализ и ещё раз Анализ. Вопервых какую ос вы используете. Во вторых какая версия у вашей зимбры. Ведь расположение програмок таких как ldapsearch может быть разное. Больше информации пожалуйста.

что нужно удалить в данном скрипте чтобы он не конектился к АД, а брал с фтп файлик csv и делал сравнение на основе находящихся в этом файлике данных.

тобишь в csv тупо

имя, почта

имя, почта
практически такая же аналогия что и у вас.

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

о_О

ну как же так. Вообщето скрипт сравнивает 2 файла. Если внимательн присмотреться к коду. приведите в вид фали который будете брать с фтп в вид который обробатывает скрипт и сравнивайте 2 файла кто вам мешает?

Вроде же все просто

А удалить надо часть, в которой скрипт оброщается к АД. Так как я везде писал коменты (почти каждой строчки), думаю найти эту часть большого труда не составит.

ZImbra 7, но уже разобрался проанализировав полностью скрипт, изменил под себя, сейчас просто тупо ищет логин и мыло в выгруженных с фтп файлах, сейчас пытаюсь сделать так чтобы заполнял поля ФИО выгруженные с АД. Потом выложу полностью реализованные схему может кому и пригодится. Еще вопрос как прописать необходимый пароль с которым будут создаваться все пользователи?

ну так как у меня стоит ад то у меня проверка подлиности проходит.

А так по идее можно ставить какой-то стандартный там. Командочка zmproov

$ZMPROV ca $i"@ПОЧТА_ДОМЕН.ру" passwd > /dev/null

кто мешает вместо /dev/null указать пароль?

ставил не прокатывает, появляется файлик под именем пароля, а то шифрованный пароль я так понял
только когда пытаюсь зайти по паролю не пускает

я тут правда чуть попутал с командой. Прости мой косяк вот тут http://wiki.zimbra.com/wiki/Zmprov

если посмотреть то выглядит это вот так

zmprov ca joe@domain.com test123 displayName JSmith

Я думаю это то что тебе надо.

P.S. а насчёт скрипта канечно выкладывай будет очень интересно его посмотреть. Так сказать жду с нетерпением.

Автору статьи больше спасибо.

Не могли бы вы еще подсказать - может ли зимбра работать со сторонним имап сервером?

У нас уже есть работающий почтовый imap сервер. Хотелось бы продолжать использовать его как основной сервер, а зимбру как необязательное дополнение. (когда то давно смотрел eGroupWare - воту  нее как раз есть подобная возможность).

На данный момент с imap сервером используем Roundcube, но он не так функционал.

 

 

Немного не понял вопроса. Zimbra умеет делать imap. Вас интересует миграция с другово почтовика? Или что-то ещё.

У меня вооброжение богатое вдруг понапридумываю ещё чего лищнего. Вы опишите проблему чуть подробнее например на форуме там умных очень много. Так что думаю решение для вас найдём довольно быстро.

P.S. а за спасибо, спасибо ;)

На форуме  описал подробнее чего хочется от зимбры

Добрый день!!!

Я чайник в линуксе  но zimbru поставил, мне она тоже очень понравилась вот теперь бы хотел реализовать по вашему методу привязку к АД, но я совершенно не силён в написании скриптов ищу информацию на эту тему...

Опишите пожалуйста хотябы в 2 словах, как вы создаёте ваш скрипт и куда помещаете и вообще как он запускается?

всё просто

если нету пароля для рута создаём проль для рута

sudo passwd root

 

Заходим под root

su

 

создаём фаил где угодно пусть будет домашняя директория например /home/zimbrauser и файлик назовём 11111111111.sh

touch /home/zimbrauser/11111111111.sh

далее устанавливаем ему chmod 755

и chown zimbra:zimbra

сто такое chmod и chown я не буду говорить это так сказать будет домашним заданием :)

а дальше всё просто.

Заходим под пользователем zimbra (этот пользовател уже существует, если канечно саму zimbru уже поставили)

su zimbra

 

Дальше заводим скрипт в crontab под пользователем zimbra

crontab -e

 

и в самом низу файла после слов

# ZIMBRAEND -- DO NOT EDIT ANYTHING BETWEEN THIS LINE AND ZIMBRASTART

Дописываем слудующее

#Zimbra+AD script start kazhdije 10 minut
*/10 * * * * /home/zimbrauser/11111111111.sh

Теперь каждый десять минут у тебя будет запускаться твой скрипт.

P.S. советую почитать что такое crontab, chmod, chown.

И не спешить всё делать внимательно. Очень подробно изучить и вникнуть в смысловую нагрузку скрипта. В общем не спешить и во всё вникать и стараться самому :).

Желаю удачи в трудовой деятельности.

спасибо большое я всё сделал уже только вот ошибка вываливается

помогите с ней разобраться? 

sudo ./ad.sh
Выгружение почты с AD... Found 1 users (/tmp/ads_mail.lst)
POISK: 1
 dimon@ad.ru ./ad.sh: строка 45: LDAPSEARH: команда не найдена
Found 0 users (/tmp/users_zcs.lst)
Generating diff file (/tmp/users_dif.lst)
New USER: 1
Old users: 0
 

 

строка 45: LDAPSEARH: команда не найдена

 

система ubuntu 10.4 64х zimbra 7

по вашему скрипту 45 строка это тут

sv=`ldapsearch -x -h ad.ru -b dc=ad,dc=ru -D "cn=zimbra,cn=users,dc=ad,dc=ru" -w "123456" -LLL "(mail=$x)" sAMaccountName | 

могу дать совет.

запусти отдельно прямо из консоли ldapsearch -x -h ad.ru -b dc=ad,dc=ru -D "cn=zimbra,cn=users,dc=ad,dc=ru" -w "123456" -LLL "(mail=$x)" sAMaccountName | sAMaccountName

вот только переменную $x замени скажем так на какую-нибудь почту заведомо известную и созданную у тебя в AD

Спасибо за совет? но вы уже описывали решение мой проблеммы выше где вы писали

 ldapsearch   поменять на полный  /opt/zimbra/bin/ldapsearch у меня так все решилось всё добавляется только ещё есть одна ошибка последний как бы вопрос:

 - Adding Dimon Creating User dimon@ad.ru
ERROR: account.ACCOUNT_EXISTS (email address already exists: dimon@ad.ru at DN: uid=dimon,ou=people,dc=ad,dc=ru)
[Err]
 

в принципе всё работает, но всё равно хотелосьбы безупречной работы скрипта ???

 

:)

я предвидел этот вопрос мой юный....

В прочем это не из этой оперы.

Всё на самом деле очень просто.

Это означает что у человека лоигн и почта одинаковые :)

То есть, пусть в ад есть логин vasia и есть почта у этого васи vasia@ad.ru

скрипт смотрит аха у этого пользователя есть почта:

шаг1

создать почту в зебре такую же как и его логин (необходимо для того, чтобы проходила проверка подлинности и пароль в ад и в зебре был одинаковый)

vasia@ad.ru

шаг2

создать почтовый ящик (а именно из AD взять почтовый адрес и перенсти его на зибру в алиас)

EROOR такой почтовый ящик уже существует.

 

Вот собственно и всё :) вот что означает это ошибка.

Если в ад логин пользователя и название почты у него разные например:

логин vasia

а почта

vasia123@ad.ru

то ошибки не выйдет :)

Точно!!! :) Спасибо за пояснение и терпение, а я бы и не подумал об этом, хорошую статью написали и ещё тут благодоря коментам много вопросов решается))). 

всегда всегда пожалуйста.

но если посмотрите ещё статьи то я дальше делаю проверки к серверу AD ведь если AD ляжет то вся почта просто тупо удалиться и так далее.

Прикрутиль к скрипту ещё 2 проверки. Но в итоге у нас зачудил сервак и что самое поганое он проходил 2 проверки

а вот время откликов на команды ldapsearch он отрабатывал через раз.

Ну собственно и почта удалилась через одного а потом и просто тупо вся. Вот такой вот был результат локальной сетевой атаки. Казалось бы :).  Посему скрипты пока снята с автоматики и вопрос отложен в дальний ящик пока найдётся свободное время. И советую много много раз подумать об установки его в crontab взвесить все за и против и ковсему к этому делать бек апы почтовых адресов и их содержимого вот вам скриптик к этому делу. Нарыл я идеи и ссылки на ossportal

 

#!/bin/bash
 
#Переменные
 
DOMAIN_NAME="agrisovgaz.ru"
TMP_DIR=/tmp
EmailBackup=$TMP_DIR/EmailBacup.list
DATE=`date +"%d.%m.%Y"`
BackUpDir=$TMP_DIR/ZimbraBackup
 
 
 
########## Тело программы ##########
 
/opt/zimbra/bin/zmprov -l gaa $DOMAIN_NAME | sort > $EmailBackup
 
mkdir $BackUpDir/$DATE
 
 for i in $(cat $EmailBackup);
  do
   /opt/zimbra/bin/zmmailbox -z -m $i getRestURL "//?fmt=tgz" > $BackUpDir/$DATE/$i.tgz
  done

Внимание фаил EmailBacup.list не удаляется автоматически нет командочки ремув в конце файла. Данный скриптик проходит опкатку у меня на серваке. И думаю над интерфейсом. И руки пока не дошли по причине ооочень большой занятости. В последнее время сам с ебя офигеваю. Нету времени даже мануалы по zabbix выложить хотя уже готовы. В общет то что я ответил это скорее ОФИГЕННОЕ стечение обстоятельств :).

А так рад что скрипт пригодился :) Желаю удачи.

P.S. хотя как выход синхронизацию на проверку почты можно делать позно ночью где-ниубдуь в час ночи, а пользователям говорить мол ребята!! Почта будет завтра работать :)

Вы знаете, я думаю лудше этим скриптом в ручную пользоваться, а то и в правду опасно  АД ляжет удялятся все!

я у себя за коментил crontab у меня не так много пользователей будет человек 200 думаю лудше ручками их по вношу если понадабится раскоментирую :) ну и ваши советы расмотрю по бэкапу и что нить сам поищу будут новости напишу!!!.

имхо :

1.лучше скриптом пользоваться один раз для импорта учеток и потом ручками создавать удалять

2.скрипт лучше писать не в кронтаб зимбры, а в кронтаб рута. мухи отдельно, котлеты отдельно.

на самом деле в какой crontab его занести ваще пофигу :)

просто скрипт работает под пользователем zimbra поэтому чтобы не потерять логическую цепочку я обычно делаю так :).

Но тут кому как удобно и у кого какие принципы.

А вот насчёт постоянства.

Я с тобой согласен. Нежелательно держать такие вещи в автоматике темболее уже лично у меня были приценденты когда скрипт сначало удалил всю почту, потом я сделал проверки, а потом из-за сетевой атаки он опять всё к чертям послал. Теперь я думаю над очередными проверками и пока никаких идей. После разбора полётов сетевой вирус был присечен. И виновники и подозрительные люди были заблочены. В общем лихо нас так пробороздило. Вот теперь думаю как бы и от этого обезопаситься. Есть одна мысли.

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

А в автомате он. Потому что меня не дергают по мелочам наши админы. Вроде и показал как удалять и добавлять. Но всёравно есть один кадр который даже если запишет побоиться делать. А заниматься этим каждый минут 10 или 5 у меня просто напросто нет на это времени и сил никаких не хватит. Я можно сказать упростил не им а себе жизнь.

А на автомате что не говори чертовски удобно щёлк забил и готово и больше никаких мыслей.

Так как сейчас мы расширяемся в услугах предоставления интернета в приоритетных задачах у меня стоит не почтовый сервер. Много чего каждый день допиливаем придумываем и внедряем на ходу. А ещё бывает косячат монтажники не так подключили не туда воткнули. А щас головная боль как подружить оборудование между собой да так чтобы ещё и антенки были бы видны на транковых канальчиках. В общем мама мия.... :( Так что когда руки дойдут до скрипта я даже и не знаю Но как дойдут тут же всё опишу и расскажу.

Кстати лишбы не сглазить. Думаю что на деньках будет свободное время в рамере пару часов и наконецто выложу мануалы по мониторингу. Тьфу тьфу тьфу (тра раза)

P.S. а всётаки чертовски приятно что кому то мой скрипт пригождается :). Всё я пошёл от компа пойдём с женой сходим на прогулку для бюлижайшего кофе. Настал долгожданый вечер отдыха. Всем Удачи!!!

доброго дня.

А подскажите как можно сделать выгрузку в Зимбру контактных данных, таких как номер телефона, организаци, адрес и т.п.? 

 Как я уже писал выше

..."запусти отдельно прямо из консоли ldapsearch -x -h ad.ru -b dc=ad,dc=ru -D "cn=zimbra,cn=users,dc=ad,dc=ru" -w "123456" -LLL "(mail=$x)" sAMaccountName | sAMaccountName"...

Я думаю достаточно просто добавить поиск по ещё одной переменной...  Дай бог памяти помоему это переменная называется "telephoneNumber". Но в любом случаи я думаю можно воспользоваться справочником по переменным команды ldapsearch 

http://linux.die.net/man/1/ldapsearch

Кстати наименование переменной я отгодал.

Желаю удачи.

 

P.S. Если хотите добавлять новую переменную то вам придётся не мало поправить год. Чтобы её туда впихнуть. Советую внимательно его изучить и окончательно разобраться именно что он делает и на время отладки скрипта внимательно посмотреть выводимые файлы.

 

 Исправте пожалуйста небольшой недочетег не "cn=zimbra,cn=users,dc=ad,dc=ru" а "cn=zimbra,OU=users,dc=ad,dc=ru"

 Это если правильно.

Но у меня работает так. В принципе я выкладываю скрипт который работает у меня. Скопировал прямо с сервера. Поэтому если вдруг не будет работать как у меня но работает как написал ты. Это гуд. Надпись не стирай вдруг кому пригодится.

 Я так понимаю основа взята отсюда? http://www.zimbra.com/forums/administrators/30856-active-directory-script-import-users-zimbra.html

Это перво источник.

Всё началось именно от туда :). Там и коменты мои есть. Но так как сайт англо язычный. А вот в на русском языке этого нема. Я решил облегчить жизнь людям и выложил это дело сюда. Как-то так

Мое почтение. У меня вопрос такой, каким образом можно перенести почту с Zimbra на Exchange 2010? Быстро, качественно, безболезненно) Спасибо!
Обычно народ заморачивался перенесением в обратную сторону при помощи встроенных функий самой zimbra в старших версия либо вот как я скриптом. Так что будеш первым кто так сделает. Будет здорово если опишешь для истории как это делать.
Уважаемы автор, большое спасибо за статью тем более что выяснилось что autoprovising  в зимбре так и не работает. Но вопрос немного по другому поводу. Как ты написал у тебя почтовый домен и домен АД один и тот же, тоесть насколько я понимаю либо у тебя почта только для внутреннего пользования либо ты пересылаешь почту через внешний релей? если так то не мог бы ты подробнее рассказать как ты это настраивал и что получил?
Всё просто. В зибмре можно создавать несколько доменов например обслуживаешь ты 3 организации и в ад у каждой свой домен например:
первый rus.ru
второй prikol.ru
третий jaja.ru
А тебе нужно чтобы каждый почтовый ящик был в своём. Но если у тебя только один домен. То везде можешь (подставлять) только его. У меня опльзователи крутятся на внутреннем серваке (серых IP ) а в инет я просто пробросил порты (точнее не я а мой коллега. Не пускает он меня к ISA серверу :D)
P.S. спасиб за отзыв не думал что столько лайков соберу со своей статьи.
VGusev2008 at yandex.ru стучись, если найдётся мне тут местечко на портале, скажите куда написать статью - я напишу. Работал с доменов в первый раз в жизни, всё сразу срослось без косяков и ошибок в логе.
Не порите чушь Господа, autoprov в zimbra ПРЕКРАСНО работает из коробки, скрутил по данному мануалу с ПЕРВОГО раза. Всё заводится, всё логинится, адресная книга работает.
 Уважаемый DrugoeDelo
отношусь к вашему скрипту как к дитю собственному, написал переписал, но похоже выход только один, окно.
root sudo ./111.sh не выдает никаких сообщений
назначил ему(111.sh) юзера на выполнение zimbra(дефаулт инсталл) из под рут
был вариант что такой пользователь не найден и он в тмп создавал файл с логом, сейчас вариант вообще не сработал, прошу о помощи что не так)))
ставил по инструкции http://qw1mb0.blogspot.ru/2013/07/zimbra-804-ubuntu-1204.html
ubuntu 12.04.04

zimbra 8.0.6
исходные данные
AD без сасля поэтому -h убрал
####
mx запись zimbra.example.ru
узел сделаны zimbra 192.168.5.20
####
хост с зимброй zimbra.example.ru(192.168.5.20)
host с доменом example.ru (192.168.5.11)
####
crontab -s 
*/5 * * * *  путь /111.sh
######
собсно сам текст скрипта
#!/bin/bash
#AD domain and Zimbra Domain(s)
Domain="example.ru" # DNS Name or IP of Active Directory
ADDOMAIN="zimbra.example.ru" # if zimbra have some other domain
 
#Values
LDAPSEARCH=/opt/zimbra/bin/ldapsearch
ZMPROV=/opt/zimbra/bin/zmprov
DOMAIN_NAME="zimbra.exmaple.ru"
TIMESTAMP=`date +%N`
TMP_DIR=/tmp
 
ADM_TMP=$TMP_DIR/ads_mail.lst
ADS_TMP=$TMP_DIR/users_ads.lst
SORT_TMP=$TMP_DIR/sort.lst
ZCS_TMP=$TMP_DIR/users_zcs.lst
DIF_TMP=$TMP_DIR/users_dif.lst
SED_TMP=$TMP_DIR/SED.lst
 
# Server values
LDAP_SERVER="ldap://example.ru"
BASEDN="dc=example,dc=ru"
BINDDN="CN=zebra,ou=office,DC=example,DC=ru"
BINDPW="parol"
FILTER="(mail=*)"
FIELDS="mail"
###########################################
 
#ping_AD
HOST="192.168.5.11"
COUNT=10
name=zebra
date=`date`
for pings in $HOST
  do
  count=$(ping -c $COUNT $pings | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
  if [ $count -eq 0 ]; then
  echo "$date: !!netu pinga ot AD" >> /tmp/crash
else
ms=`/opt/zimbra/bin/ldapsearch -x ldap://example.ru -b dc=example,dc=ru -D "CN=zebra,ou=office,DC=example,DC=ru" -w parol "(sAMAccountName=*)" | grep zebra | awk -F' ' '{ print $2 }'`
if [ "$ms" = "$name" ]; then
echo "poperlo"
#####################################################
# ActiveDirectoryMail
#######################################################################################
echo -n "vyigruzka iz AD... "
/opt/zimbra/bin/ldapsearch -x $LDAP_SERVER -b $BASEDN -D "$BINDDN" -w $BINDPW "$FILTER" $FIELDS | \
grep "@$DOMAIN_NAME" | \
awk '{print $2}' | \
sort > $ADM_TMP
echo "Found `cat $ADM_TMP | wc -l` users ($ADM_TMP)"
#####################################################
# OTSEV
echo -n "POISK: "
########################################################################################
cat $ADM_TMP | wc -l
for x in $(cat $ADM_TMP | sed s/^+//g);
do
echo -n " $x ";
sv=`/opt/zimbra/bin/ldapsearch -x example.ru -b dc=example,dc=ru -D "CN=zebra,ou=office,DC=example,DC=ru" -w parol -LLL "(mail=$x)" sAMaccountName | grep sAMAccountName `
un=`echo -n $sv | grep -w sAMAccountName: |  awk '{split ($0, a, "sAMAccountName: "); print a[2]}' | awk '{print $1}'`
un1=`echo -n $un@$DOMAIN_NAME`
 
RES=$?
if [ "$RES" == "0" ]; then echo -n -n  $un1 | sort  >> $ADS_TMP ; else a=0 ; fi
done
sort $ADS_TMP > $SORT_TMP
#########################################################################################
# Extract users from ZCS
echo -n "Quering ZCS... "
/opt/zimbra/bin/zmprov -l gaa $DOMAIN_NAME | sort > $ZCS_TMP
echo "Found `cat $ZCS_TMP | wc -l` users ($ZCS_TMP)"
#########################################################################################
# Generate diff
echo "Generating diff file ($DIF_TMP)"
diff -u $ZCS_TMP $SORT_TMP | grep "$DOMAIN_NAME" > $DIF_TMP
 
sed '/@example.ru/s/@example.ru//g' $DIF_TMP > $SED_TMP
##########################################################################################
# Import new users
echo -n "New users: "
cat $SED_TMP | grep ^+ | wc -l
for i in $(cat $SED_TMP | grep ^+ | sed s/^+//g);
do
echo -n " - Adding $i ";
 
searchValues1=`/opt/zimbra/bin/ldapsearch -x $Domain -b $BASEDN -D $BINDDN -w $BINDPW -LLL "(sAMAccountName=$i)" mail`
Username=`echo $searchValues1 | grep -w mail: |  awk '{split ($0, a, "mail:"); print a[2]}' | awk '{print $1}'`
 
printf "Creating User $Username \n"; # Print something so i know its doing something
/opt/zimbra/bin/zmprov ca $i"example.ru" passwd > /dev/null;
/opt/zimbra/bin/zmprov aaa $i"@example.ru" $Username; # Account Alias based apon there sAMAccountName
RES=$?
if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
done
##############################################################################################
# Delete old users
echo -n "Old users: "
cat $DIF_TMP | grep ^- | wc -l
for i in $(cat $DIF_TMP | grep ^- | sed s/^-//g);
do
echo -n " - Deleting $i ";
$ZMPROV deleteAccount $i > /dev/null;
RES=$?
if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
done 
# Clean up diff list
#rm -f $ADM_TMP
#rm -f $ADS_TMP
#rm -f $SORT_TMP
#rm -f $ZCS_TMP
#rm -f $DIF_TMP
#rm -f $SED_TMP
############################################################################################
else
echo "$date: nenayden zebra, teper vse ploho!" >> /tmp/shit
 
fi
fi
   done
пните да посильнее, чтобы запомнилось) логи выложу но как и какие?
Заранее спасибо за пинок в нужную сторону)

 

Ну давай я тебе расскажу как делал я.
1. Коментим все блоки.
2. Раскоменчиваем 1 блок. На поиск юзеров. (ActiveDirectoryMail)
3. Проверяем что выполнил скрипт (если данные верны, раскоменчиваем второй блок).
4. И так до самого конца. Промежуточные файлы удаляем ручками после каждого запуска скрипта.
Таким образом ты увидишь где у тебя затык.
Так же обязательно посомтри в АД если логин пользователя начинается с Большой буквы то сделай её маленьким. Потому как если сравнивать список логинов(почты) из ад и список логинов (почты) из зибмра, то с АД у тебя логин придёт с заглавной буквы, а точно такой же с сзимбра придёт с прописной. И что ты думаешь? правильно скрипт сного попытается создать уже существующий аккаунт, а потом его удалить. И так до бесконечности.
И так. Логин в ад должен писаться с прописной буквы. Ну или как-то прикручивать заглавные буквы к скрипту. Мне было в падлу и поэтму в ад я прошерстил все логины.
Да и последнее... скрипт на сколько я помню должен запускаться из под пользователя zimbra. И в крон табе заноси его тоже из под пользователя zimbra
Как перейти к этому опльзователю. Заходим под пользователем root
А дальше всё просто пишем
su zimbra
и нажимаем интер.
Пароля спрашивать не должен.

P.S. фаил должен иметь
chmod 755
owner name
zimbra
Group name
zimbra
 Битва продолжается)
пишу:
root@zimbra:/home/maila# /opt/zimbra/bin/ldapsearch -D "cn=zebra,dc=example,dc=ru" -x -W -b "dc=example,dc=ru" example.ru
Enter LDAP Password:
вылазит:
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
-h убрал
всё равно вылазит.
в ldap.conf выставил url ldap://example.ru ldap://example.ru:389
в самой зимбре тест успешен, толкните на мысль)
За ответы большое спасибо...
Судя по тому как ты запускаешь скрипт команду.
Повторюсь ещё разок

Да и последнее... скрипт на сколько я помню должен запускаться из под пользователя zimbra. И в крон табе заноси его тоже из под пользователя zimbra
Как перейти к этому опльзователю. Заходим под пользователем root
А дальше всё просто пишем
su zimbra
и нажимаем интер.
Пароля спрашивать не должен.
то же самое 
zimbra@zimbra:/home/maila$ /opt/zimbra/bin/ldapsearch -D "cn=zebra,dc=example,dc=ru" -x -W -b "dc=example,dc=ru" emaple.ru
Enter LDAP Password:
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
файл в крон не добавлен(пока не работает, не вижу смысла в этом)
example.ru Active Directory
zimbra.example.ru host pochta
в АД сасл не используется...
какие настройки и логи выложить?

 
 
сделай такой запрос
/opt/zimbra/bin/ldapsearch -x -H ldap://example.ru -b dc=example,dc=ru -D "CN=galsync,CN=users,DC=example,DC=ru" -w password "(sAMAccountName=*)" | grep login | awk -F' ' '{ print $2 }'
И так что тут что значит
password это пароль пользователя galsync который используется чтобы из зимбры попасть в ад или делать выгрузку из ад. login введи сюда логин пользователя заведомо существующего в ад (желательно с почтой которой).
У меня при вводе этой команды возвращается мой логин
drugoedelo (потому что есть совпадения grep drugoedelo)

1. если вывидет ошибку копипасть ошибку сюда в коменты.
2. если выведит твой логин.
Значит в коде есть ошибка при обращении к ад буква например русская стоит. Используй пример обращения к ад который я тебе дал в коменте.
Удачи.
P.S. Если не существует пользователя (у меня это galsync) создай его.
 ldap_bind: Invalid credentials (49)
        additional info: 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1
Вот
так и дополнение ldap://dc1.example.ru это ссыль на Актив Директори
 когда её вводишь то получается ошибка
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
а вот это уже ошибка.
У меня при такой ошибке раньше почта нафиг вся удалялась.
Это означает что у тебя траблы в сети. Либо сервер ад не успевает обрабатывать запросы, либо тебе его кто-то в сети спамит. У меня в сети это был троян. Оххх он нам жизнь подсластил в своё время. Но был найден и локализован. После этого сервер Ад все гда был в доступе. Ну а я добавил проверку пингов и запросов в скрипт.
AcceptSecurityContext
ошибка неверный пароль.
Меняй пароль на более простой, пароль не должен содержать ][';/.,
попробуй чисто буквеныый какой-нибудь
из всех этих коментов. вывод
скрипт отрабатывает хорошо запросы уходят правильно.
Единственное тебе осталось разобраться нет ли вирусов в сети это раз.
И какие политики в самом ад ты используешь. Длинные ли у тебя пароли, имеет ли право пользователь galsync делать выгрузку или может у него админские права. В какой директории он у тебя хранится. Я делал как можно проще папочка users в корне и вперёд. Если у тебя длинный путь до него то делай запросы используя этот логин с указанием пути к нему. В общем ты сейчас заниматься  будешь тем чем и я в своё время :D
В общем желаю удачи. Если что по скрипту то пиши постораюсь помочь
 похоже на то, пошел пинать себя и сеть)спасибо за ответы, вижу свет)
выводит
 ldap://dc1.example.ru -b dc=dc1,dc=example,dc=ru -D "CN=zebra,CN=Users,DC=example,DC=ru" -w zebraru1 "(sAMAccountName=*)" | grep i.doloman | awk -F' ' '{ print $2 }
<
то что делать?

На вопрос что делать всегда дадут один ответ!
Гугл в помощь :D

Я скажу по другому
играйся с параметрами строчки (теперь ты хоть какой-то ответ получаешь)
кстати | awk -F' ' '{ print $2 }
не обязательно это я немног сглупил.
попробуй ввести команду
ldap://dc1.example.ru -b dc=dc1,dc=example,dc=ru -D "CN=zebra,CN=Users,DC=example,DC=ru" -w zebraru1 "(sAMAccountName=*)" | grep zebra
посмотри что она выдаст, внимательно читай что она выдаёт, делай выводы.
К сожалению я не могу за тебя решить обсалютно все вопросы потому что:
1. Я не могу и не буду читать весь твой код потому что не я его писал (мне и моего хватает выше крыши а также повседневных задач), но общие или схожие проблемы могу посмотреть или смоделировать у себя(к сожалению твою проблему смоделировать не смог но подсказал тебе куда смотреть, по моему мнению).
2. Точного ответа тебе никто не даст, если он канечна не столкнулся с этой проблемой.
3. Пробуй много разных методов. Болит голова отдахни и лучше попробуй завтра.
попробуй посмотреть что выдаст команда
ldap://dc1.example.ru -b dc=dc1,dc=example,dc=ru -D "CN=zebra,CN=Users,DC=example,DC=ru" -w zebraru1 "(sAMAccountName=*)"

также советую почитать http://xgu.ru/wiki/LDAP

попробуй поделать другие запросы.
Это называется поиск, локализация и решение проблемы.
Мне в своё время это послужило хорошей отправной точкой.