Como Criar um Relatório de Usuários Inativos com Licença no Microsoft 365 Usando PowerShell

Fala pessoal, tudo bem com vocês? No post de hoje eu vou mostrar como usar PowerShell para identificar licenças do Microsoft 365 que estão paradas e custando dinheiro à toa para sua empresa.
Recentemente, recebi mensagens de profissionais que reclamam sobre como é difícil controlar essas licenças e evitar gastos desnecessários. A boa notícia? Dá para automatizar isso com PowerShell, e eu vou mostrar como.
Antes de começar, já vou avisar que não é algo super simples, mas é totalmente possível e vai te ajudar demais, especialmente se você não quer perder tempo fazendo isso tudo na mão, todo mês.
Por que identificar licenças ociosas é importante?
Você já parou para pensar quantas licenças do Microsoft 365 sua empresa paga e que não estão sendo usadas? Isso pode representar um gasto enorme todo mês, porque essas licenças ficam ativas mesmo sem uso.
Se o financeiro souber quais licenças estão paradas, pode cancelar essas assinaturas e economizar um bom dinheiro. Além disso, ajuda na segurança, porque menos contas ativas significam menos riscos.
O poder do PowerShell para resolver isso
Com PowerShell, você pode consultar o Microsoft 365, identificar quais usuários têm licença e não acessaram nada nos últimos 90 dias (ou outro período que desejar). Depois, gerar um relatório fácil de entender, em HTML, para mostrar para o financeiro ou seu gestor.
E o melhor: você pode agendar essa verificação para rodar automaticamente, sem precisar lembrar disso todo mês.
Pré-requisitos para rodar o script
Antes de rodar o script que vou mostrar, você precisa ter:
- Uma conta com permissões de administrador no Microsoft 365 (Azure AD).
- PowerShell 7 ou superior instalado na sua máquina.
- O módulo Microsoft.Graph para PowerShell instalado (o script já verifica e instala se não tiver).
- Conexão com a internet ativa.
- Permissão para usar o Microsoft Graph API com o escopo User.Read.All.
O script que faz isso tudo pra você
Abaixo está o script completo. Ele conecta no Microsoft 365, busca os usuários com licenças e que não acessaram os serviços nos últimos 90 dias, e cria um relatório em HTML bem organizado.
<#
.DESCRIPTION
Script para gerar um relatório de usuários do Microsoft 365 que possuem licenças atribuídas, mas não acessaram a conta nos últimos 90 dias.
O relatório é gerado em formato HTML e salvo na pasta atual.
.AUTHOR
Paulo Costa
.EXAMPLE
.\relatorio365lic.ps1
Executa o script para gerar o relatório de usuários inativos com licenças atribuídas.
.PREREQUISITES
- Módulo Microsoft.Graph instalado.
- Permissões de leitura de usuários no Microsoft Graph (User.Read.All).
- PowerShell 7.0 ou superior recomendado.
- Compatível com PowerShell 5.1, mas com limitações de performance.
#>
if (-not (Get-Module -ListAvailable -Name Microsoft.Graph)) {
Write-Host "Módulo Microsoft.Graph não encontrado. Instalando..." -ForegroundColor Yellow
Install-Module Microsoft.Graph -Scope CurrentUser -Force
}
Import-Module Microsoft.Graph
Write-Host "Conectando ao Microsoft Graph..." -ForegroundColor Cyan
Connect-MgGraph -Scopes User.Read.All
$DataCorte = (Get-Date).AddDays(-90)
Write-Host "Buscando usuários com licenças e inativos há mais de 90 dias..." -ForegroundColor Cyan
$usuarios = Get-MgUser -All -Property DisplayName, UserPrincipalName, AssignedLicenses, SignInActivity
$UsuariosInativos = $usuarios | Where-Object {
$_.AssignedLicenses.Count -gt 0 -and (
$_.SignInActivity.LastSignInDateTime -eq $null -or
[datetime]$_.SignInActivity.LastSignInDateTime -lt $DataCorte
)
}
if ($UsuariosInativos.Count -eq 0) {
Write-Host "Nenhum usuário inativo encontrado com licença atribuída." -ForegroundColor Green
exit
}
$htmlReport = @"
<html>
<head>
<title>Relatório de Licenças Microsoft 365 Inativas</title>
<style>
body { font-family: Arial, sans-serif; background-color:#f4f4f4; }
table { border-collapse: collapse; width: 100%; background-color: #fff; }
th, td { padding: 12px; border: 1px solid #ddd; text-align: left; }
th { background-color: #0078d4; color: white; }
tr:hover { background-color: #e1f5fe; }
</style>
</head>
<body>
<h2>Relatório de Licenças Microsoft 365 Inativas (mais de 90 dias)</h2>
<p><strong>Empresa:</strong> Paulo Costa TI</p>
<p><strong>Data:</strong> $(Get-Date -Format 'dd/MM/yyyy')</p>
<p><strong>Gerado por:</strong> $env:USERNAME</p>
<table>
<tr>
<th>Nome</th>
<th>Email</th>
<th>Último Login</th>
</tr>
"@
foreach ($user in $UsuariosInativos) {
$lastSignIn = if ($user.SignInActivity.LastSignInDateTime) {
[datetime]$user.SignInActivity.LastSignInDateTime
} else {
"Nunca"
}
$htmlReport += @"
<tr>
<td>$($user.DisplayName)</td>
<td>$($user.UserPrincipalName)</td>
<td>$lastSignIn</td>
</tr>
"@
}
$htmlReport += @"
</table>
</body>
</html>
"@
$reportPath = Join-Path -Path $PWD -ChildPath "LicencasInativas_$(Get-Date -Format 'yyyyMMdd_HHmmss').html"
$htmlReport | Out-File -FilePath $reportPath -Encoding UTF8
Write-Host "Relatório gerado com sucesso em: $reportPath" -ForegroundColor Green

Exemplo do relatório:

Como usar:
- Abra o PowerShell 7 ou superior como administrador.
- Abra o PowerShell 7 ou superior como administrador.
- Copie e cole o script ou salve num arquivo .ps1.
- Execute o script. Ele vai pedir para você se conectar no Microsoft 365.
- Após a conexão, ele vai gerar um relatório HTML na pasta onde você rodou o script.
- Abra o arquivo HTML no navegador e veja as licenças que estão inativas.
Quer mais scripts prontos e dicas para automatizar seu dia a dia?
Eu tenho uma área especial no meu GitHub onde compartilho scripts PowerShell como esse e outros que vão ajudar muito no seu trabalho, te economizar horas e mostrar seu valor na empresa.
Se liga lá no meu perfil e fique de olho nas novidades. Curte, comenta, compartilha e segue para não perder nada!
Automatizar tarefas com PowerShell é um divisor de águas para quem quer crescer na área de TI e mostrar resultados concretos. Então, bora colocar a mão na massa e parar de perder tempo com tarefas repetitivas?