вторник, 16 июня 2015 г.

PowerShell: добавляем внешние контакты в Exchange оптом

Честно сказать не знаю, как реализовано в Exchange 2013, но в 2010 для меня это была некая головная боль.
Задача типичная: есть "кривой-косой" список в Word\Excel\TXT внешних контактов, из которых необходимо организовать лист рассылки. Вариант локального листа не устраивает, т.к. на него должны писать "иные" люди и иметь возможность отвечать. Т.е. принципиально разные решения. В силу того, что пользователю предоставить такие возможности достаточно проблематично (это и запись в определенный OU + возможность Create контактов в Exchange) - приходится делать это самому. Поехали!

Сразу хочу сделать оговорку: мой метод не претендует на лучший способ реализации данной задачи, поэтому я лично буду благодарен тем, кто напишет

Подготовка

Максимум, чем можно "напречь" пользователя в данной ситуации - это попросить подготовить список в необходимом нам формате Excel. 
Итак, имея список, где-бы то ни было - нам его необходимо перевести, в понятный для PS, csv. Несмотря на то. что PS понимает и xls - по примерам - мне показалось проще работать с csv. 
Последний список, с которым мне довелось работать, был не самым худшим вариантом. Мне направили Word, а в нем табличку.


В моем случае - достаточно скопировать данные из Word и поместить их в Excel, чтобы иметь возможность работать с ними далее.


Готовим CSV

В силу того, что с таблицы Word у меня успешно получилась "таблица" в Excel (а точнее данные расположились по столбцам и строкам довольно удачно) - мне необходимо лишь удалить лишние и добавить необходимые.
Итак, лишние данные удаляем, а оставляем только то, что нам потребуется. В моем случае это:

  • LastName # отдельно фамилия
  • FirstName # отдельно имя
  • Mail # электронный адрес
  • Alias # необходим exchange, как псевдоним (например Иванов Иван его alias я делал как iivanov
  • Name # полное отображаемое имя. т.е. Иванов Иван
  • OU # адрес OU в AD, где планируем разместить контакты. 

Этих значений мне достаточно, как информации о контакте и для возможности эти контакты импортировать.
После удаления лишних столбцов добавляем те, которые отсутствуют и дополняем необходимой информацией.
Первой строкой прописываем наименования столбцов (указаны выше).


LastName, FirstName, Mail у меня корректно "пришли" от исходника. А вот alias пришлось набивать вручную. Вся проблема в том, что alias не может быть на кириллице, поэтому его как минимум необходимо переводить транслитом и потом что-то с этим делать. (если вы знаете быстрый способ конвертировать в транслит большой объем данных и при этом иметь на выходе какую-то структуру - буду признателен, если поделитесь), а пока я делал это руками.
Столбец Name я сделал по банальной формуле: =СЦЕПИТЬ(A2; " ";B2)
OU тоже не составляет труда, ведь там можно один раз прописать необходимое значение и растянуть его до конца списка.
Итак, у нас получилась табличка с необходимыми данными, без излишеств.
Теперь нам необходимо все это сохранить в csv с разделителем "Запятая". Из Excel, по умолчанию, это сохранится в кодировке ANSI. В последствии нам будет необходимо ее преобразовать в UTF-8 w\o BOM


Исправляем полученный CSV

В первую очередь скажу, что для редактирования я использую удобный мне Notepad++ 
Открываем csv в Notepad++ и смотрим, если в начале первой строчки у нас имеются лишние знаки разделителя, а лишним можно считать даже 1 знак, после крайнего слова, например:
LastName;FirstName;Mail;Alias;Name;OU;;;;
Вот в данном примере - лишних знаков 4 штуки. Идем в наш Excel файл - выделяем последние 4 пустых столбца (можно схватить даже больше, ничего страшного) и выделив их - удаляем. Пересохраняем документ и получаем на выходе:
LastName;FirstName;Mail;Alias;Name;OU
Как видите - уже никаких излишеств.
В силу того, что на RU Windows региональным разделителем является точка с запятой - документ при сохранении получился именно с этим знаком.
В том же Notepad++ делаем поиск с заменой и меняем все точки с запятой на запятую.


Замены произведены успешно. И нижняя надпись свидетельствует, что всего 225 знаков было изменено.
Проверяем, чтобы документ был в необходимой кодировки UTF-8 w\o BOM (для корректной передачи значений в кириллице). Преобразовать кодировку в Notepad++ довольно просто: Кодировки - Преобразовать в UTF-8 w\o BOM


Важной особенностью является то, что в документе не должно быть лишних пробелов. Иначе при обработке скрипта - у вас будут ошибки, поэтому сейчас необходима очередная ручная работа: Проверить и убрать все лишние пробелы. На одну строку с данными у вас должен быть всего один пробел, где встречаются Фамилия Имя вместе.
Т.е. Тестов,Тест,test@testoff.com,testestes,Тестов Тест,bp.local/ExternalContacts/itcommOU
Если вы не полностью вычистили документ от лишних пробелов, то страшного в этом ничего нет, т.к. при повторном запуске скрипта о существующих элементах в AD PS любезно сообщит: "already exists." а в случае "ошибки с пробелом" появится сообщение о том, что он не сможет получить то или иное значение. Например: Invoke-Command : Cannot bind parameter 'Name' to the target. Exception setting "Name": "The property value is invalid. The value can't contain leading or trailing whitespace." И укажет место проблемы, вплоть до символа.

Готовим скрипт

Поскольку скрипт PS будет использоваться на сервере Exchange - то использовать мы будет Exchange Management Shell
Мой скрипт выглядит достаточно просто:
$list = Import-CSV "C:\PS\list.csv" #указываете путь к размещению вашего csv
Foreach($Point in $list) {
$FirstName = $Point.FirstName
$LastName = $Point.LastName
$Mail = $Point.Mail
$Alias = $Point.Alias
$Name = $Point.Name
$OU = $Point.OU
New-MailContact -ExternalEmailAddress $Mail -Name $Name -Alias $Alias -FirstName $FirstName -Initials '' -LastName $LastName -OrganizationalUnit $OU
}
Поэтому можно просто скопировать мое значение и сохранить в файл с расширением ps1
Главное, соблюдайте значения переменных с теми полями, которые у вас имеются в csv.

Запуск

Запускаете консоль Exchange Management Shell и прописав путь до своего файла-скрипта, запускаете его.


Нормальным результатом работы скрипта будет такая картина с вопросами в полях имени и фамилии.


Кодировка корректно не отображается в консоли PS, но при этом все контакты корректно видны в оснастке AD и Exchange.


На этом процедура добавления контактов закончена успешно.

Не забывайте:
Если вы не хотите, чтобы добавленные контакты были видны в адресной книге - необходимо поставить галочку в их свойствах Hide from Exchange address lists. Сделать это очень просто из консоли Exchange выделив необходимые контакты. Для удобства выделения - можно сортировать их по OU (как вариант).


Второй вариант, это дописать в PS скрипте: HiddenFromAddressListsEnabled: $true
Но мне было проще сделать это в GUI = )