Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /var/www/userman/data/www/exchange2010.ru/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Наверняка многие сталкивались с задачей массового создание большого количества контактов в организации, например, в случае, когда объединяются 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 — у меня проблема с отображением русский имен(кодировки все пробовал)