Программное получение веб-сайтов проектов для проектов Project Server с определенным значением в настраиваемом поле

Я использую Microsoft Project Server 2010, и мне нужно массово обновить некоторые списки SharePoint на веб-сайтах проекта (PWS), связанных с активными проектами.

Проекты считаются «активными», если в пользовательском поле «Статус проекта» указаны определенные значения.

Что-то вроде следующего псевдокода:

Get-AllProjectServerProjects | 
  Where-Object { ($_.CustomFields["Project Status"]) -eq 'active' } |
  Foreach-Object {
    $projectWebSite = $_.ProjectWebSiteURL

    # Code here to update SharePoint list for this site

  }

У меня уже есть код для обновления списков SharePoint, и я ищу способ связать веб-сайты проектов с «активными» проектами.

Насколько я могу судить, не существует командлетов PS, раскрывающих данные Project Server. Скорее, необходимо пройти через веб-службу PSI и использовать метод ReadProjectList().

Мне удалось получить список проектов через ReadProjectList(), но я не могу сказать, являются ли они «активными» проектами, и мне не удалось найти прямую ссылку на веб-сайт проекта.

Я мог бы перебрать все веб-сайты проекта с помощью командлетов SharePoint и сопоставить имя проекта, но это не кажется оптимальным, и мне все еще нужно знать, какие проекты «активны».


person    schedule 22.08.2016    source источник
comment
Существует способ получить URL-адрес рабочей области из UID проекта. Метод ReadWssInfo веб-службы WssInterop возвращает объект ProjectWSSInfoDataSet, который включает URL-адрес веб-сайта проекта, если он существует для проекта. Я опубликую как полный ответ, как только взломаю часть «активного» статуса своего вопроса.   -  person andyb    schedule 24.11.2016


Ответы (1)


Я нашел это, которое использует дату последнего изменения, чтобы определить, активен ли он.

#Set-ExecutionPolicy RemoteSigned
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
$url="http://sharePoint.company.com"
$site = New-Object Microsoft.SharePoint.SPSite($url)
$spWebApp = $site.WebApplication

$OutputFN = "c:\ActiveSitesReport.csv"
"Site Name `t URL `t Last Modified" > $OutputFN

# Iterate through all sites:
foreach ( $spSite in $spWebApp.Sites )
{
     foreach ($spWeb in $spSite.AllWebs)
    {
              if ($spWeb.IsRootWeb)
              {
                $siteName = $spWeb.Title +" - Root";
              }
              else
              {
              $siteName = $spSite.RootWeb.Title + " - " + $spWeb.Title;
              }                           
           $siteName + "`t" + $spWeb.Url + "`t" + $spWeb.LastItemModifiedDate >> $OutputFN
         $spWeb.Dispose() 
    }
$spSite.Dispose() 
}
person Randy Schuman    schedule 22.08.2016
comment
Спасибо за предложение. Это может быть достаточно хорошим приближением для моих целей, если я выберу правильную крайнюю дату. Я думаю, что оставлю этот вопрос немного дольше в надежде, что есть способ получить фактический статус проекта через PSI. - person andyb; 23.08.2016