Verwendete WebParts rekursiv auflisten

Jeder Entwickler kennt das Problem. Man erweitert einen WebPart und möchte das neue Paket auf dem SharePoint Server bereitstellen. Insbesondere wenn die WebPart Toolpane angepasst wurde und neue Parameter benötigt werden, können bestehende Seiten, auf denen der WebPart verwendet wird, hinterher zerstört sein. Es muss sichergestellt werden, dass alle Seiten nach der Aktualisierung weiterhin aufrufbar sind. Dazu muss zunächst ermittelt werden, welche Seiten überhaupt betroffen sind. Bei häufig verwendeten WebParts wie etwa einem Kontakt WebPart kann man schnell den Überblick verlieren.

Um eine Liste aller betroffenen Seiten zu erstellen, kann man folgendes Powershell Skript bemühen.

Die Vorlage stammt von diesem Blogbeitrag. Ich habe das Skript erweitert, so dass alle Webseiten aufgelistet werden, unabhängig von aktivierten Features (Publishing Feature) oder verwendeten Site Template.

Zum Aufrufen des Skripts wird ein URL Parameter erwartet. Von diesem Pfad an werden nun alle Subwebsites rekursiv durchlaufen und die dort verwendeten WebParts ausgegeben. Die Ausgabe erfolgt in einem Grid, welches Filterfunktionen bietet und so das Auffinden der betroffenen Seiten erleichtert.

Beispiel für einen Aufruf: enumerateWebParts.ps1 http://portal

Das Skript kann auch hier heruntergeladen werden. Nach dem Herunterladen muss der dateityp von .txt auf .ps1 umbenannt werden.

cls

# Add SharePoint cmdlets reference

Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue

function enumerateWebParts($Url)
{

$site = new-object Microsoft.SharePoint.SPSite $Url

foreach($web in $site.AllWebs)
{

if ([Microsoft.SharePoint.Publishing.PublishingWeb]::IsPublishingWeb($web))
{
$pWeb =[Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)

$pages = $pWeb.PagesList

Write-Host "Processing Web:" $pWeb.Url "..." -ForegroundColor Magenta

foreach ($item in $pages.Items)
{

$fileUrl = $web.Url + "/" + $item.File.Url

Write-Host " " $fileUrl -ForegroundColor Green

$manager = $item.file.GetLimitedWebPartManager([System.Web.UI.WebControls.Webparts.PersonalizationScope]::Shared);

$wps = $manager.webparts

$wps | select-object
@{Expression={$pWeb.Url};Label="Web URL"},@{Expression={$fileUrl};Label="Page URL"}, DisplayTitle, IsVisible, @{Expression={$_.GetType().ToString()};Label="Type"}

}

}

else
{

Write-Host " Not a publishing web:" $web.Url". Looking for Site Pages library." -ForegroundColor Magenta

$pages = $null

$pages = $web.Lists["Site Pages"]

if (!$pages) {

$pages = $web.Lists["Seiten"]

}

if (!$pages) {

$pages = $web.Lists["Websiteseiten"]

}

if ($pages) {

Write-Host " " $pages.Title "found."
-ForegroundColor Green

foreach ($item in $pages.Items)
{

$fileUrl = $web.Url + "/" + $item.File.Url

$manager = item.file.GetLimitedWebPartManager([System.Web.UI.WebControls.Webparts.PersonalizationScope]::Shared);

$wps = $manager.webparts

$wps | select-object @{Expression={$pWeb.Url};Label="Web URL"},@{Expression={$fileUrl};Label="Page URL"},
DisplayTitle,
IsVisible,
@{Expression={$_.GetType().ToString()};Label="Type"}

}

}

else
{

Write-Host " Site Pages library not found."
-ForegroundColor Yellow

}

$fileUrl = $web.Url + "/default.aspx"

$fileUrl = $fileUrl.Replace(" ", "%20")

$filetoCheck = $web.GetFile($fileUrl)

Write-Host " checking " $fileurl -ForegroundColor Green

$manager = filetoCheck.GetLimitedWebPartManager([System.Web.UI.WebControls.Webparts.PersonalizationScope]::Shared);

$wps = $manager.webparts

$wps | select-object @{Expression={$pWeb.Url};Label="Web URL"},@{Expression={$fileUrl};Label="Page URL"},
DisplayTitle,
IsVisible,
@{Expression={$_.GetType().ToString()};Label="Type"}

}

Write-Host "... completed processing" $web "..."
-ForegroundColor Magenta

}

}

# Checking Parameters

if ($args[0] -ne $null)

{

$row = enumerateWebParts($args[0])

$row | Out-GridView

}

else

{

Write-Host "Missing arguments. Please check your parameters"

}

Beispiel eines Aufrufes