Dans le cadre d’un projet de Site Internet chez un client, il m’a été demandé de fournir un fichier listant les webparts présents sur chaque page du site SharePoint. Il s’agit d’un site de publication SharePoint 2013.

Pour ce faire, j’ai choisi d’utiliser un script PowerShell qui va analyser toutes les pages du site et de ses sous-sites.

On scanne tous les sites et sous sites de type publication avec une fonction LoadSPSite :

function LoadSPSite()
{
    $siteURL = "http://yourSiteUrl"
    $site = New-Object Microsoft.SharePoint.SPSite($siteURL)

    foreach($web in $site.allwebs)
    {
        write-output $web.Title
        ListWebParts($web)
    }
    $site.Dispose()
}

La fonction ListWebParts nous permet de naviguer dans toutes les pages et de lister les webparts qui y sont déposés. Je récupère l’URL de la page, le type du webpart et son titre :

function ListWebParts($web) {
    if ([Microsoft.SharePoint.Publishing.PublishingWeb]::IsPublishingWeb($web))
    {
        $webPublish = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
        $pages = $webPublish.GetPublishingPages()

        foreach($page in $pages)
        {
            $manager = $web.GetLimitedWebPartManager($page.Url, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
            $webCollection = $manager.WebParts
            if($webCollection.Count -ne 0)
            {
                for($i =0;$i -lt $webCollection.Count; $i++)
                {
                    $sw.writeline($web.url + "/" + $page.url + ";" + $webCollection[$i].GetType().Name+ ";" +    $webCollection[$i].Title )
                }
            }
        }
    }
}

Enfin, j’envoie toutes ces informations dans un fichier de type .csv afin qu’elles soient exploitées facilement sous Excel :

$sw = New-Object System.IO.StreamWriter("c:\temp\ListOfWP.csv")
$sw.writeline("Page URL;Web Part Type;Web Part Title")
LoadSPSite
$sw.close()

 
Voici un exemple de résultats qu’on peut avoir :
at

Voici le script complet :

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Publishing")

function ListWebParts($web) {
    if ([Microsoft.SharePoint.Publishing.PublishingWeb]::IsPublishingWeb($web))
    {
        $webPublish = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
        $pages = $webPublish.GetPublishingPages()

        foreach($page in $pages)
        {
            $manager = $web.GetLimitedWebPartManager($page.Url, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
            $webCollection = $manager.WebParts
            if($webCollection.Count -ne 0)
            {
                for($i =0;$i -lt $webCollection.Count; $i++)
                {
                    $sw.writeline($web.url + "/" + $page.url + ";" + $webCollection[$i].GetType().Name+ ";" +    $webCollection[$i].Title )
                }
            }
        }
    }
}

function LoadSPSite()
{
    $siteURL = "http://yourSiteUrl"
    $site = New-Object Microsoft.SharePoint.SPSite($siteURL)

    foreach($web in $site.allwebs)
    {
        write-output $web.Title
        ListWebParts($web)
    }
    $site.Dispose()
}

$sw = New-Object System.IO.StreamWriter("c:\temp\ListOfWP.csv")
$sw.writeline("Page URL;Web Part Type;Web Part Title")
LoadSPSite
$sw.close()