среда, 11 января 2017 г.

Копирование и применение мастер страницы на все сайты веб приложения.

replacement master page across all sites Web application copying master
Думаю, что многие сталкивались с задачей замены мастер страницы в большом количестве сайтов. В моем случае это было порядка 30 коллекций в которых есть под сайты. Если менять страницу руками, то это будет занимать продолжительное время. Поэтому мне было проще написать скрип, который все сделает сам.
Скрипт размещенный ниже обращается в веб приложению, получает все коллекции сайтов. Берет файл из указанной директории, загружает его в каталог и публикует файл.
Далее применяет новую masterpage  для корневого сайта и наследует эту страницу для всех под сайтов.
Как пользоваться:
Нужно заменить значение в переменных:
$docLibraryName
$docLibraryUrlName
$localFolderPath 
cls
$docLibraryName = "Коллекция главных страниц"     # название библиотеки
$docLibraryUrlName = "_catalogs/masterpage/My"    # расположение папки для загрузки

$localFolderPath = "C:\Users\User\Desktop\"       # путь к файлу masterpage
 


$webApp = Get-SPWebApplication http://web.app.ru/ # web application

foreach ($SiteCollection in $webApp.Sites)
{    

    Write-Host $SiteCollection.Url

    $docLibrary = $SiteCollection.RootWeb.Lists[$docLibraryName]
    write-host $docLibrary

    $files = ([System.IO.DirectoryInfo] (Get-Item  $localFolderPath)).GetFiles()

    ForEach($file in $files)
    {

        if($file.Name.Contains(".master"))
        {
            write-host $file

            #Open file
            try
            {
            $fileStream = ([System.IO.FileInfo] (Get-Item $file.FullName)).OpenRead()

            #Add file
            $folder =  $SiteCollection.RootWeb.getfolder($docLibraryUrlName)

            write-host "Copying file " $file.Name " to " $folder.ServerRelativeUrl "..."

            $SiteCollection.GetFile

            $spFile = $folder.Files.Add($folder.Url + "/" + $file.Name,[System.IO.Stream]$fileStream, $true)
            $spFile.Publish("")
            write-host "Success"

            #Close file stream
            $fileStream.Close()
            Write-Host "Set masterPage"
            $SiteCollection.RootWeb.MasterUrl =  $SiteCollection.ServerRelativeUrl +"/"+ $docLibraryUrlName+"/" + $file.Name 
            $SiteCollection.RootWeb.MasterUrl
            $rootMasterUrl = $SiteCollection.RootWeb.MasterUrl
            $rootSiteLogo = "/_layouts/15/images/logo_clear.png"# $SiteCollection.RootWeb.SiteLogoUrl
               ForEach ($web in $SiteCollection.AllWebs)
               {
                     write-host $web.Url
                   if(($web.Url -eq 'http://site.ru/SearchCenter')-or($web.Url -eq 'http://site/SearchCenter') ) # сайты на которых не нужно применять masterpage
                   {
                        write-host "/SearchCenter"
                   }
                   else
                   {
                    try{

                     Disable-SPFeature –identity "MDSFeature" -URL $web.URL -confirm:$false
                     }
                    catch
                    {
                    Write "Error: $file.name: $_" #>>c:\logfile.txt
                        continue;
                    }

                      write-host $web.Title $web.Url
                      $web.MasterUrl = $rootMasterUrl   #адрес кастомной страницы в корневом сайте
                      $web.SiteLogoUrl = $rootSiteLogo 
                      $web.Update()
  
                   }
                   $web.Dispose()
               }
            }
            catch
            {
            Write "Error: $file.name: $_" >>c:\logfile.txt
                continue;
            }
        }
    } 

    $SiteCollection.RootWeb.Update()
    $SiteCollection.Dispose()     
}