Экспорт — импорт контактов через CSV файл

Наверняка многие сталкивались с задачей массового создание большого количества контактов в организации, например, в случае, когда объединяются 2 компании или налаживают тесные партнерские отношения. Перед ИТ, в этой ситуации, встает задача организовать взаимный обмен почтовыми контактами сотрудников, партнерских организаций, обеспечив их отображение в адресных книгах Outlook.
Один из наиболее простых способов организации подобного обмена, это выгрузка списка активных почтовых ящиков и значимых полей в своей организации в CSV-файл, и передача его партнерской организации, и, в свою очередь, получение аналогичного CSV-файла от компании партнера, и импортирование его в свою почтовую организацию.

Здесь умышленно не рассматриваются варианты обмена контактами и синхронизации адресных книг средствами решений от Microsoft MIIS/ILM/FIM или Collaboration Services от Quest Software и им подобным, так как это требует дополнительных вычислительных ресурсов и финансовых затрат.

Итак, задача состоит из трех этапов:

  1. Общее соглашение о списке полей, которыми будет осуществляться обмен;
  2. Экспорт списка почтовых ящиков с дополнительными полями в CSV файл (с последующей передачей в компанию-партнер);
  3. Импорт данных из CSV файла в AD (полученный из компании партнера).

Общее соглашение о списке полей

Список полей, которыми могут обмениваться, может быть самым разным, все зависит от требований бизнес-процесса, но, тут можно выделить список полей, которыми наверняка будут обмениваться все компании:

  • ФИО
  • Логин
  • Email
  • Должность
  • Телефон
  • Имя компании

Имя компании необходимо если подобный обмен вы осуществляете одновременно с несколькими компаниями
Перечисленным полям соответствуют следующие атрибуты учетной записи 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;ОАО Ромашка

Экспорт списка почтовых ящиков

Процесс экспорта заключается в:

  1. получении списка необходимых ящиков Exchange, при помощи командлета:
 Get-Mailbox -OrganizationalUnit "<Domain name>/<OU Name>"
  1. запросе атрибутов пользователя из AD посредством командлета:
$mailbox.SamAccountName | Get-ADUser -Properties *
  1. Формировании массива данных, через:
$Contact = new-object -TypeName PSObject
$Contact | Add-Member -MemberType NoteProperty -Name FIO -Value $User.DisplayName
  1. Выгрузке массива в 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

Процесс импорта данных заключается в

  1. Импортирование CSV файла через
$ListContacts = Import-Csv .\contacts.csv -Delimiter ";"
  1. Проверка и не создавался ли такой контакт ранее:
if ($Contact.Mail -eq $ExistContact.WindowsEmailAddress) {$Contact_Exist = $true }
  1. Непосредственное создание контакта
New-MailContact -Name $Contact.Name -DisplayName $Contact.Name -LastName $io -FirstName $fio[0] -Alias $MailNickName -OrganizationalUnit "<Domain name>/<OU Name>" -ExternalEmailAddress $Contact.Mail
  1. Установка значений атрибутов, которые нет возможности указать при создании контакта:
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
	}
}

2 комментария

  1. Привет!
    Отличная статья. При импорте Firstname — у вас Фамилия. Lastname -ИО. Хотя в англ.яз это наоборот. Но там из массива легко вытащить нужные поля . Спасибо!

  2. Подскажите, а как загрузить в ящик(в контакты) конкретному пользователю CSV файл?
    через выгрузку с mail.ru и импорт в Outlook — у меня проблема с отображением русский имен(кодировки все пробовал)

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.