Если у вашей организации (группы компаний) несколько лесов с несколькими организациями Exchange, то как правило возникает задача иметь контакты всех организаций в единой адресной книге Exchange. Предлагаю вашему вниманию достаточно простое решение с использованием PowerShell, позволяющее собирать учетные записи из удаленных лесов и размещать их в виде контактов в основном лесу.

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

Ранее уже публиковались различные решения для выполнения данной задачи, однако они либо были слишком громоздки и дОроги (например на базе ILM 2007), либо не имели требуемого функционала (ранее опубликованные скрипты на PowerShell). Слева приведена схема тестовой среды — два леса, два домена, собираем инфу о пользователях домена saturn.corp и размещаем в адресной книге домена moon.corp. Хочу сразу заметить, что для полностью автоматической синхронизации необходимо хотя бы одностороннее доверительное отношение между доменами, т.е. учетная запись домена moon.corp, под которой будет выполняться скрипт, должна иметь права на просмотр учетных записей в домене saturn.corp

Общая схема синхронизации:

  • Получение с помощью скрипта информации об учетных записях удаленного домена и, в зависимости от их текущего состояния, либо создание новых контактов, либо обновление или удаление существующих в указанном OU;
  • Применение политик Exchange к созданным контактам;
  • Обновление адресных книг и GAL Exchange

Итак, в первую очередь мы разместим на почтовом сервере в домене moon.corp приведенный ниже скрипт:

#Адрес контроллера домена, к которому подключаемся";
$Domain = 'dc.saturn.corp'
Connect-QADService -Service $Domain
#Получаем список пользователей удаленного домена	
$userlist = (Get-QADUser -name [А-Я]* -IncludedProperties DisplayName, title, company, department,
           mailNickname, Office, PostalCode, l, streetAddress,
           PhoneNumber, Pager, Mobile, facsimileTelephoneNumber,
           Email, physicalDeliveryOfficeName, wWWHomePage,
           AccountIsDisabled )
ForEach ($user in $userlist)
 {
 #Пользователь заблокирован?
 if ($user.AccountIsDisabled -eq $true)
  {
  #У пользователя есть почта?
  if ($user.mail -notlike $NULL)
   {
   #Пользователь заблокирован, удаляем существующий контакт 
   Remove-MailContact $user.mail –Confirm:$false
   }
  }
 elseif ($(Get-contact $user.displayname))
  {
  if ($user.mail -notlike $NULL)
   {
   #Пользователь не заблокирован, контакт существует, надо обновить
   Set-Contact $user.email -Company $user.Company -Title $user.Title -Department $user.Department `
         -PostalCode $user.PostalCode -StreetAddress $user.StreetAddress  `
         -MobilePhone $user.mobile -Fax $user.facsimileTelephoneNumber `
         -Phone $user.telephoneNumber
   }
  }
 else
  {
  if ($user.email -notlike $NULL)
   {
   #Пользователь не заблокирован, контакт не существует, надо создать
   New-MailContact -Name $user.displayname -DisplayName $user.displayname -alias $user.mailnickname `
       -OrganizationalUnit moon.corp/Contacts/Saturn -ExternalEmailAddress $user.mail
   }
  }
 }

Поместим данный скрипт в планировщик и назначим его выполнение, скажем, каждые 1 раз в день в 22 часа. Еще раз обращаю внимание, что учетная запись, под которой будт запускаться задание на выполнение скрипта, должна иметь права на просмотр каталога AD в удаленном домене, а также на запись в OU moon.corp/Contacts/Saturn в целевом.
[tip]Если скрипт расположен в D:\Scripts\SyncContacts\ImportUserAsContactintoAD.ps1, то строка в планировщике (с учетом использования PowerShell 1.0) должна выглядеть так: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command «D:\Scripts\SyncContacts\ImportUserAsContactintoAD.ps1″
[/tip]

Далее нам необходимо создать и применить на сервере Exchange 2007 политику к вновь созданным контактам, исходя из того, что у всех пользователей домена saturn.corp атрибут «Организация» содержит запись «Saturn Corp.«:

New-EmailAddressPolicy -Name "Remote Contacts Policy" -IncludedRecipients MailContact `
-ConditionalCompany "Saturn Corp." -EnabledEmailAddressTemplates "SMTP:%m@moon.ru"

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

Update-EmailAddressPolicy -Identity "Remote Contacts Policy"
Get-AddressList | Update-AddressList
Get-GlobalAddressList | Update-GlobalAddressList
Get-OfflineAddressBook | Update-OfflineAddressBook

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

Успехов!

P.S. Приведенный в статье способ использовался в нашей организации ранее. В настоящее время синхронизация GAL Exchange 2007 осуществляется с помощью бесплатного компонента MIIS 2003 — IIFP. Если вам интересна настройка такой схемы, прошу оставлять свои комментарии — напишу подробную статью.

Случайная статья