- PVSM.RU - https://www.pvsm.ru -
Переработал большое количество материала по данной теме, однако, ничего более-менее путного так и не нашел. В связи с этим собрал свой вариант адресной книги, требующий минимум времени для внедрения в готовой инфраструктуре.
Целью задачи было быстро развернуть динамически обновляемый телефонный справочник, источником данных которого была бы Active Directory.
Моё решение поставленной задачи не будет чем-то революционным для профессионалов Sharepoint, однако, может заинтересовать начинающих системных администраторов, перед которыми стоят схожие задачи. Интересующихся прошу под кат.
Итак, всю задачу можно разделить на два этапа:
Для экспорта данных из 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 и наступил на грабли:
Стоит также упорядочить полученные данные в алфавитном порядке по полю «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, доступный по адресу portal [1], а также стандартный список «Контакты», в который мы хотим импортировать данные из AD. Для подключения к Sharepoint посредством PowerShell необходимо добавить остастку Sharepoint в PowerShell, входящую в комплект поставки Sharepoint. Подключение к нужному нам списку «Контакты», расположенному на портале «portal [1]» имеет вид:
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()
}
Добавить прочие параметры по вкусу…
Помните о том, что я поставил Sharepoint 2010 на Windows Server 2012? Так вот ещё одни грабли! Решений несколько: можно разнести экспорт из AD и импорт в Sharepoint по времени, а можно запустить PowerShell 2 из-под PowerShell 3 (мисье знает толк...(с)). Для этого нам потребуется всего лишь одна строчка в первом скрипте:
C:WindowsSystem32WindowsPowerShellv1.0PowerShell.exe -version 2.0 "&'D:Set-Contacts.ps1'"
Собственно на это всё. Остаётся только закинуть C:WindowsSystem32WindowsPowerShellv1.0PowerShell.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:WindowsSystem32WindowsPowerShellv1.0PowerShell.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()
}
Автор: Youma
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/powershell/31511
Ссылки в тексте:
[1] portal: http://portal
[2] Источник: http://habrahabr.ru/post/175921/
Нажмите здесь для печати.