[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.PowerShell") if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) { Add-PSSnapin "Microsoft.SharePoint.PowerShell" } #Gets the current directory. function Get-CurrentScriptDirectory { $Invocation = (Get-Variable MyInvocation -Scope 1).Value Split-Path $Invocation.MyCommand.Path } #Logs and prints messages function LogMessage([String] $Msg) { Write-Host $Msg -ForegroundColor Green Write-Output "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") Message: $Msg" | Out-File -FilePath $currentLogPath -Append -Force } #Logs and prints messages function LogSubsite([String] $Msg) { Write-Host $Msg -ForegroundColor Cyan Write-Output "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") Message: $Msg" | Out-File -FilePath $currentLogPath -Append -Force } function Get-SPOnPremiseSites (){ param([string]$url, [string]$siteCollectionTitle,[string]$siteCollectionUrl) #fill metadata information to the client context variable $clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($url) $clientContext.Credentials = $credentials $web = $clientContext.Web $clientContext.Load($web) $clientContext.Load($web.Webs) $clientContext.load($web.lists) try{ $clientContext.ExecuteQuery() #loop through all webs in the web and start again to find more subwebs foreach($subweb in $web.Webs) { $clientContext.Load($subweb.Lists) $clientContext.ExecuteQuery() $listCount = $subweb.lists.Count LogSubsite("Site Title : "+ $subweb.Title + " Site Url : "+ $subweb.url + " List Count : " + $listCount + " LastModifiedDate" + $subweb.LastItemModifiedDate) $props = @{'SiteCollectionTitle' = $siteCollectionTitle; 'SiteCollectionUrl' = $siteCollectionUrl; 'SiteTitle' = $subweb.Title; 'SiteUrl' = $subweb.url; 'PrimarySiteAdmin' =$sitecol.Owner; 'SecondarySiteAdmin' =$sitecol.SecondaryContact; 'SiteCollectionSize' = ""; 'LastModified' = $subweb.LastItemModifiedDate ; 'ListCount' = $listCount} ; $siteitemarray = New-Object -TypeName PSObject -Property $props ; $global:siteitems += $siteitemarray Get-SPOnPremiseSites $subweb.url $siteCollectionTitle $siteCollectionUrl } } catch{ LogMessage("Could not find web " +$_.Exception.Message + $_.Exception.GetType().FullName + $_.InvocationInfo.PositionMessage) } } $currentPath = Get-CurrentScriptDirectory $currentDateTime = Get-Date -format "yyyy-MM-d.hh-mm-ss" #Path of Log File in Drive. $currentLogPath = $currentPath + "\" + "SPOnPremiseSiteAnalyticsLog_"+ $currentDateTime +".txt" # Initialize client context $webappUrl = '' $username = 'admin username' $password = 'admin password' $clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($webappUrl) $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credentials = New-Object System.Net.NetworkCredential($username,$securePassword) $clientContext.Credentials = $credentials $global:siteitems = $null $global:siteitems = @() # Enumerate all site collections   $siteCols = Get-SPWebApplication $webappUrl | Get-SPSite foreach($sitecol in $siteCols){ #LogMessage("The current site collection url is: " + $sitecol.Url) LogMessage("Site Title : " + $sitecol.RootWeb.Title +" Site url : " + $sitecol.Url + " LastContentModifiedDate : " + $sitecol.LastContentModifiedDate ) $props = [Ordered]@{'SiteCollectionTitle' = $sitecol.RootWeb.Title; 'SiteCollectionUrl' = $sitecol.Url; 'SiteTitle' = ""; 'SiteUrl' = ""; 'PrimarySiteAdmin' =$sitecol.Owner; 'SecondarySiteAdmin' =$sitecol.SecondaryContact; 'SiteCollectionSize' = $sitecol.Usage.Storage/1024/1024; 'LastModified' = $sitecol.LastContentModifiedDate ; 'ListCount' = ""} ; $siteitemarray = New-Object -TypeName PSObject -Property $props ; $global:siteitems += $siteitemarray Get-SPOnPremiseSites $sitecol.Url $sitecol.RootWeb.Title $sitecol.Url } #$global:siteitems $global:siteitems | Export-Csv "SPOnPremiseAnalytics.csv" -Append