Давным-давно, когда я только познакомился с Sharepoint, мне хотелось сделать телефонный справочник, который бы брал данные из AD, да еще и синхронизировал бы все изменения. Появился PowerShell, и реализация моей хотелки стала проще-простого!
Представляю Вашему вниманию решение, которое берет список пользователей и контактов из базы AD и выкладывает в виде списка Sharepoint (WSS). Список является немного модифицированным стандартным шаблоном «Контакты» для лучшего визуального отображения контактов, удобного поиска и добавления фото сотрудников. Справочник  постоянно находится в актуальном состоянии благодаря ежедневной синхронизации.

Итак, у нас имеется стандартная установка Windows Sharepoint Services 3.0 с именем wss-portal, узел phone, созданный из стандартного шаблона «Контакты», а также немного модифицированный список на этом узле с именем «Контакты».

Скрипт размещается на сервере Sharepoint и запускается под именем пользователя, имеющего права на чтение каталога AD и права на запись в узел phone.

Так как создавался данный скрипт до выхода в свет PowerShell 2.0, для получения списка пользователей и контактов из AD я использовал командлеты ActiveRoles Management Shell for Active Directory от компании Quest Software. При желании можно переделать на PoSh 2.0 без QAD.

Механизм работы скрипта:

  • Подключение к списку WSS
  • Очистка списка
  • Подключение к доменному контроллеру dc.domain.corp (измените на свой)
  • Получение списка пользователей домена, чьи имена начинаются с русских букв
  • Получение атрибутов этих пользователей: Отображаемое имя, должность, организация, отдел, кабинет, почтовый индекс, город, почтовый адрес, телефонный номер, пейджер (позже расскажу для чего), мобильный телефон, адрес электронной почты, web страница (я использую этот атрибут для размещения фото) и атрибут блокировки учетной записи
  • Если атрибут пользователя «Пейджер» не содержит символ «@» и если учетная запись не отключена, все полученные учетки выкладываются в список Sharepoint в соответствующие столбцы
  • если атрибут пользователя «WEB страница»  пуст, то в поле списка записывается значение «http://portal.domain.corp/phone/photo/nophoto.jpg», в противном случае прописывается путь к фото сотрудника
  • далее последние пункты повторяются для контактов домена

Сам скрипт:

#########################################################################################
#																						#
#	Имя: Add Users And Contact in WSS List into AD v.1.1								#
#	Язык: PowerShell 1.0 + PowerShell Commands for Active Directory by Quest Software	#
#	Дата создания: 9.10.2009															#
#	Автор: Квасников Иван	kvasnikov@gmail.com											#
#	Описание: Создание адресной книги путем синхронизации списка WSS и AD				#
#																						#
#########################################################################################
Add-PSSnapin Quest.ActiveRoles.ADManagement
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$siteUrl = "http://wss-portal" # Адрес сервера Sharepoint Services
$webName = "phone"  #Имя узла
$spSite = new-object Microsoft.SharePoint.SPSite($siteurl)
$spWeb = $spSite.OpenWeb($webName)
$listName = "Контакты" #Имя списка
$spList = $spWeb.Lists[$listName]
$splist.get_items() | % { $_.Delete() } #Полностью очищаем список
$Domain = 'dc1.domain.corp' #Адрес контроллера домена, к которому подключаемся"; 
Connect-QADService -Service $Domain
$userlist = (Get-QADUser -name [А-Я]* -IncludedProperties DisplayName, title, company, department,
           Office, PostalCode, l, streetAddress, PhoneNumber, Pager,
           Mobile, facsimileTelephoneNumber, Email, physicalDeliveryOfficeName, wWWHomePage, AccountIsDisabled )

ForEach ($user in $userlist)

{
    if ($user.Pager -eq "@") {
 } elseif ($user.AccountIsDisabled -eq $true) {
 } else {
  $spitem     = $spList.Items.Add()
     $spitem["Title"]   = $user.DisplayName -replace ""
  $spitem["JobTitle"]  = $user.Title -replace ""
  $spitem["ol_Department"]= $user.Department -replace ""
     $spitem["Company"]   = $user.Company -replace ""
  $spitem["WorkPhone"]  = $user.PhoneNumber -replace ""
  $spitem["CellPhone"]  = $user.Mobile -replace ""
  $spitem["WorkFax"]   = $user.facsimileTelephoneNumber -replace ""
  $spitem["Email"]   = $user.Email -replace ""
  $spitem["Office"]   = $user.physicalDeliveryOfficeName -replace ""
  $spitem["_Photo"]   = $user.wWWHomePage -replace ""
  $spitem["WorkAddress"]  = $user.PostalCode + ", " + $user.l + ", " + ($user.streetAddress) -replace ""
  if ($user.wWWHomePage -like "")
   {
   $spitem["_Photo"]  = "http://portal.domain.corp/phone/photo/nophoto.jpg" -replace ""
   }
  else
   {
   $spitem["_Photo"]  = $user.wWWHomePage -replace ""
   }
  $spitem.Update()
  }
}
$contactlist = (Get-QADObject -type contact -name [А-Я]* -IncludedProperties DisplayName, title, company, department,
           Office, PostalCode, l, streetAddress, telephoneNumber, Pager, Mobile,
           facsimileTelephoneNumber, mail, physicalDeliveryOfficeName, wWWHomePage)

ForEach ($contact in $contactlist)
{
 if ($contact.Pager -Ne "@") {
  $spitem     = $spList.Items.Add()
     $spitem["Title"]   = $contact.DisplayName -replace ""
  $spitem["JobTitle"]  = $contact.Title -replace ""
  $spitem["ol_Department"]= $contact.Department -replace ""
     $spitem["Company"]   = $contact.Company -replace ""
  $spitem["WorkPhone"]  = $contact.telephoneNumber -replace ""
  $spitem["CellPhone"]  = $contact.Mobile -replace ""
  $spitem["WorkFax"]   = $contact.facsimileTelephoneNumber -replace ""
  $spitem["Email"]   = $contact.mail -replace ""
  $spitem["Office"]   = $contact.physicalDeliveryOfficeName -replace ""
  $spitem["WorkAddress"]  = $contact.PostalCode + ", " + $contact.l + ", " + ($contact.streetAddress) -replace ""
  if ($contact.wWWHomePage -like "")
   {
   $spitem["_Photo"]  = "http://portal.domain.corp/phone/photo/nophoto.jpg" -replace ""
   }
  else
   {
   $spitem["_Photo"]  = $contact.wWWHomePage -replace ""
   }
  $spitem.Update()

}
}

Как можно увидеть из содержания скрипта, я загрузил все фотографии пользователей в папку http://portal.domain.corp/phone/photo/ и добавил путь к фото в поле атрибута пользователя «WEB страница». В список WSS в свою очередь добавлено поле «Фотография пользователя».

Для удобства прилагаю шаблон списка «Контакты» и сам скрипт:

Шаблон списка контактов

Шаблон списка контактов

Скрипт на PowerShell

Скрипт на PowerShell

Похожие статьи