Наверняка многие сталкивались с задачей массового создание большого количества контактов в организации, например, в случае, когда объединяются 2 компании или налаживают тесные партнерские отношения. Перед ИТ, в этой ситуации, встает задача организовать взаимный обмен почтовыми контактами сотрудников, партнерских организаций, обеспечив их отображение в адресных книгах Outlook.
Один из наиболее простых способов организации подобного обмена, это выгрузка списка активных почтовых ящиков и значимых полей в своей организации в CSV-файл, и передача его партнерской организации, и, в свою очередь, получение аналогичного CSV-файла от компании партнера, и импортирование его в свою почтовую организацию.
Здесь умышленно не рассматриваются варианты обмена контактами и синхронизации адресных книг средствами решений от Microsoft MIIS/ILM/FIM или Collaboration Services от Quest Software и им подобным, так как это требует дополнительных вычислительных ресурсов и финансовых затрат.
Итак, задача состоит из трех этапов:
- Общее соглашение о списке полей, которыми будет осуществляться обмен;
- Экспорт списка почтовых ящиков с дополнительными полями в CSV файл (с последующей передачей в компанию-партнер);
- Импорт данных из CSV файла в AD (полученный из компании партнера).
Общее соглашение о списке полей
Список полей, которыми могут обмениваться, может быть самым разным, все зависит от требований бизнес-процесса, но, тут можно выделить список полей, которыми наверняка будут обмениваться все компании:
- ФИО
- Логин
- Должность
- Телефон
- Имя компании
Имя компании необходимо если подобный обмен вы осуществляете одновременно с несколькими компаниями
Перечисленным полям соответствуют следующие атрибуты учетной записи AD:
- Name;
- SamAccountName;
- Mail;
- Title;
- OfficePhone;
- Company
В итоге, мы ожидаем, что CSV-файлы, которыми будет осуществляться обмен, будет выглядеть следующим образом:
Name;SamAccountName;Mail;Title;OfficePhone;Company
Иванов Иван Иванович;i.ivanov;i.ivanov@contora.ru;инженер;1001;ОАО Ромашка
Петров Петр Петрович;p.petrov;p.petrov@contora.ru;архитектор;1002;ОАО Ромашка
Сидоров Сидор Сидорович;s.sidorov;s.sidorov@contora.ru;Руководитель;1000;ОАО Ромашка
Экспорт списка почтовых ящиков
Процесс экспорта заключается в:
- получении списка необходимых ящиков Exchange, при помощи командлета:
Get-Mailbox -OrganizationalUnit "<Domain name>/<OU Name>"
- запросе атрибутов пользователя из AD посредством командлета:
$mailbox.SamAccountName | Get-ADUser -Properties *
- Формировании массива данных, через:
$Contact = new-object -TypeName PSObject
$Contact | Add-Member -MemberType NoteProperty -Name FIO -Value $User.DisplayName
- Выгрузке массива в CSV-файл
$ListContacts | Export-Csv -Path "C:\Temp\ListContact.csv" -NoTypeInformation -Delimiter ";"
Полные текст скрипта экспорта списка ящиков в CSV-файл с комментариями:
# Подгружаем набор командлетов
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
# Описываем массив для данных
$ListContacts = @();
# выгружаем список почтовых ящиков из конкретной OU или всего домена (можно также указать дополнительные фильтры при необходимости)
$ListEmplMailbox = Get-Mailbox -OrganizationalUnit "<Domain name>/<OU Name>"
# Формируем массив ящиков с необходимыми полями
Foreach ($mailbox in $ListEmplMailbox ){
# Запрашиваем атрибуты из учетки в AD
$User = $mailbox.SamAccountName | Get-ADUser -Properties *
$Contact = new-object -TypeName PSObject
#ФИО
$Contact | Add-Member -MemberType NoteProperty -Name FIO -Value $User.DisplayName
#Alias как правило совпадает с SamAccountName
$Contact | Add-Member -MemberType NoteProperty -Name Alias -Value $mailbox.Alias
#email
$Contact | Add-Member -MemberType NoteProperty -Name Email -Value $User.EmailAddress
#должность
$Contact | Add-Member -MemberType NoteProperty -Name Title -Value $User.Title
#Телефон
$Contact | Add-Member -MemberType NoteProperty -Name Phone -Value $User.telephoneNumber
#Компания
$Contact | Add-Member -MemberType NoteProperty -Name Company -Value "ООО Адреналин"
$ListContacts += $Contact
}
# Выгружаем массив в файл
$ListContacts | Export-Csv -Path "C:\Temp\ListContact.csv" -NoTypeInformation -Delimiter ";"
Импорт данных из CSV файла в AD
Процесс импорта данных заключается в
- Импортирование CSV файла через
$ListContacts = Import-Csv .\contacts.csv -Delimiter ";"
- Проверка и не создавался ли такой контакт ранее:
if ($Contact.Mail -eq $ExistContact.WindowsEmailAddress) {$Contact_Exist = $true }
- Непосредственное создание контакта
New-MailContact -Name $Contact.Name -DisplayName $Contact.Name -LastName $io -FirstName $fio[0] -Alias $MailNickName -OrganizationalUnit "<Domain name>/<OU Name>" -ExternalEmailAddress $Contact.Mail
- Установка значений атрибутов, которые нет возможности указать при создании контакта:
Set-Contact -Identity $newcontact.Identity -Company $Contact.Company -Title $Contact.Title -Phone $contact.OfficePhone
Текст скрипта создания контактов на основе CSV-файла с комментариями:
# Подгружаем набор командлетов
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
# Указываем файл из которого брать информацию о контактах
Set-Location "C:\Temp"
$ListContacts = Import-Csv .\contacts.csv -Delimiter ";" #| select -First 40
# Загружаем имеющиеся в AD контакты
$ListExistContacts = Get-Contact
# начинаем создание контактов
foreach ($Contact in $ListContacts)
{
$Contact_Exist = $null
# Проверяем существует ли такой контакт
foreach ($ExistContact in $ListExistContacts)
{
if ($Contact.Mail -eq $ExistContact.WindowsEmailAddress) {$Contact_Exist = $true }
}
if ($Contact_Exist) {"Контакт существует: " + $Contact.Name }
else
{
# Если такого контакта нет, то создаем его
# парсим строку с ФИО на массив Фамилия Имя Отчетство
# $fio[0] - Фамилия
# $fio[1] - Имя
# $fio[2] - Отчество
$fio = $Contact.Name -split " "
$io = $fio[1] + " " + $fio[2]
# Дописываем префикс, чтобы не попасть в имеющиеся алиасы
$MailNickName = $Contact.SamAccountName + "_contact"
# Создаем контакт
$newcontact = New-MailContact -Name $Contact.Name -DisplayName $Contact.Name -LastName $io -FirstName $fio[0] -Alias $MailNickName -OrganizationalUnit "<Domain name>/<OU Name>" -ExternalEmailAddress $Contact.Mail
# Дописываем в созданном контакте компанию должность и телефон
Set-Contact -Identity $newcontact.Identity -Company $Contact.Company -Title $Contact.Title -Phone $contact.OfficePhone
$newcontact.Identity
}
}
Привет!
Отличная статья. При импорте Firstname — у вас Фамилия. Lastname -ИО. Хотя в англ.яз это наоборот. Но там из массива легко вытащить нужные поля . Спасибо!
Подскажите, а как загрузить в ящик(в контакты) конкретному пользователю CSV файл?
через выгрузку с mail.ru и импорт в Outlook — у меня проблема с отображением русский имен(кодировки все пробовал)