@@ -18,23 +18,56 @@ function Get-CIPPSharePointSiteUsageReport {
1818
1919 try {
2020 if ($TenantFilter -eq ' AllTenants' ) {
21- $AllSiteItems = Get-CIPPDbItem - TenantFilter ' allTenants' - Type ' SharePointSiteListing'
22- $Tenants = @ ($AllSiteItems | Where-Object { $_.RowKey -ne ' SharePointSiteListing-Count' } | Select-Object - ExpandProperty PartitionKey - Unique)
21+ # Bulk-fetch all site listings and usage data in 2 queries instead of per-tenant
22+ $AllSiteItems = @ (Get-CIPPDbItem - TenantFilter ' allTenants' - Type ' SharePointSiteListing' | Where-Object { $_.RowKey -ne ' SharePointSiteListing-Count' })
23+ $AllUsageItems = @ (Get-CIPPDbItem - TenantFilter ' allTenants' - Type ' SharePointSiteUsage' | Where-Object { $_.RowKey -ne ' SharePointSiteUsage-Count' })
2324
2425 $TenantList = Get-Tenants - IncludeErrors
25- $Tenants = $Tenants | Where-Object { $TenantList.defaultDomainName -contains $_ }
26+ $ValidTenants = [System.Collections.Generic.HashSet [string ]]::new([System.StringComparer ]::OrdinalIgnoreCase)
27+ foreach ($T in $TenantList ) { [void ]$ValidTenants.Add ($T.defaultDomainName ) }
28+
29+ # Build usage lookup keyed by siteId across all tenants
30+ $UsageBySiteId = [System.Collections.Generic.Dictionary [string , object ]]::new([System.StringComparer ]::OrdinalIgnoreCase)
31+ foreach ($UsageItem in $AllUsageItems ) {
32+ $UsageRow = $UsageItem.Data | ConvertFrom-Json - Depth 10
33+ if (-not [string ]::IsNullOrWhiteSpace($UsageRow.siteId )) {
34+ $UsageBySiteId [[string ]$UsageRow.siteId ] = $UsageRow
35+ }
36+ }
2637
2738 $AllResults = [System.Collections.Generic.List [PSCustomObject ]]::new()
28- foreach ($Tenant in $Tenants ) {
29- try {
30- $TenantResults = Get-CIPPSharePointSiteUsageReport - TenantFilter $Tenant
31- foreach ($Result in $TenantResults ) {
32- $Result | Add-Member - NotePropertyName ' Tenant' - NotePropertyValue $Tenant - Force
33- $AllResults.Add ($Result )
34- }
35- } catch {
36- Write-LogMessage - API ' SharePointSiteUsageReport' - tenant $Tenant - message " Failed to get report for tenant: $ ( $_.Exception.Message ) " - sev Warning
37- }
39+ foreach ($SiteItem in $AllSiteItems ) {
40+ $Tenant = $SiteItem.PartitionKey
41+ if (-not $ValidTenants.Contains ($Tenant )) { continue }
42+
43+ $Site = $SiteItem.Data | ConvertFrom-Json - Depth 10
44+ if ($Site.isPersonalSite -eq $true ) { continue }
45+
46+ $SiteUsage = $null
47+ [void ]$UsageBySiteId.TryGetValue ([string ]$Site.sharepointIds.siteId , [ref ]$SiteUsage )
48+
49+ $StorageUsedInBytes = [double ]($SiteUsage.storageUsedInBytes ?? 0 )
50+ $StorageAllocatedInBytes = [double ]($SiteUsage.storageAllocatedInBytes ?? 0 )
51+
52+ $AllResults.Add ([PSCustomObject ]@ {
53+ Tenant = $Tenant
54+ siteId = $Site.sharepointIds.siteId
55+ webId = $Site.sharepointIds.webId
56+ createdDateTime = $Site.createdDateTime
57+ displayName = $Site.displayName
58+ webUrl = $Site.webUrl
59+ ownerDisplayName = $SiteUsage.ownerDisplayName
60+ ownerPrincipalName = $SiteUsage.ownerPrincipalName
61+ lastActivityDate = $SiteUsage.lastActivityDate
62+ fileCount = $SiteUsage.fileCount
63+ storageUsedInGigabytes = [math ]::round($StorageUsedInBytes / 1 GB , 2 )
64+ storageAllocatedInGigabytes = [math ]::round($StorageAllocatedInBytes / 1 GB , 2 )
65+ storageUsedInBytes = $SiteUsage.storageUsedInBytes
66+ storageAllocatedInBytes = $SiteUsage.storageAllocatedInBytes
67+ rootWebTemplate = $SiteUsage.rootWebTemplate
68+ reportRefreshDate = $SiteUsage.reportRefreshDate
69+ AutoMapUrl = $Site.AutoMapUrl
70+ })
3871 }
3972 return $AllResults
4073 }
0 commit comments