Cómo generar informes de uso de disco por usuario en PowerShell
Este tutorial muestra cómo generar un informe de uso de disco por usuario en PowerShell, útil para auditorías, limpieza de espacio o para comprender quién consume más almacenamiento. Aprenderás a identificar el propietario de carpetas, sumar tamaños recursivamente y exportar un CSV listo para análisis.
Requisitos previos
- Windows con PowerShell 5.1 o PowerShell 7+
- Permisos de lectura en las carpetas a analizar
- Conocimientos básicos de comandos PowerShell y archivos CSV
Paso 1: Entender la lógica y preparar el entorno
Por qué: necesitamos listar carpetas, obtener el propietario (owner) y calcular el tamaño total de los archivos dentro de cada carpeta. Para evitar colas lentas, limitaremos la profundidad o procesaremos solo carpetas de nivel superior. Crea una carpeta donde guardarás el CSV final.
# Exemplo: definir pasta alvo e ficheiro de saída $RootPath = 'C:\Compartilhado\Projetos' $OutputCsv = 'C:\Relatorios\UsoPorUtilizador.csv' # Criar pasta de output se não existir $OutDir = Split-Path $OutputCsv if (-not (Test-Path $OutDir)) { New-Item -Path $OutDir -ItemType Directory | Out-Null }
Paso 2: Obtener el propietario de una carpeta
Explicación: usamos Get-Acl para obtener el Owner. El Owner viene en el formato DOMAIN\User o MACHINE\User; normalizaremos solo el nombre del usuario para el agrupamiento.
# Função para obter proprietário (owner) simplificado function Get-FolderOwner { param([string]$Path) try { $acl = Get-Acl -Path $Path -ErrorAction Stop $owner = $acl.Owner -split '\\' | Select-Object -Last 1 return $owner } catch { return 'UNKNOWN' } }
Paso 3: Calcular el tamaño de una carpeta recursivamente
Explicación: para cada carpeta sumaremos la longitud (Length) de los archivos de forma recursiva. Para rendimiento, evita demasiadas operaciones de E/S; usa -File y -ErrorAction para ignorar archivos inaccesibles.
# Função para calcular dimensão (em bytes) de uma pasta function Get-FolderSize { param([string]$Path) try { $size = Get-ChildItem -Path $Path -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum return ([int64]$size.Sum) } catch { return 0 } }
Paso 4: Agrupar por propietario y generar el informe
Explicación: recorremos cada subcarpeta de RootPath (profundidad 1 es una elección común), obtenemos owner y tamaño, y luego agrupamos por owner. Finalmente, exportamos a CSV con tamaños en formato humano y en bytes.
# Lista de pastas de topo (profundidade 1) $folders = Get-ChildItem -Path $RootPath -Directory -ErrorAction Stop $results = foreach ($f in $folders) { $path = $f.FullName $owner = Get-FolderOwner -Path $path $bytes = Get-FolderSize -Path $path [PSCustomObject]@{ Owner = $owner Path = $path Bytes = $bytes SizeMB = [math]::Round($bytes / 1MB, 2) } } # Agrupar por Owner y sumar Bytes $grouped = $results | Group-Object -Property Owner | ForEach-Object { $totalBytes = ($_.Group | Measure-Object -Property Bytes -Sum).Sum [PSCustomObject]@{ Owner = $_.Name TotalBytes = [int64]$totalBytes TotalMB = [math]::Round($totalBytes / 1MB, 2) Folders = ($_.Group | Select-Object Path,SizeMB) } } # Exportar resumen para CSV (sin la lista de carpetas detallada) $grouped | Select-Object Owner,TotalBytes,TotalMB | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8 # Mostrar en pantalla un ejemplo resumido $grouped | Sort-Object -Property TotalBytes -Descending | Format-Table -Property Owner,TotalMB -AutoSize
Paso 5: Manejar carpetas profundas o grandes (opciones avanzadas)
Explicación: si tienes muchas subcarpetas o archivos, puedes paralelizar o procesar por lotes. En PowerShell 7+ usa ForEach-Object -Parallel; en otras versiones usa jobs. También puedes ignorar carpetas con determinados patrones para acelerar.
# Exemplo simples com -Filter para ignorar pastas temporárias $folders = Get-ChildItem -Path $RootPath -Directory -ErrorAction Stop | Where-Object { $_.Name -notmatch 'temp|cache|bak' }
Verificar el resultado
Abre el archivo CSV en Excel o con Import-Csv para confirmar. En pantalla deberías ver una tabla de los Owners con TotalMB. Confirma si los totales coinciden con una verificación doble en carpetas conocidas usando Get-FolderSize para una carpeta específica.
# Verificar un owner específico no PowerShell Import-Csv -Path $OutputCsv | Where-Object { $_.Owner -eq 'joao' } # Verificar dimensão de uma pasta manualmente Get-FolderSize -Path 'C:\Compartilhado\Projetos\ProjetoX' | %{ $_ } # devolve bytes
Conclusión
Has generado un informe de uso de disco por usuario en PowerShell, con owner por carpeta, sumas en bytes y exportación a CSV. Siguientes pasos: añadir más columnas (fechas, número de archivos), integrar con una programación para informes periódicos o enviar el CSV por correo electrónico. Consejo: si los owners aparecen como SID o 'UNKNOWN', garantiza permisos y prueba Get-Acl manualmente.