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?