Если ИТ-инфраструктура организации основывается на 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.