SharePoint Alfresco PHP MySQL
О сайте Контакты
пятница, 11 сентября 2015 г.

Отображение состава списков email-рассылок Exchange в SharePoint

Если ИТ-инфраструктура организации основывается на Exchange, Sharepoint и прочих продуктах Microsoft, то рано или поздно все сводится к их интеграции. Например, сотрудники могут участвовать в email-рассылках. Смотреть состав этих рассылок можно в веб-интерфейсе Outlook, но добраться до рассылок там трудно, приходится выбирать определенные пункты меню. Поэтому возникла идея показывать списки рассылок и их состав в SharePoint.

Задача отображения списков рассылок сводится к тому, что надо получить данные из Exchange и вставить их на страницу в SharePoint. Всю работу будет проводить скрипт на PowerShell, который рассчитан на регулярный запуск и обновление странички в SharePoint.

Предварительно нужно создать страницу в SharePoint, где будут отображаться рассылки. На этой странице надо разместить веб-часть «Редактор сценариев». На странице будет располагаться код HTML, в веб-части - стили и возможные JS-скрипты.

Для взаимодействия с Exchange через PowerShell нужно скачать EWS Managed API с официального сайта Microsoft. После его установки и подключения в скрипте PowerShell можно будет вызывать функции для работы с Exchange.

Вот, собственно, скрипт на PowerShell, который берет списки рассылок и отображает их на страничке SharePoint:

Import-Module "C:\Program Files (x86)\Microsoft\Exchange\Web Services\2.1\Microsoft.Exchange.WebServices.dll"
Import-Module ActiveDirectory

# Скрипт для получения списка рассылок и их состава

cls
$exURI = "https://mail.contoso.com/EWS/Exchange.asmx"
$exLogin = "login"
$exPassword = "pass"
$exDomain = "domain"
$mailboxName = "name@contoso.com"

# Соединение с EWS
$Exchange2013_SP1 = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1
$exchangeService = New-Object -TypeName Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList $Exchange2013_SP1
$exchangeService.Url = New-Object -TypeName System.Uri($exURI)
$exchangeService.UseDefaultCredentials = $false
$credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials($exLogin, $exPassword, $exDomain)
$exchangeService.Credentials = $credentials
$exchangeService.AutodiscoverUrl($mailboxName)

# Получение групп рассылок из AD
$groups = Get-ADGroup -Filter{(GroupCategory -eq "Distribution") -and (msExchHideFromAddressLists -notlike "*")} -Properties * | Select Name,Mail,ManagedBy,msExchCoManagedByLink | Sort-Object Name

# Формирование списка рассылок и участников
$output = "<table class='group-list'>"

foreach($group in $groups) {
  $groupAddress = $group.Mail
  $groupName    = $group.Name
  $managers = $group.ManagedBy + $group.msExchCoManagedByLink
  $output += "<tr><td><h2>" + $groupName + "</h2></td><td><h2>" + $groupAddress + "</h2></td></tr>"  
  $expandedGroup = $exchangeService.ExpandGroup($groupAddress) 
  $groupMembers = $expandedGroup.Members | Select Name,Address | Sort-Object Name
  foreach($member in $groupMembers) {
    $memberName = $member.Name
    if ($managers -like '*' + $memberName + '*') { 
      $memberName += " <b>(владелец)</b>"
    }
 $output += "<tr><td>" + $memberName + "</td><td><a href='mailto:" + $member.Address + "'>" + $member.Address + "</a></td></tr>"
  }
  $output += "<tr><td colspan='2'> </td></tr>"
}

$output += "</table>"

# Отправка HTML в SP
Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

$targetPageName = "Списки рассылок.aspx"
$targetSiteUrl  = "http://sharepoint/"

$site = New-Object Microsoft.SharePoint.SPSite($targetSiteUrl)
$web = $site.OpenWeb()

$listPath = $web.ServerRelativeUrl.TrimEnd("/") + "/SitePages"
$list = $web.GetList($listPath)

# Работа со стилями и скриптами страницы
# На страницу должен быть заранее помещен веб-парт Редактор сценариев
$webpartmanager = $web.GetLimitedWebPartManager($listPath + "/" + $targetPageName, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
for($i=0;$i -lt $webpartmanager.WebParts.Count;$i++) { 
  if($webpartmanager.WebParts[$i].GetType() -eq [Microsoft.SharePoint.WebPartPages.ScriptEditorWebPart]){
    $wp = $webpartmanager.WebParts[$i];
    $wp.Content = "<style>table.email-list td {padding: 3px;}</style>"  
    $webpartmanager.SaveChanges($wp);
    break
  }   
}

# Работа с содержимым страницы
foreach ($page in $list.items) {
  $pageName = $page.Name
  if($pageName -eq $targetPageName) {
    $page.File.CheckOut()
    $page["WikiField"] = $output
    $page.Update()
    $page.File.CheckIn("")
    #$page.File.Publish("")
    #$page.File.Approve("")
    break
  }
}

Состав списков рассылок берется из Exchange. Но сам список рассылок в Exchange не хранится, поэтому скрипт получает его из Active Directory. Владельцы списков рассылок также хранятся в Active Directory. После получения всех данных и форматирования их в HTML, скрипт открывает нужную страницу в SharePoint, обновляет на ней веб-часть со скриптами и стилями, и в основное содержимое вставляет сформированный ранее HTML.

Sergey Lysenko, пятница, 11 сентября 2015 г.

Комментарии: