Pull to refresh

Адресная книга Sharepoint 2010 из AD с синхронизацией

Reading time 5 min
Views 11K
Переработал большое количество материала по данной теме, однако, ничего более-менее путного так и не нашел. В связи с этим собрал свой вариант адресной книги, требующий минимум времени для внедрения в готовой инфраструктуре.

Исходные данные:

  • Уровень домена: Windows 2008 R2
  • Сервер Sharepoint: Windows Server 2012 Standart
  • Версия Sharepoint 2010 со всеми обновлениями


Цель задачи

Целью задачи было быстро развернуть динамически обновляемый телефонный справочник, источником данных которого была бы Active Directory.

Решение задачи

Моё решение поставленной задачи не будет чем-то революционным для профессионалов Sharepoint, однако, может заинтересовать начинающих системных администраторов, перед которыми стоят схожие задачи. Интересующихся прошу под кат.

Итак, всю задачу можно разделить на два этапа:
  • Экспорт данных из Active Directory.
  • Импорт данных в список Sharepoint.

Экспорт данных из AD


Для экспорта данных из AD следует воспользоваться модулем Active Directory для PowerShell 2 или 3 версий. Интересующий нас командлет называется Get-ADUser и имеет общирную справку. Используем его:

Get-ADUser -Filter {(ObjectClass -eq "user")} | FT Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber


Результатом выполнения данного кода будет таблица с данными всех пользователей домена, включая служебные учетные записи, однако, в данной таблице не будет таких данных как телефонные номера, адреса электронной почты, отделы и должности сотрудников. Это связано с тем, что по-умолчанию PS возвращает только 10 связанных с учетными записями свойств AD. Для указания PS необходимости извлечь нужные нам параметры воcпользуемся параметром командлета Get-ADUsers -Parameters (простите за тафтологию).

Get-ADUser -Filter {(ObjectClass -eq "user")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | FT Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber

Данный код вернёт все необходимые данные в табличном виде для всех пользователей домена. Логично предположить, что в доменной среде присутствует большое количество служебных учётных данных. Добавим фильтр, отклоняющий учетные записи пользователей, с незаполненным полем «GivenName», то есть «Имя».

Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | FT Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber

Теперь настаёт черёд экспорта полученных данных в файл CSV. (Изначально пранировалось всё сделать одним скриптом, однако, PowerShell 3 не поддерживает командлеты Sharepoint 2010, а Powershell 2 не может работать с модулем Active Directory, предназначенным для PowerShell 3). Для экспорта данных я использовал стандартный командлет PS Export-CSV и наступил на грабли:
  1. Экспортируемые данные были вида 4641548913248745,,. Совсем не то, что выводилось в консоль ранее. Вывод: табличные данные нам не подходят. Заменяем FT на SELECT и получаем...
  2. … кучу вопросиков вместо кириллических символов. Если в данных есть кириллица, необходимо явно задавать кодировку экспорта (Unicode).

Стоит также упорядочить полученные данные в алфавитном порядке по полю «Name» или «Полным Ф.И.О.», чтобы не заставлять делать это Sharepoint, а также убрать из CSV-файла первую сточку (заголовок, оставляемый PowerShell).

Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | sort-object -property Name | Select Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation


Импорт данных в Список Sharepoint


Представим, что есть у нас неких портал Sharepoint, доступный по адресу portal, а также стандартный список «Контакты», в который мы хотим импортировать данные из AD. Для подключения к Sharepoint посредством PowerShell необходимо добавить остастку Sharepoint в PowerShell, входящую в комплект поставки Sharepoint. Подключение к нужному нам списку «Контакты», расположенному на портале «portal» имеет вид:

add-pssnapin microsoft.sharepoint.powershell
$web = Get-SPWeb "http://portal"
$list = $web.lists["Контакты"]

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

do {$list.items.delete(0)}
until ($list.items.Count -eq 0)

Ну и собственно сам импорт:

Import-Csv D:\Contacts.csv | ForEach-Object {
$item = $list.items.Add()
$item["Полное имя"] = $_.Name
$item["Организация"] = $_.Company
$item["Рабочий телефон"] = $_.telephoneNumber
$item["Мобильный телефон"] = $_.mobile
$item["Адрес электронной почты"] = $_.Mail
$item["Должность"] = $_.Title
$item.update()
}

Добавить прочие параметры по вкусу…

PowerShell 2 из-под PowerShell 3


Помните о том, что я поставил Sharepoint 2010 на Windows Server 2012? Так вот ещё одни грабли! Решений несколько: можно разнести экспорт из AD и импорт в Sharepoint по времени, а можно запустить PowerShell 2 из-под PowerShell 3 (мисье знает толк...(с)). Для этого нам потребуется всего лишь одна строчка в первом скрипте:

C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -version 2.0 "&'D:\Set-Contacts.ps1'"


Собственно на это всё. Остаётся только закинуть C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe с параметром "&'D:\Set-Contacts.ps1'" в планировщик задач и поддерживать данные пользователей AD в актуальном состоянии. Спасибо за уделённое время! Полные версии скриптов оставляю ниже.

Get-Contacts.ps1
Get-ADUser -Filter {(ObjectClass -eq "user") -and (GivenName -like "*")} -Properties Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | sort-object -property Name | Select Surname, GivenName, Name, Mail, Company, Department, Title, telephoneNumber, homephone, mobile, facsimileTelephoneNumber | Export-Csv D:\Contacts.csv -Encoding Unicode -NoTypeInformation
C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -version 2.0 " & ' D:\Set-Contacts.ps1 ' "

Set-Contacts.ps1
add-pssnapin microsoft.sharepoint.powershell
$web = Get-SPWeb "http://portal"
$list = $web.lists["Контакты"]
do {$list.items.delete(0)}
until ($list.items.Count -eq 0)
Import-Csv D:\Contacts.csv | ForEach-Object {
$item = $list.items.Add()
$item["Полное имя"] = $_.Name
$item["Организация"] = $_.Company
$item["Рабочий телефон"] = $_.telephoneNumber
$item["Мобильный телефон"] = $_.mobile
$item["Адрес электронной почты"] = $_.Mail
$item["Должность"] = $_.Title
$item.update()
}
Tags:
Hubs:
+6
Comments 28
Comments Comments 28

Articles