(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como gerar relatórios de uso de disco por utilizador em PowerShell

João Barros 26 de October de 2026 4 min de leitura

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.