Skip to content

Commit a6fdfe2

Browse files
committed
Make all tenants list for SPO sites fast
1 parent 95d48d1 commit a6fdfe2

1 file changed

Lines changed: 46 additions & 13 deletions

File tree

Modules/CIPPCore/Public/Get-CIPPSharePointSiteUsageReport.ps1

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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 / 1GB, 2)
64+
storageAllocatedInGigabytes = [math]::round($StorageAllocatedInBytes / 1GB, 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

Comments
 (0)