Arquivo de Exchange Online - Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT https://paulocostati.com.br/exchange-online/ Mon, 26 May 2025 01:23:16 +0000 pt-BR hourly 1 https://wordpress.org/?v=6.8.1 https://i0.wp.com/paulocostati.com.br/wp-content/uploads/2024/09/Logotipo-empresa-de-programacao-sistemas-e-tecnologia.png?fit=32%2C32&ssl=1 Arquivo de Exchange Online - Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT https://paulocostati.com.br/exchange-online/ 32 32 209994073 Como Criar um Relatório de Usuários Inativos com Licença no Microsoft 365 Usando PowerShell https://paulocostati.com.br/exchange-online/como-criar-um-relatorio-de-usuarios-inativos-com-licenca-no-microsoft-365-usando-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=como-criar-um-relatorio-de-usuarios-inativos-com-licenca-no-microsoft-365-usando-powershell https://paulocostati.com.br/exchange-online/como-criar-um-relatorio-de-usuarios-inativos-com-licenca-no-microsoft-365-usando-powershell/#respond Mon, 26 May 2025 01:23:12 +0000 https://paulocostati.com.br/?p=116 Aprenda a gerar relatórios de usuários inativos no Microsoft 365 com PowerShell e Microsoft Graph. Ideal para administradores que buscam otimizar licenças e automatizar tarefas. Script gratuito disponível no GitHub!

O post Como Criar um Relatório de Usuários Inativos com Licença no Microsoft 365 Usando PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
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:

  1. Abra o PowerShell 7 ou superior como administrador.
  1. Abra o PowerShell 7 ou superior como administrador.
  2. Copie e cole o script ou salve num arquivo .ps1.
  3. Execute o script. Ele vai pedir para você se conectar no Microsoft 365.
  4. Após a conexão, ele vai gerar um relatório HTML na pasta onde você rodou o script.
  5. 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?

O post Como Criar um Relatório de Usuários Inativos com Licença no Microsoft 365 Usando PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
https://paulocostati.com.br/exchange-online/como-criar-um-relatorio-de-usuarios-inativos-com-licenca-no-microsoft-365-usando-powershell/feed/ 0 116
Calendário do Outlook bagunçado? Veja como identifiquei e corrigi conflitos de reunião em massa com PowerShell https://paulocostati.com.br/exchange-online/calendario-do-outlook-baguncado-veja-como-identifiquei-e-corrigi-conflitos-de-reuniao-em-massa-com-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=calendario-do-outlook-baguncado-veja-como-identifiquei-e-corrigi-conflitos-de-reuniao-em-massa-com-powershell Sun, 04 May 2025 00:14:08 +0000 https://paulocostati.com.br/?p=111 Fala Pessoa, tudo bem com vocês? Se você já perdeu tempo resolvendo reunião que não aparece, convite que some, horário que muda sozinho ou conflito de sala, este artigo é pra você. Eu te mostro como rastrear, diagnosticar e corrigir eventos de calendário bugados no Exchange/Outlook com PowerShell. Nada de clicar em mil caixas, nada […]

O post Calendário do Outlook bagunçado? Veja como identifiquei e corrigi conflitos de reunião em massa com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
Fala Pessoa, tudo bem com vocês?

Se você já perdeu tempo resolvendo reunião que não aparece, convite que some, horário que muda sozinho ou conflito de sala, este artigo é pra você. Eu te mostro como rastrear, diagnosticar e corrigir eventos de calendário bugados no Exchange/Outlook com PowerShell.

Nada de clicar em mil caixas, nada de adivinhar. Aqui é tiro certo.

O cenário: caos no calendário

Um usuário muda o horário da reunião. Outro responde “Aceitar” depois da alteração. A sala confirma o horário antigo. Resultado?

  • Reunião duplicada
  • Sala ocupada em horário errado
  • Gente indo pra call errada
  • Suporte virando psicólogo

A culpa é de quem? De ninguém. Ou melhor, de todo mundo. Mas o admin tem que resolver.

A arma secreta: Get-CalendarDiagnosticLog

Com esse cmdlet do Exchange, você pode ver:

  • Quem criou o evento
  • Quem alterou e quando
  • Qual cliente (Outlook, Mobile, Teams) causou conflito
  • Se o delegate ferrou tudo sem querer
$usuario = "contoso@contoso.com"
$data = Get-Date
Get-CalendarDiagnosticLog -Identity $usuario -StartDate $data.AddDays(-7) -EndDate $data |
Where-Object { $_.Subject -like "*reunião*" } |
Select Subject, Organizer, GlobalObjectId, IsMeeting, IsCancelled, LastModifiedTime, Client, CleanGlobalObjectId

Quer saber se o Teams comeu o convite? Tá lá. Quer saber se o usuário alterou via celular às 2 da manhã? Também tá lá.

Bônus: como cancelar o evento bugado via PowerShell

Se você achou o evento com problema, use Microsoft Graph ou EWS para cancelar a reunião com aviso pros convidados.
Quer script que faz isso com escolha de ID? Me chama.


Conclusão: pare de ser reativo

Se você ainda resolve problema de calendário “olhando o Outlook do usuário”, você está brincando de suporte. Admin de verdade investiga com logs e resolve com script.

Esse tipo de script aqui já me salvou em ambiente com mais de 100 mil caixas no Exchange Online.

O post Calendário do Outlook bagunçado? Veja como identifiquei e corrigi conflitos de reunião em massa com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
111
Como Gerar Relatório de Uso de Licenças no Microsoft 365 com PowerShell https://paulocostati.com.br/microsoft-365/como-gerar-relatorio-de-uso-de-licencas-no-microsoft-365-com-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=como-gerar-relatorio-de-uso-de-licencas-no-microsoft-365-com-powershell Sat, 26 Apr 2025 11:25:46 +0000 https://paulocostati.com.br/?p=105 Aprenda como gerar um relatório detalhado sobre o uso de licenças no Microsoft 365 com PowerShell. Neste tutorial, você vai entender como listar as licenças atribuídas aos usuários, identificar quais SKUs estão sendo utilizadas e exportar os dados para um arquivo CSV. Ideal para administradores que precisam monitorar o consumo de licenças de forma eficiente e automatizada.

O post Como Gerar Relatório de Uso de Licenças no Microsoft 365 com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
Fala pessoal, tudo bem com vocês?

Se você trabalha administrando Microsoft 365, com certeza já passou pela situação de ter que descobrir quem está usando quais licenças — seja pra controle de custos, planejamento ou só pra entender o que realmente está sendo usado.

Esse script aqui vai salvar teu tempo (e tua paciência também rsrs).

O que esse script faz?

  • Lista todos os usuários que possuem determinadas licenças específicas
  • Mostra o nome de usuário, SKU da licença e o nome da licença
  • Exporta tudo pra um arquivo .csv bonitinho
  • Tudo automatizado, sem sofrimento

O que você precisa pra rodar?

  • Ter o módulo Microsoft.Graph instalado
  • Ter permissão pra rodar consultas com Directory.Read.All
  • Uma conta com acesso de admin no Microsoft 365

Bora lá pro código:

#
.DESCRIPTION
    Criar relatório de licenças usadas via PowerShell
#>

Install-Module -Name Microsoft.Graph -Force

Connect-MgGraph -Scopes "Directory.Read.All"

Get-MgSubscribedSku | Select-Object SkuId, SkuPartNumber

# Aqui você coloca as SKUs que quer rastrear

$skuid = @(
    "f8a1db68-be16-40ed-86d5-cb42ce701560", # POWER_BI_PRO
    "f30db892-07e9-47e9-837c-80727f46fd3d", # FLOW_FREE
    "606b54a9-78d8-4298-ad8b-df6ef4481c80", # CCIBOTS_PRIVPREV_VIRAL
    "c42b9cae-ea4f-4ab7-9717-81576235ccac", # DEVELOPERPACK_E5
    "3f9f06f5-3c31-472c-985f-62d9c10ec167", # Power_Pages_vTrial_for_Makers
    "8c4ce438-32a7-4ac5-91a6-e22ae08d9c8b", # RIGHTSMANAGEMENT_ADHOC
    "5b631642-bd26-49fe-bd20-1daaa972ef80"  # POWERAPPS_DEV
)

$users = Get-MgUser -All

$usersL= @()

foreach ($user in $users) {
    $userslicenses = Get-MgUserLicenseDetail -UserId $user.Id

    foreach ($licenca in $userslicenses) {
        if ($skuid -contains $licenca.SkuId) {
            $usersL += [PSCustomObject]@{
               Nome        = $user.UserPrincipalName
               Licenca     = $licenca.SkuId
               NomeLicenca = $licenca.SkuPartNumber
            }
        }
    }
}

$usersL | Export-Csv -Path "C:\Temp\LicencasUsuarios.csv" 

Write-Host "Relatório gerado com sucesso: C:\Temp\LicencasUsuarios.csv" -ForegroundColor Green

Disconnect-Graph

Qual a parte boa aqui?

  • Você não precisa sair catando usuário por usuário.
  • Pode rodar o script sempre que quiser atualizar o relatório.
  • O resultado vai direto pro C:\Temp\LicencasUsuarios.csv — se quiser, é só abrir no Excel.

Administrar sem automação é pedir pra sofrer, né? Script simples assim vira ouro no dia a dia.
Se curtiu, compartilha com teu time. E fica de olho aqui no blog — vem muito mais coisa útil por aí! 🚀

O post Como Gerar Relatório de Uso de Licenças no Microsoft 365 com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
105
Como Automatizar a Desativação de Usuários no Microsoft 365 com PowerShell https://paulocostati.com.br/exchange-online/como-automatizar-a-desativacao-de-usuarios-no-microsoft-365-com-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=como-automatizar-a-desativacao-de-usuarios-no-microsoft-365-com-powershell Mon, 21 Apr 2025 18:49:07 +0000 https://paulocostati.com.br/?p=84 Fala pessoal, tudo bem com vocês? Hoje vamos falar sobre um processo que todo administrador de TI já passou: o desligamento de um colaborador. E eu não estou falando só de cortar o acesso ao computador, mas de todos os outros serviços que o usuário utiliza no Microsoft 365: e-mail, Teams, OneDrive, licenças e por […]

O post Como Automatizar a Desativação de Usuários no Microsoft 365 com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
Fala pessoal, tudo bem com vocês?

Hoje vamos falar sobre um processo que todo administrador de TI já passou: o desligamento de um colaborador. E eu não estou falando só de cortar o acesso ao computador, mas de todos os outros serviços que o usuário utiliza no Microsoft 365: e-mail, Teams, OneDrive, licenças e por aí vai.

Você já deve ter passado pela situação de ter que desativar um usuário no Microsoft 365 e fazer isso manualmente: bloquear login, remover licenças, configurar resposta automática, redirecionar e-mails… Tudo isso toma tempo e, na maioria das vezes, envolve alguns passos que podem ser esquecidos.

E se eu te dissesse que dá pra automatizar tudo isso com um simples script em PowerShell?

O que o script vai fazer

Aqui está a magia: com um script simples, vamos:

E, claro, gerar um log local de tudo o que foi feito

  • Bloquear o login do usuário
  • Remover as licenças do Microsoft 365
  • Configurar a mensagem de ausência automática no Outlook
  • Redirecionar os e-mails para o gestor
  • Desabilitar o MFA (caso o colaborador tenha)

O Script para fazer isso

Aqui está o código que vai fazer todo o trabalho pesado:

param(
    [Parameter(Mandatory)]
    [string]$EmailUsuario,

    [Parameter(Mandatory)]
    [string]$EmailGestor
)

Connect-MgGraph -Scopes "User.ReadWrite.All", "Mail.ReadWrite", "Organization.Read.All"
Update-MgUser -UserId $EmailUsuario -AccountEnabled:$false
$usuario = Get-MgUser -UserId $EmailUsuario
$usuario.AssignedLicenses | ForEach-Object {
    Set-MgUserLicense -UserId $EmailUsuario -RemoveLicenses $_.SkuId -AddLicenses @()
}
#Aqui você pode colocar uma msg de ausencia 
$mensagem = "Este colaborador não faz mais parte da empresa. Em caso de urgência, contate $EmailGestor."
Set-MailboxAutoReplyConfiguration -Identity $EmailUsuario -AutoReplyState Enabled -InternalMessage $mensagem -ExternalMessage $mensagem

#Nessa parte aqui ta redirecionando para o gestor
Set-Mailbox -Identity $EmailUsuario -ForwardingSMTPAddress $EmailGestor -DeliverToMailboxAndForward $false

$authMethods = Get-MgUserAuthenticationMethod -UserId $EmailUsuario
foreach ($method in $authMethods) {
    Remove-MgUserAuthenticationMethod -UserId $EmailUsuario -AuthenticationMethodId $method.Id
}

#aqui fica o log, é sempre importante guardar logs rsrs
$log = "[{0}] Usuário $EmailUsuario desativado, e-mail redirecionado para $EmailGestor" -f (Get-Date)
Add-Content -Path "C:\Temp\Log_Desativacoes.txt" -Value $log

Write-Host "Processo de desativação concluído para $EmailUsuario"

Como usar

Basta salvar o script em um arquivo .ps1 (ex: Desativar-Usuario.ps1) e rodar com os parâmetros necessários:

.\Desativar-Usuario.ps1 -EmailUsuario "zeca@paulocostati.com.br" -EmailGestor "paulo@paulocostati.com.br"

O PowerShell vai realizar todas as etapas automaticamente. Simples assim.

E agora?

Você pode usar esse script de diversas formas:

  • CSV em lote: Se tiver vários usuários para desativar, pode criar um CSV com as informações e rodar o script para todos de uma vez.
  • Power Automate: Se quiser integrar com o fluxo de trabalho no Microsoft 365, pode disparar o script via Power Automate.
  • Ansible: Tem um ambiente mais complexo? Dá para rodar esse PowerShell automaticamente através de Ansible.

Conclusão

E aí, gostou da ideia de automatizar esse processo? O que antes poderia ser um trabalho manual e demorado, agora pode ser feito de forma rápida e sem erro com apenas um clique.

Esse é o tipo de automação que realmente faz a diferença no dia a dia da administração de TI.

O post Como Automatizar a Desativação de Usuários no Microsoft 365 com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
84