Como gerar relatórios de uso de disco por utilizador em PowerShell
Este tutorial mostra como gerar um relatório de uso de disco por utilizador em PowerShell, útil para auditorias, limpeza de espaço ou para compreender quem consome mais armazenamento. Vais aprender a identificar o proprietário de pastas, somar dimensões recursivamente e exportar um CSV pronto para análise.
Pré-requisitos
- Windows com PowerShell 5.1 ou PowerShell 7+
- Permissões de leitura nas pastas a analisar
- Conhecimento básico de comandos PowerShell e ficheiros CSV
Passo 1: Entender a lógica e preparar o ambiente
Porquê: precisamos listar pastas, obter o proprietário (owner) e calcular a dimensão total dos ficheiros dentro de cada pasta. Para evitar filas lentas, vamos limitar a profundidade ou processar apenas pastas de topo. Cria uma pasta onde guardarás o 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 }
Passo 2: Obter o proprietário de uma pasta
Explicação: usamos Get-Acl para obter o Owner. O Owner vem no formato DOMAIN\User ou MACHINE\User; vamos normalizar apenas o nome do utilizador para agrupamento.
# 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' } }
Passo 3: Calcular a dimensão de uma pasta recursivamente
Explicação: para cada pasta vamos somar o comprimento (Length) dos ficheiros recursivamente. Para desempenho, evita demasiadas operações de I/O; usa -File e -ErrorAction para ignorar ficheiros inacessíveis.
# 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 } }
Passo 4: Agrupar por proprietário e gerar o relatório
Explicação: percorremos cada subpasta do RootPath (profundidade 1 é uma escolha comum), obtemos owner e dimensão, e depois agrupamos por owner. Por fim, exportamos para CSV com dimensões em formato humano e em 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 e somar 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 resumo para CSV (sem a lista de pastas detalhada) $grouped | Select-Object Owner,TotalBytes,TotalMB | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8 # Mostrar no ecrã um exemplo resumido $grouped | Sort-Object -Property TotalBytes -Descending | Format-Table -Property Owner,TotalMB -AutoSize
Passo 5: Lidar com pastas profundas ou grandes (opções avançadas)
Explicação: se tens muitas subpastas ou ficheiros, podes paralelizar ou processar por lotes. Em PowerShell 7+ usa ForEach-Object -Parallel; noutras versões usa jobs. Também podes ignorar pastas com determinados padrões 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 o resultado
Abre o ficheiro CSV no Excel ou com Import-Csv para confirmar. No ecrã deverás ver uma tabela dos Owners com TotalMB. Confirma se os totais coincidem com uma verificação dupla em pastas conhecidas usando Get-FolderSize para uma pasta específica.
# Verificar um 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
Conclusão
Geraste um relatório de uso de disco por utilizador em PowerShell, com owner por pasta, somas em bytes e exportação para CSV. Próximos passos: adicionar mais colunas (datas, número de ficheiros), integrar com um agendamento para relatórios periódicos ou enviar o CSV por e-mail. Dica: se os owners estiverem a aparecer como SID ou 'UNKNOWN', garante permissões e testa Get-Acl manualmente.