Forum Discussion
Fromelard
Feb 27, 2019Steel Contributor
PowerShell script to export SharePoint Usage in CSV format used to Audit an Office 365 Tenant
As I published the Exchange Audit script last time:
The question is similar for SharePoint part of Office 365 tenant.
So I wrote that script to export in CSV format a figure about SharePoint usage into an Office 365 Tenant.
It will loop by Site collection and, depending of the permission, subsites to extract size, volume, customization (for the old SP versions).
[boolean]$DebugGlobalMode = $True #$False [string]$username = "Admin@yourtenant.onmicrosoft.com" [string]$PwdTXTPath = "C:\SECUREDPWD\ExportedPWD-$($username).txt" [string]$CSVFolderReport = "C:\SHAREPOINT\Reports\" [string]$AdminTenantURL = "https://YourTenant-admin.sharepoint.com" function Load-DLLandAssemblies { [string]$defaultDLLPath = "" # Load assemblies to PowerShell session $defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll" [System.Reflection.Assembly]::LoadFile($defaultDLLPath) $defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll" [System.Reflection.Assembly]::LoadFile($defaultDLLPath) $defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.Online.SharePoint.Client.Tenant.dll" [System.Reflection.Assembly]::LoadFile($defaultDLLPath) } function Get-SPOWebs(){ param( $Url = $(throw "Please provide a Site Collection Url"), $Credential = $(throw "Please provide a Credentials") ) $context = New-Object Microsoft.SharePoint.Client.ClientContext($Url) $context.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Credential.UserName,$Credential.Password) $context.RequestTimeout = 1000000 # milliseconds $web = $context.Web $context.Load($web) $context.Load($web.Webs) $context.ExecuteQuery() foreach($myweb in $web.Webs) { Get-SPOWebs -Url $myweb.Url -Credential $Credential $myweb } } function Check-InfoPath-Usage($myspoWebSite, $myspcontext) { [string]$InfotpathStatus = "" [boolean]$DebugMode = $false #$DebugGlobalMode $AllspwebLists = $myspoWebSite.lists $myspcontext.Load($AllspwebLists) $myspcontext.ExecuteQuery() Write-Host " ---------------------------------------------- " if($DebugMode) {Write-Host " -->InfoPath:",$($myspoWebSite.Id), "-",$($myspoWebSite.Url), "-",$($myspoWebSite.Title) -ForegroundColor Yellow} foreach($myList in $AllspwebLists) { $myspcontext.Load($myList) $myspcontext.ExecuteQuery() $listTitle = $myList.Title $listType = $myList.BaseTemplate $listUrl = $myList.DefaultViewUrl try { if($DebugMode) {Write-Host " -->Infopath: List Check", $listTitle, "(", $listType, ") at WebURL", $myspoWebSite.url -ForegroundColor Green} if($listType -eq 100 -or $listType -eq 101) { if($DebugMode) {Write-Host " -->Infopath: Line 70 - listType:", $listType} $isSysList = $myList.IsSystemList $IswebCatalog = $myList.IsCatalog $IsAppList = $myList.IsApplicationList $listForms = $myList.Forms $myspcontext.Load($listForms) $myspcontext.ExecuteQuery() if($DebugMode) {Write-Host " -->Infopath: Line 77 - isSysList:", $isSysList} if($DebugMode) {Write-Host " -->Infopath: Line 78 - IsCatalog:", $IswebCatalog} if($DebugMode) {Write-Host " -->Infopath: Line 79 - IsApplicationList:", $IsAppList} if($isSysList -or $IswebCatalog -or $IsAppList) { if($DebugMode) {Write-Host " -->Infopath: System, Application or Catalog List Ignore", $listTitle, "at URL", $myspoWebSite.url -ForegroundColor Yellow} } else { if($listType -eq 101) { if($DebugMode) {Write-Host " -->Infopath: Line 88 - listType:", $listType} if($myList.AllowContentTypes) { if($DebugMode) {Write-Host " -->Infopath: Line 89 - AllowContentTypes:", $myList.AllowContentTypes} $contentTyps = $myList.ContentTypes $myspcontext.Load($contentTyps) $myspcontext.ExecuteQuery() forEach($contType in $contentTyps) { if($DebugMode) {Write-Host " -->Infopath: Line 97 - contType.Name:", $contType.Name} if($contType.Name -eq "Form") { Write-Host " -->InfoPath: Found in Library", $listTitle, "at URL", $myspoWebSite.url -ForegroundColor Magenta $InfotpathStatus += "Infopath:"+ $myspoWebSite.url +";" } } } if($DebugMode) {Write-Host " -->Infopath: Line 105 - listType:", $listType} } else { forEach($listFm in $listForms) { $listPath = $listFm.ServerRelativeUrl if($DebugMode) {Write-Host " -->Infopath: Line 112 - listPath:", $listPath} if ($listPath -like '*displayifs.aspx') { Write-Host " -->InfoPath: Found in List", $listTitle, "at URL", $myspoWebSite.url -ForegroundColor Magenta $InfotpathStatus += "Infopath:"+ $myspoWebSite.url +";" } } } } } } catch { Write-Host " -->Infopath: Error Check for list:", $listTitle -ForegroundColor Red Write-Host " ErrorMessage:", $_.Exception -ForegroundColor Red } } return $InfotpathStatus } function Check-SPWorkflow($myspoWebSite, $myspcontext) { [string]$WorkflowStatus = "" [boolean]$DebugMode = $false #$DebugGlobalMode $AllspwebLists = $myspoWebSite.lists $myspcontext.Load($AllspwebLists) $myspcontext.ExecuteQuery() if($DebugMode) {Write-Host " --> WorkFlow: ",$($myspoWebSite.Id), "-",$($myspoWebSite.Url), "-",$($myspoWebSite.Title) -ForegroundColor Yellow} foreach($list in $AllspwebLists) { if($DebugMode) {Write-Host " -->SPWorkflow: List Check", $list.Title, " at WebURL", $myspoWebSite.url -ForegroundColor Green} try { $myspcontext.Load($list.WorkflowAssociations) $myspcontext.ExecuteQuery() foreach($wfAssociation in $list.WorkflowAssociations) { if($DebugMode) {Write-Host " -->SPWorkflow: List ", $list.Title, "- Wokflow:", $wfAssociation.Name -ForegroundColor Magenta} $WorkflowStatus += "`"$($list.Title)`",`"$($wfAssociation.Name)`",`"$($wfAssociation.TaskListTitle)`"," #$WorkflowStatus += "`"$($wfAssociation.HistoryListTitle)`",$($wfAssociation.Created),$($wfAssociation.Modified)" } } catch { Write-Host " -->WorkFlowCHeck: Error Check for list:", $list.Title -ForegroundColor Red Write-Host " ErrorMessage:", $_.Exception -ForegroundColor Red } } return $WorkflowStatus } cls Write-Host " ---------------------------------------------- " Load-DLLandAssemblies Write-Host " ---------------------------------------------- " $secureStringPwd = ConvertTo-SecureString -string (Get-Content $PwdTXTPath) $adminCreds = New-Object System.Management.Automation.PSCredential $username, $secureStringPwd #$adminCreds = get-credential Connect-SPOService -Url $AdminTenantURL -credential $adminCreds -ErrorAction SilentlyContinue -ErrorVariable Err $data = @() #Retrieve all site collection infos #$sitesInfo = Get-SPOSite -Limit 10 | Sort-Object -Property url | Select * #$sitesInfo = Get-SPOSite -Template "STS#0" -Limit 10 | Sort-Object -Property url | Select * $sitesInfo = Get-SPOSite -Limit ALL | Sort-Object -Property url | Select * [int]$i = 1; [string]$CheckInfoPathStatus = "" [string]$CheckWorkFlowStatus = "" $data = @() Write-Host "--------------------------------------------------------------------------------------------" #Retrieve and print all sites foreach ($site in $sitesInfo) { Write-Host "SiteColl Number:", $i, "- of:", $sitesInfo.Count; $i += 1; $RootSiteCreatedDate = get-date "1900-01-01" try { $Rootcontext = New-Object Microsoft.SharePoint.Client.ClientContext($site.Url) $Rootcontext.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($adminCreds.UserName,$adminCreds.Password) $Rootcontext.RequestTimeout = 1000000 # milliseconds $RootWeb = $Rootcontext.web $Rootcontext.Load($RootWeb) $Rootcontext.ExecuteQuery() $RootSiteCreatedDate = $RootWeb.Created $CheckInfoPathStatus = Check-InfoPath-Usage $RootWeb $Rootcontext $CheckWorkFlowStatus = Check-SPWorkflow $RootWeb $Rootcontext } catch { Write-host " =====>>>> Impossible to get the RootSite " -ForegroundColor Red Write-host " =====>>>> RootSite:", $site.Url -ForegroundColor Yellow } Write-Host "SPO Site collection:", $site.Url, "- Title:", $site.Title Write-Host " => Creation Date:", $RootSiteCreatedDate, "- LastItemModifiedDate", $site.LastContentModifiedDate Write-Host " => External Sharing:", $site.SharingCapability Write-Host " => Site Template Used:", $site.Template Write-Host " => Storage Quota:", $site.StorageQuota Write-Host " => Storage used:", $site.StorageUsageCurrent Write-Host " => Storage Warning Level:", $site.StorageQuotaWarningLevel Write-Host " => Resource Quota:", $site.ResourceQuota, "- Resource used:", $site.ResourceUsageCurrent $SuborRootSite = "RootSite" $data += @( [pscustomobject]@{ SiteCollectionURL = $site.Url SiteCollectionTitle = $site.Title SPType = $site.Template SubsiteURL = $site.Url SuborRootSite = $SuborRootSite WebTemplate = $site.Template WebCreationDate = $RootSiteCreatedDate LastItemModifiedDate = $site.LastContentModifiedDate ExternalSharingCapability = $site.SharingCapability StorageQuotaMB = $site.StorageQuota StorageUsageCurrentMB = $site.StorageUsageCurrent StorageQuotaWarningLevelMB = $site.StorageQuotaWarningLevel ResourceQuota = $site.ResourceQuota ResourceUsageCurrent = $site.ResourceUsageCurrent DevCustomCreated = "" DevCustomSPWorkflow = $CheckWorkFlowStatus DevSPFxCreated = "" DevMSFloworPowerAppsCreated = "" DevInforpathForm = $CheckInfoPathStatus } ) try { $AllWebs = Get-SPOWebs -Url $site.Url -Credential $adminCreds if($DebugMode) {$AllWebs | %{ Write-Host " >>", $_.Title, "-", $_.Url}} Write-Host "--------------------------------------------------------------------------------------------" foreach($mySPWeb in $AllWebs) { Write-Host " >> Subsite:", $mySPWeb.Url -ForegroundColor magenta $CheckInfoPathStatus = Check-InfoPath-Usage $RootWeb $Rootcontext $CheckWorkFlowStatus = Check-SPWorkflow $RootWeb $Rootcontext $SuborRootSite = "SubSite" $data += @( [pscustomobject]@{ SiteCollectionURL = $site.Url SiteCollectionTitle = $site.Title SPType = $site.Template SubsiteURL = $mySPWeb.Url SuborRootSite = $SuborRootSite WebTemplate = $mySPWeb.WebTemplate WebCreationDate = $mySPWeb.Created LastItemModifiedDate = $mySPWeb.LastItemModifiedDate ExternalSharingCapability = $site.SharingCapability StorageQuotaMB = $site.StorageQuota StorageUsageCurrentMB = $site.StorageUsageCurrent StorageQuotaWarningLevelMB = $site.StorageQuotaWarningLevel ResourceQuota = $site.ResourceQuota ResourceUsageCurrent = $site.ResourceUsageCurrent DevCustomCreated = "" DevCustomSPWorkflow = $CheckWorkFlowStatus DevSPFxCreated = "" DevMSFloworPowerAppsCreated = "" DevInforpathForm = $CheckInfoPathStatus } ) } } catch { Write-host " =====>>>> Impossible to get the Subsites " -ForegroundColor Red Write-host " =====>>>> RootSite:", $site.Url -ForegroundColor Yellow } } #Write-Host $data $datestring = (get-date).ToString("yyyyMMdd-hhmm") $CSVFileToExport = Join-Path -Path $CSVFolderReport -ChildPath $("SharePoint_"+ $datestring + ".csv") Write-host " -----------------------------------------" -ForegroundColor Green Write-Host (" >>> writing to file {0}" -f $CSVFileToExport) -ForegroundColor Green $data | Export-csv $CSVFileToExport -NoTypeInformation -enc utf8 Write-host " -----------------------------------------" -ForegroundColor Green
You can adapt that script as you need, based on your own requirements
Fabrice Romelard
French version:
Source used:
- http://sharepoint.stackexchange.com/questions/86842/extract-all-list-names-from-sharepoint-site-to-csv
- https://collab365.community/forum/topics/find-all-sharepoint-online-sites-with-an-infopath-form-and-determine-if-still-being-used/
- https://sharepoint.stackexchange.com/questions/240149/get-the-list-of-all-available-infopath-forms-in-a-sharepoint-site-collection-s
- https://gallery.technet.microsoft.com/office/SharePoint-Online-Get-all-40d76baa
No RepliesBe the first to reply