Cómo obtener un reporte de almacenamiento de todos tus sitios de SharePoint Online con PowerShell y PnP
Si administras Microsoft 365, tarde o temprano necesitas responder preguntas como: ¿qué sitios de SharePoint están a punto de llenarse?, ¿quién está usando más almacenamiento?, ¿cuánta cuota real tengo asignada por sitio?
En este artículo te muestro cómo generar un reporte en CSV con el almacenamiento de todos los sitios de SharePoint Online usando PowerShell 7 y el módulo PnP.PowerShell, siguiendo estos pasos:
- Instalar o actualizar el módulo PnP.PowerShell.
- Registrar una aplicación en Microsoft Entra ID para autenticarnos de forma segura.
- Crear un script en PowerShell que recorra todos los sitios y exporte su uso de almacenamiento.
1. Requisitos previos
Antes de empezar, asegúrate de tener lo siguiente:
- Permisos: rol de SharePoint Administrator o Global Administrator en el tenant.
- PowerShell 7 instalado en tu equipo (pwsh).
- Conectividad hacia tu tenant de Microsoft 365 (Internet, puertos estándar, etc.).
Trabajaremos con el módulo PnP.PowerShell, que es el recomendado para automatizar tareas de SharePoint Online desde PowerShell 7.
2. Instalar o actualizar el módulo PnP.PowerShell
Abre una consola de PowerShell 7 con tu usuario administrador y ejecuta:
# Actualizar PnP.PowerShell si ya está instalado
Update-Module PnP.PowerShell -Scope CurrentUser
# Si no lo tienes instalado, usa:
Install-Module PnP.PowerShell -Scope CurrentUser -Force
Cuando termine la instalación/actualización, cierra la consola y vuelve a abrirla para que cargue correctamente el módulo.
3. Registrar una app en Entra ID para PnP (inicio de sesión interactivo)
Debido a cambios recientes en la autenticación, para usar Connect-PnPOnline de forma interactiva es necesario contar con una App Registration en Microsoft Entra ID (antes Azure AD). Esta app será la identidad que usará PnP para conectarse a SharePoint Online.
Vamos a crear la app directamente desde PowerShell usando el cmdlet Register-PnPEntraIDAppForInteractiveLogin.
3.1 Conectarte e iniciar el registro
En PowerShell 7, ejecuta lo siguiente (ajusta el nombre de tu tenant):
Import-Module PnP.PowerShell
# Cambia por el nombre de tu dominio de Microsoft 365
$tenant = "tudominio.onmicrosoft.com"
# Registrar la aplicación para logins interactivos con PnP
$result = Register-PnPEntraIDAppForInteractiveLogin `
-ApplicationName "PnP.PowerShell-AdminSites" `
-Tenant $tenant
$result
Qué ocurrirá:
- Se abrirá una ventana de login para que inicies sesión con tu cuenta de administrador.
- Te pedirá otorgar permisos a la nueva aplicación.
- Al terminar, el objeto
$resultcontendrá datos importantes de la app, incluyendo el ClientId.
Ahora guarda el ClientId que usaremos en el script:
$ClientId = $result.ClientId
$ClientId
Copia el GUID que se muestra (por ejemplo, 00000000-1111-2222-3333-444444444444) y guárdalo en un lugar seguro, ya que lo usaremos en la sección de configuración del script.
Nota: también puedes crear la App Registration manualmente desde el portal de Entra ID y luego copiar el Application (client) ID. El resultado es el mismo, siempre que tenga los permisos necesarios para SharePoint.
4. Crear el script de reporte de almacenamiento de sitios de SharePoint
Ahora vamos a crear un script que:
- Se conecta al SharePoint Admin Center.
- Obtiene todos los sitios de SharePoint Online.
- Calcula el almacenamiento usado, la cuota y el porcentaje utilizado.
- Exporta todo a un archivo CSV con marca de tiempo.
4.1. Configuración inicial del script
Crea una carpeta para tus scripts, por ejemplo C:\Scripts, y dentro de ella un archivo llamado AlmacenamientoSharePoint.ps1. Pega el siguiente contenido (ajusta las variables de configuración):
<#
Reporte de almacenamiento por sitio de SharePoint Online
Requisitos:
- PowerShell 7+
- Módulo PnP.PowerShell
- Permisos: SharePoint Admin / Global Admin
#>
# ==== CONFIGURACIÓN ====
# URL del Admin Center de tu tenant (ajusta "tudominio")
$AdminUrl = "https://tudominio-admin.sharepoint.com"
# Tenant (puedes usar el nombre onmicrosoft.com o el GUID del directorio)
$TenantId = "tudominio.onmicrosoft.com"
# ClientId de la App registrada con Register-PnPEntraIDAppForInteractiveLogin
$ClientId = "00000000-1111-2222-3333-444444444444"
# Carpeta donde se guardará el reporte
$OutputFolder = "C:\Reportes\SharePoint"
# Nombre del archivo con marca de tiempo
$TimeStamp = Get-Date -Format "yyyyMMdd_HHmm"
$OutputFile = Join-Path $OutputFolder "SPO_SitesStorage_$TimeStamp.csv"
# Crear carpeta si no existe
if (-not (Test-Path $OutputFolder)) {
New-Item -Path $OutputFolder -ItemType Directory | Out-Null
}
Write-Host "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ] Conectando a $AdminUrl ..." -ForegroundColor Cyan
# ==== CONEXIÓN ====
Connect-PnPOnline -Url $AdminUrl `
-ClientId $ClientId `
-Tenant $TenantId `
-Interactive
Write-Host "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ] Obteniendo sitios de SharePoint..." -ForegroundColor Cyan
# ==== OBTENER SITIOS ====
# -IncludeOneDriveSites:$false => no incluir OneDrive personales
$sites = Get-PnPTenantSite -IncludeOneDriveSites:$false
Write-Host "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ] Sitios encontrados: $($sites.Count)" -ForegroundColor Yellow
# ==== ARMAR REPORTE ====
$report = $sites | Select-Object `
Url,
Title,
Template,
Owner,
@{ Name = "StorageUsed_MB"; Expression = { $_.StorageUsageCurrent } }, # Uso actual en MB
@{ Name = "StorageUsed_GB"; Expression = { [math]::Round($_.StorageUsageCurrent / 1024, 2) } }, # GB aprox
@{ Name = "StorageQuota_MB"; Expression = { $_.StorageQuota } }, # Cuota en MB
@{ Name = "StorageQuota_GB"; Expression = { [math]::Round($_.StorageQuota / 1024, 2) } },
@{ Name = "PercentUsed"; Expression = {
if ($_.StorageQuota -gt 0) {
[math]::Round(($_.StorageUsageCurrent / $_.StorageQuota) * 100, 2)
} else {
0
}
}
},
@{ Name = "LastContentModifiedDate"; Expression = { $_.LastContentModifiedDate } }
# ==== EXPORTAR A CSV ====
Write-Host "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ] Exportando reporte a: $OutputFile" -ForegroundColor Cyan
$report | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
Write-Host "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ] Listo. Archivo generado." -ForegroundColor Green
# ==== OPCIONAL: mostrar los sitios más llenos en pantalla ====
$report | Sort-Object PercentUsed -Descending |
Select-Object -First 10 Url, StorageUsed_GB, StorageQuota_GB, PercentUsed |
Format-Table -AutoSize
# Cerrar sesión PnP
Disconnect-PnPOnline
5. Ejecutar el script y revisar el reporte
Para ejecutar el script:
- Abre PowerShell 7.
- Ve a la carpeta de scripts:
cd C:\Scripts
- Ejecuta el script:
.\AlmacenamientoSharePoint.ps1
Verás en consola los mensajes de avance y una ventana de inicio de sesión para autenticarte. Al finalizar, se generará un archivo CSV en la ruta que definiste, por ejemplo:
C:\Reportes\SharePoint\SPO_SitesStorage_20251204_0959.csvCada fila corresponde a un sitio de SharePoint Online e incluye, entre otros:
- Url: URL del sitio.
- Title: nombre del sitio.
- Owner: propietario principal.
- StorageUsed_MB / StorageUsed_GB: almacenamiento usado.
- StorageQuota_MB / StorageQuota_GB: cuota asignada.
- PercentUsed: porcentaje de uso respecto a la cuota.
- LastContentModifiedDate: última fecha de modificación de contenido.
Con este reporte puedes identificar fácilmente:
- Sitios que están a punto de alcanzar su cuota.
- Sitios que prácticamente no usan almacenamiento.
- Candidatos para limpieza o archivado de contenido.
6. Variantes útiles
6.1 Incluir sitios de OneDrive empresariales
Si también quieres incluir los sitios personales de OneDrive for Business, modifica la línea donde obtenemos los sitios:
# Antes
$sites = Get-PnPTenantSite -IncludeOneDriveSites:$false
# Después
$sites = Get-PnPTenantSite -IncludeOneDriveSites
6.2 Filtrar sitios con porcentaje de uso superior a un umbral
Si solo te interesan los sitios por encima de cierto porcentaje (ejemplo, 80%), puedes agregar este bloque después de crear $report:
$threshold = 80
$critical = $report | Where-Object { $_.PercentUsed -ge $threshold }
$critical | Export-Csv -Path (Join-Path $OutputFolder "SPO_SitesStorage_Criticos_$TimeStamp.csv") `
-NoTypeInformation -Encoding UTF8
Así obtienes un segundo CSV solo con los sitios “en rojo”.
Conclusión
Con unos cuantos comandos de PowerShell y el módulo PnP.PowerShell puedes tener un reporte completo del almacenamiento de todos tus sitios de SharePoint Online, listo para analizar en Excel o Power BI.
Además, al registrar una App en Microsoft Entra ID, dejas preparado el entorno para futuras automatizaciones (limpieza de contenido, monitoreo periódico, alertas, etc.).
Si te interesa, en un siguiente artículo podemos ver cómo programar este script para que se ejecute de forma automática y envíe el reporte por correo cada semana.


