Get the List of WebParts in a WebApplication – SharePoint PowerShell


Sathish Nadarajan
SharePoint MVP
Published On :   01 Jun 2016
Visit Count
Today :  6    Total :   4434
Plan, Migrate, Secure, Report
SharePoint & Office 365 Tool. Simple & Easy to Use. 15-Day Trial!

Sharegate: Kick-Ass Tool
Think Your SharePoint & Office 365 Are Secure ? Find Out Now!


In this article, let us see, how to get the list of WebParts in an XML File.

 
 ######################### this method will return the WebParts in the Web Application and the Page Information
  
 function GetWebParts()
 {
     Write-Host "Entered GetWebParts Method" -ForegroundColor Yellow 
     Add-Content "$ProgressFile" "Entered GetWebParts Method"
     $script:Progress = "4:Entered"
     
     # Get Web Application
     $WebApplication = Get-SPWebApplication $Config.Configuration.WebApplication.URL
 
     # Assign the XML Output File Paths
     $WebParts_XML_Path = $scriptBase + "\Reports-$LogTime\WebParts.xml"
     
     # Create the XML File Tags
     
     $xmlWriter = New-Object System.XMl.XmlTextWriter($WebParts_XML_Path,$Null)
     $xmlWriter.Formatting = 'Indented'
     $xmlWriter.Indentation = 1
     $XmlWriter.IndentChar = "`t"
     $xmlWriter.WriteStartDocument()
     $xmlWriter.WriteComment('WebParts List On the WebApplication ' + $WebApplication.DisplayName)
     $xmlWriter.WriteStartElement('WebApplication')
     $xmlWriter.WriteEndElement()
     $xmlWriter.WriteEndDocument()
     $xmlWriter.Flush()
     $xmlWriter.Close()
     
     # Get the site Collections Object 
     $SiteCollections =  $WebApplication | Get-SPSite -Limit All
     
     # write the output on XML File
     $xmlDoc = [System.Xml.XmlDocument](Get-Content $WebParts_XML_Path);
     $siteCollectionNode = $xmlDoc.CreateElement("SiteCollections")
     $xmlDoc.SelectSingleNode("//WebApplication").AppendChild($siteCollectionNode)
     $xmlDoc.Save($WebParts_XML_Path)
      
     # Iterate through the SiteCollections
     foreach($SiteCollection in $SiteCollections)
     {
         $siteCollectionName = $SiteCollection | select @{label = "Title";Ex = {$_.rootweb.Title}} 
         
         # write the output on XML File
         $xmlDoc = [System.Xml.XmlDocument](Get-Content $WebParts_XML_Path);
         $siteCollectionNode = $xmlDoc.CreateElement("SiteCollection")
         $xmlDoc.SelectSingleNode("//WebApplication/SiteCollections").AppendChild($siteCollectionNode)
         $siteCollectionNode.SetAttribute("Name", $siteCollectionName.Title)
         $siteCollectionNode.SetAttribute("Url", $SiteCollection.Url)
         
         $subSitesNode = $siteCollectionNode.AppendChild($xmlDoc.CreateElement("SubSites"));
         $xmlDoc.Save($WebParts_XML_Path)
         
         # Get All SubWebs
         $Webs = Get-SPWeb -site $SiteCollection -Limit All 
         
         # Iterate through the SubWebs
         foreach($Web in $Webs)
         {
             # write the output on XML File
             $subSiteNameNode = $subSitesNode.AppendChild($xmlDoc.CreateElement("SubSite"));
             $subSiteNameNode.SetAttribute("Name", $Web.Title)
             $subSiteNameNode.SetAttribute("Url", $Web.Url)
             $subSiteNameNode.SetAttribute("WebID", $Web.Id)
             $parentWebTitle = ""
                                         
             if($Web.ParentWebID -ne "00000000-0000-0000-0000-000000000000")
             {
                 $parentWeb = $SiteCollection.OpenWeb($Web.ParentWebID)
                 $parentWebTitle = $parentWeb.Title
                 
             }
             else
             {
                 $parentWebTitle = "RootWeb"
             }    
             $subSiteNameNode.SetAttribute("ParentWebName", $parentWebTitle)
             $subSiteNameNode.SetAttribute("ParentWebID", $Web.ParentWebID)
     
     
             $webPartsNode = $subSiteNameNode.AppendChild($xmlDoc.CreateElement("WebParts"));
             
             $xmlDoc.Save($WebParts_XML_Path)
             
             # Check For Publishing Site
             if ([Microsoft.SharePoint.Publishing.PublishingWeb]::IsPublishingWeb($Web))  # If the Current Web is Publishing Web, then proceed
             {
                 # Get the Publishing Web Object
                 $pWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($Web)
                 
                 # Get the Pages Doc Library
                 $pages = $pWeb.PagesList
                 
                 # Iterate through all the Pages  
                 foreach ($item in $pages.Items) 
                 {
                     $fileUrl = $Web.Url + "/" + $item.File.Url
                     
                     # Get the webPartManager Object
                     $manager = $item.file.GetLimitedWebPartManager([System.Web.UI.WebControls.Webparts.PersonalizationScope]::Shared);
                     
                     # Get the WebParts
                     $wps = $manager.webparts
                     $wps | select-object @{Expression={$WebApplication.DisplayName};Label="WebApplication"},@{Expression={$siteCollectionName.Title};Label="SiteCollection"}, @{Expression={$Web.Title};Label="SubSite"},@{Expression={$item.File.Name};Label="Page Name"},@{Expression={$fileUrl};Label="Page URL"}, DisplayTitle, ID, IsVisible, @{Expression={$_.GetType().ToString()};Label="Type"}
                     
                     # Iterate through the WebParts
                     foreach($wp in $wps)
                     {
                         # write the output on XML File
                          
                         $webPartNodeNode = $webPartsNode.AppendChild($xmlDoc.CreateElement("WebPart"));
                         $webPartNodeNode.SetAttribute("Name", $wp.DisplayTitle)
                         $webPartNodeNode.SetAttribute("ID", $wp.ID)
                         $webPartNodeNode.SetAttribute("Visible", $wp.IsVisible)
                         $webPartNodeNode.SetAttribute("Type", $wp.GetType())
                         $webPartNodeNode.SetAttribute("PageName", $item.File.Name)
                         $webPartNodeNode.SetAttribute("FileURL", $fileUrl)
                         $xmlDoc.Save($WebParts_XML_Path)
                          
                     }
                 }            
             }
             else # If the Current Web is not a Publishing Web
             {
                 $pages = $null
                 # Get the Site Pages Doc Lib
                 $pages = $Web.Lists["Site Pages"]
                 
                 if ($pages) 
                 {
                     # Iterate through all the Pages
                     foreach ($item in $pages.Items) 
                     {
                         $fileUrl = $Web.Url + "/" + $item.File.Url
                         
                         # Get the WebPart Manager Object
                         $manager = $item.file.GetLimitedWebPartManager([System.Web.UI.WebControls.Webparts.PersonalizationScope]::Shared);
                         
                         # Get All the WebParts
                         $wps = $manager.webparts
                         $wps | select-object @{Expression={$WebApplication.DisplayName};Label="WebApplication"},@{Expression={$siteCollectionName.Title};Label="SiteCollection"}, @{Expression={$Web.Title};Label="SubSite"},@{Expression={$item.File.Name};Label="PageName"},@{Expression={$fileUrl};Label="Page URL"}, DisplayTitle, ID, IsVisible, @{Expression={$_.GetType().ToString()};Label="Type"}
                         
                         # iterate through the WebParts                                                
                         foreach($wp in $wps)
                         {
                             # write the output on XML File
                              
                             $webPartNodeNode = $webPartsNode.AppendChild($xmlDoc.CreateElement("WebPart"));
                             $webPartNodeNode.SetAttribute("Name", $wp.DisplayTitle)
                             $webPartNodeNode.SetAttribute("ID", $wp.ID)
                             $webPartNodeNode.SetAttribute("Visible", $wp.IsVisible)
                             $webPartNodeNode.SetAttribute("Type", $wp.GetType())
                             $webPartNodeNode.SetAttribute("PageName", $item.File.Name)
                             $webPartNodeNode.SetAttribute("FileURL", $fileUrl)
                             $xmlDoc.Save($WebParts_XML_Path)
                              
                         }
                     }                
                 }
                 else 
                 {
                     Write-Host "    Site Pages library not found." -ForegroundColor Red                
                 }            
             }
         }
     }    
     # write the output on XML File
     $xmlDoc.Save($WebParts_XML_Path)
     
     Write-Host "Completed GetWebParts Method" -ForegroundColor Yellow 
     Add-Content "$ProgressFile" "Completed GetWebParts Method"
     $script:Progress = "4:Success"
 }
 
  
 ########### End of Method #################
 
 
 

The snippet is self-explanatory. I know it is a lengthy snippet. But, wanted to share with the community.

Happy Coding,

Sathish Nadarajan.

SharePoint Usage Reports
Usage reports, collaboration and audit for SharePoint.
Categories

Protect Your SharePoint