Импорт контактов из другого домена (Exchange 2010)


Пару лет назад я опубликовал скрипт для импорта контактов из одной организации Exchange в другую. Эта операция позволяла пополнить глобальную адресную книгу почтовыми контактами из другого леса. Скрипт успешно работал для Echange 2003, т.к. его процесс RUS обновлял вновь перенесенные контакты должным образом и превращал их в почтовые контакты.

Но в Exchange 2010 процесса RUS нет, и, соответственно, скрипт не работает. Тем не менее все стало проще, т.к. Exchange 2010 имеет встроенные командлеты. Вот слегка поправленная версия скрипта:

$base = [ADSI]"LDAP://ou=Contacts, ou=DEP,dc=domain,dc=ru"

$users = (new-object System.DirectoryServices.DirectorySearcher([ADSI]"LDAP://ou=DEP1,dc=domain1,dc=ru","(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(title=*)))")).findAll()

$users | ForEach-Object {

$_ = $_.GetDirectoryEntry()
$NewContact = $base.Create("contact","cn=" + $_.cn)

$NewContact.SetInfo()

$NewContact.extensionAttribute15 = $base.distinguishedName

$NewContact.displayname = $_.displayname
$NewContact.givenname = $_.givenname
$NewContact.sn = $_.sn
$NewContact.initials = $_.initials
$NewContact.description = $_.description

$NewContact.department = $_.department
$NewContact.title = $_.title
$NewContact.company = $_.company

$NewContact.telephoneNumber = $_.telephoneNumber
$NewContact.othertelephone = $_.othertelephone

$NewContact.ipPhone = $_.ipPhone
$NewContact.otherIpPhone = $_.otherIpPhone

$NewContact.mobile = $_.mobile
$NewContact.otherMobile = $_.otherMobile

$NewContact.facsimileTelephoneNumber = $_.facsimileTelephoneNumber
$NewContact.otherfacsimileTelephoneNumber = $_.otherfacsimileTelephoneNumber

$NewContact.SetInfo()

if ($_.proxyaddresses) {

$targetAddress = $_.proxyaddresses -clike "SMTP:*"
Enable-MailContact "cn=$($_.cn),$($base.distinguishedName)" -Alias "$_.cn" -ExternalEmailAddress "$targetAddress" -PrimarySmtpAddress $_.mail.ToString()

$NewContact.GetInfo()

$NewContact.proxyaddresses = $_.proxyaddresses

$NewContact.SetInfo()

}

}

Возможно он будет работать несколько иначе, чем версия для Exchange 2003, но это вам будет легко поправить :-)

комментариев 7

  1. Илья, большое спасибо вам за скрипт!

    Подскажите пожалуйста, когда его выполняю, все отрабатывает корректно, кроме Alias в MailContact — у всех юзеров оно заполняется как «System.DirectoryServices.DirectoryEntry.cn». Подскажите пожалуйста, что нужно поменять, чтобы отображался корректный алиас?

    • Пока для себя решил вот таким образом:

      $alias = ($targetAddress -replace «SMTP:» -replace «@contoso.ru»)

      Enable-MailContact «cn=$($_.cn),$($base.distinguishedName)» -Alias «$alias» -ExternalEmailAddress «$targetAddress» -PrimarySmtpAddress $_.mail.ToString()

  2. Попробовал сейчас запустить еще раз. В версии, которую я прислал, создается почта только у части контактов. В вашей версии поле почты пустое у всех, даже нет System.DirectoryServices.DirectoryEntry.cn. В процессе выполнения появляются вот такие ошибки:
    Enable-MailContact : The operation couldn’t be performed because object ‘contoso.test/Contacts/Имя Фамилия’ couldn’t be found on
    ‘DC02.contoso.tes’.
    At line:45 char:1
    + Enable-MailContact «cn=$($_.cn),$($base.distinguishedName)» -Alias «$alias» -Ext …

    Подскажите пожалуйста, что-то изменилось или ошибка где-то у меня?

  3. Всё оказалось очень просто и банально. На момент запуска Enable-Mailcontact в AD еще не обновилась инфа по созданному контакту, поэтому скрипт писал что такого объекта нет. Если повторно запускать скрипт, то всё ок.
    Можно вместо повторного запуска просто добавить Start-Sleep -Seconds 20 (при меньшем значении иногда проскакивает ошибка), но при наличии 4000 контактов выполнение происходит довольно долго.

    • Вы можете указать конкретный домен-контроллер в командлете. В этом случае не нужно делать задержку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: