Publicado en

Cómo obtener el almacenamiento de los sitios de SharePoint Online con PowerShell y PnP

SharePoint Online

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á:

  1. Se abrirá una ventana de login para que inicies sesión con tu cuenta de administrador.
  2. Te pedirá otorgar permisos a la nueva aplicación.
  3. Al terminar, el objeto $result contendrá 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:

  1. Abre PowerShell 7.
  2. Ve a la carpeta de scripts:
cd C:\Scripts
  1. 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.csv

Cada 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”.


SharePoint

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tiempo excedido. Por favor completa el captcha nuevamente

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.