paulo.costa, Autor em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT https://paulocostati.com.br/author/paulo-costa/ Wed, 04 Feb 2026 21:59:37 +0000 pt-BR hourly 1 https://wordpress.org/?v=6.9.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 paulo.costa, Autor em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT https://paulocostati.com.br/author/paulo-costa/ 32 32 209994073 Exchange Server Security Update KB5071876 – Patch de Segurança que Evita Incidente em Produção https://paulocostati.com.br/microsoft/exchange-server-security-update-kb5071876-patch-de-seguranca-que-evita-incidente-em-producao/?utm_source=rss&utm_medium=rss&utm_campaign=exchange-server-security-update-kb5071876-patch-de-seguranca-que-evita-incidente-em-producao Wed, 04 Feb 2026 21:59:07 +0000 https://paulocostati.com.br/?p=291 A atualização de segurança KB5071876 do Exchange Server corrige falhas importantes que podem causar dor de cabeça em produção, como elevação de privilégio, spoofing e problemas em ambientes híbridos. Não traz recursos novos, mas reduz riscos reais, melhora a estabilidade e evita incidentes, auditorias e investigações desnecessárias. É aquele patch que vale aplicar agora para não perder tempo depois.

O post Exchange Server Security Update KB5071876 – Patch de Segurança que Evita Incidente em Produção apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Exchange Server Security Update KB5071876 – Patch de Segurança que Evita Incidente em Produção

Fala Pessoal, tudo bem com vocês? Hoje vou falar um pouco sobre atualizações do Exchange

Quem administra Exchange Server aprende rápido uma coisa: os problemas mais caros não começam grandes.

Normalmente começam com um log estranho, um erro intermitente no OWA ou aquele alerta que aparece e some. Quando você percebe, já virou incidente, auditoria ou aquela ligação fora do horário.

A KB5071876, liberada em dezembro de 2025, entra exatamente nesse cenário. Ela não traz nada “novo”, mas fecha portas que você não quer deixar abertas.

Essa atualização corrige falhas que não quebram o Exchange imediatamente, mas deixam o ambiente vulnerável.

Estamos falando principalmente de:

  • Elevação de privilégio
  • Spoofing
  • Problemas em ambientes híbridos

É o tipo de coisa que fica invisível… até alguém explorar.

Elevação de privilégio: o problema que vira explicação chata

Sem esse patch, existe a possibilidade de um usuário com acesso limitado conseguir mais permissões do que deveria.

Na prática, isso vira:

  • Acesso indevido
  • Alteração que ninguém sabe quem fez
  • A pergunta clássica: “por que o servidor não estava atualizado?”

A KB5071876 fecha essa brecha.

Spoofing: quando os logs deixam de ajudar

Falha de spoofing é traiçoeira.

Tudo parece normal, mas:

  • Identidade pode ser falsificada
  • Logs ficam pouco confiáveis
  • Autenticação começa a ter comportamento estranho

Quando você realmente precisa investigar algo sério, percebe que o ambiente não está tão confiável assim.

Ambiente híbrido instável também cansa

Se você ainda tem Exchange integrado com Skype for Business, já deve ter visto:

  • Um dia funciona
  • No outro, OWA falha
  • Logs que não ajudam muito

Essa atualização corrige um problema específico nesses cenários híbridos dedicados. Não é nada espetacular, mas para de quebrar.

Por que aplicar agora (e não deixar pra depois)

A dor não é aplicar o patch. A dor é ter que:

  • Parar tudo para investigar incidente
  • Explicar falha em auditoria
  • Resolver problema sob pressão

Esse patch não melhora performance nem muda interface. Ele reduz risco — e isso já basta.

Aplicação: o básico bem feito

Nada fora do padrão do Exchange:

  • Backup antes (sempre)
  • Aplicar a atualização
  • Reiniciar o servidor
  • Validar os serviços

Se você já aplica CU, isso aqui é rotina.

Rodar o Health Checker

.\HealthChecker.ps1 -BuildHtmlReport

Não podemos esquecer do Health Checker rsrs

Checklist rápido pós-patch

  • Serviços do Exchange rodando
  • OWA abrindo normalmente
  • Outlook conectando
  • Logs sem erro estranho
  • Integrações híbridas funcionando

Se passou por isso, dá pra seguir tranquilo.

Fechando

A KB5071876 não é empolgante.
Mas ela cura dores clássicas de quem administra Exchange:

  • Incidente de segurança
  • Auditoria chata
  • Ambiente híbrido instável
  • Investigação que começa tarde demais

É aquele patch que você aplica hoje pra não perder tempo amanhã.

O post Exchange Server Security Update KB5071876 – Patch de Segurança que Evita Incidente em Produção apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
291
Painel Visual no IIS para Monitorar Serviços de Vários Servidores Usando PowerShell https://paulocostati.com.br/powershell/painel-visual-no-iis-para-monitorar-servicos-de-varios-servidores-usando-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=painel-visual-no-iis-para-monitorar-servicos-de-varios-servidores-usando-powershell Fri, 17 Oct 2025 00:09:49 +0000 https://paulocostati.com.br/?p=269 Painel Visual no IIS para Monitorar Serviços de Vários Servidores Usando PowerShell Fala pessoal, tudo bem com vocês? Imagine o […]

O post Painel Visual no IIS para Monitorar Serviços de Vários Servidores Usando PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Painel Visual no IIS para Monitorar Serviços de Vários Servidores Usando PowerShell

Fala pessoal, tudo bem com vocês?

Imagine o cenário mais comum para qualquer administrador de TI: uma infraestrutura em crescimento, dezenas de servidores e a necessidade incessante de garantir o funcionamento de serviços críticos como o IIS (w3svc), Gerenciamento Remoto (WinRM) e Fila de Impressão (Spooler).

O método tradicional—abrir dezenas de sessões RDP, rodar Get-Service manualmente e verificar logs—é ineficiente, insustentável e impossível de escalar. A informação está dispersa e o tempo é perdido em cliques repetitivos.

A solução? Criar uma Central de Comando leve, visual e proativa, utilizando apenas duas ferramentas nativas e poderosas: PowerShell (para automação e coleta de dados) e IIS (para hospedagem e visualização).

Este projeto é dividido em três etapas claras: configurar o servidor central (IIS), enviar dados dos servidores remotos e gerar o painel visual.

1. Configurando o Servidor Central (O Painel IIS)

 

O script inicial prepara o ambiente. Ele instala o IIS, adiciona os recursos necessários e cria a estrutura de pastas que funcionará como a base de dados centralizada, definindo permissões de escrita para garantir que os servidores remotos possam enviar seus logs.

				
					<#
    .DESCRIPTION
    Script para configurar o IIS e preparar o ambiente para o Painel de Serviços.
    .AUTHOR
    Paulo Costa
#>

# Instalar IIS e recursos essenciais
Write-Host "Iniciando a instalação do IIS e componentes básicos..."
Install-WindowsFeature -Name Web-Server,Web-WebServer,Web-Common-Http,Web-Static-Content,Web-Default-Doc,Web-ASP -IncludeManagementTools -Confirm:$false

# Definir Caminhos
$PainelPath = "C:\inetpub\wwwroot\painel"
$LogsPath = "$PainelPath\logs"

# Criar a estrutura de pastas do Painel
if (-not (Test-Path $PainelPath)) { 
    New-Item -Path $PainelPath -ItemType Directory -Force
    Write-Host "Pasta principal do Painel criada: $PainelPath"
}
if (-not (Test-Path $LogsPath)) { 
    New-Item -Path $LogsPath -ItemType Directory -Force
    Write-Host "Pasta de Logs criada: $LogsPath"
}

# Configurar Permissões de Escrita (MUITO IMPORTANTE: Ajuste 'Everyone' conforme sua política de segurança)
Write-Host "Configurando permissões na pasta de Logs para permitir escrita remota..."
$acl = Get-Acl $LogsPath
# Concede permissão de Modificação (Modify) para o usuário 'Everyone'
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone","Modify","ContainerInherit,ObjectInherit","None","Allow")
$acl.SetAccessRule($rule)
Set-Acl $LogsPath $acl

# Criar o arquivo HTML inicial (Placeholder)
$HtmlPath = "$PainelPath\index.html"
@"
<html>
<head><title>Painel de Serviços</title></head>
<body>
    <div style="font-family: monospace; padding: 20px; background-color: #1e1e1e; color: #dcdcdc;">
        <h2>Painel de Serviços - Inicializando...</h2>
        <p>Aguardando a primeira execução do script central para gerar o relatório.</p>
    </div>
</body>
</html>
"@ | Out-File $HtmlPath -Encoding UTF8

Write-Host "IIS configurado e Painel pronto para receber logs!"

				
			

2. O Agente de Coleta Remota (Rodando em Cada Servidor)

Este é o script que transforma cada servidor em um “agente de campo”. Ele verifica o status de uma lista predefinida de serviços e, o ponto crucial, salva o resultado em um arquivo de log nomeado com o nome do próprio computador no caminho de rede centralizado.

Atenção: Agende este script via Task Scheduler para rodar a cada 5 minutos em todos os servidores que você deseja monitorar.

				
					<#
.DESCRIPTION
    Script para verificar o status de serviços essenciais e registrar em log centralizado.
    Gera arquivo TXT com o status atual do servidor, usando o nome da máquina.

.AUTHOR
    Paulo Costa

.VERSION
    1.2
.NOTES
    Este script sobrescreve o arquivo de log a cada execução para fornecer o status mais atual.
    Execução recomendada: via Task Scheduler a cada 15 minutos
#>

[CmdletBinding()]
param(
    [string]$LogDir = '\\NomeServidor\inetpub\wwwroot\painel\logs', 
    [switch]$VerboseOutput
)

## CONFIGURAÇÕES
$ErrorActionPreference = 'Stop'
$InformationPreference = if ($VerboseOutput) { 'Continue' } else { 'SilentlyContinue' }

Write-Information "Iniciando verificação de serviços em $(Get-Date -Format 'dd/MM/yyyy HH:mm:ss')"

$LogPath = Join-Path $LogDir "$env:COMPUTERNAME.txt"

try {
    if (-not (Test-Path $LogDir)) { New-Item -Path $LogDir -ItemType Directory -Force | Out-Null }
    Write-Information "Pasta de logs verificada: $LogDir"
} catch { 
    Write-Error "Não foi possível acessar ou criar a pasta de logs: $_"
    exit 1 
}

try {
    Write-Information "Obtendo e processando dados dos serviços..."
    
    $CurrentTime = Get-Date -Format 'dd/MM/yyyy HH:mm:ss'
    
    $Resultado = Get-Service | 
        Where-Object { 
            # Filtra serviços que estão em status relevante (Running, Stopped, Paused)
            $_.Status -in @('Running', 'Stopped', 'Paused') 
        } | 
        ForEach-Object {
            # Formato de saída exato: Servico;Status;Data
            "$($_.Name);$($_.Status);$CurrentTime" 
        }
    
    Write-Information "Total de logs formatados: $($Resultado.Count)"
    
    $Resultado | Out-File -FilePath $LogPath -Encoding UTF8 -Force
    
    Write-Host "Log de status atualizado com sucesso em $LogPath"

} catch {
    Write-Error "Erro ao obter ou salvar status dos serviços: $_"
    exit 1
}
				
			

 

3. A Central de Processamento (Gerador do Painel HTML)

Este script deve rodar no Servidor IIS (o servidor central) em um intervalo de tempo ligeiramente maior (ex: a cada 5 minutos, garantindo que os logs dos agentes já tenham chegado). Ele lê todos os logs, os consolida e gera o arquivo index.html visualmente aprimorado, utilizando CSS para sinalizar o status de forma clara e imediata.

Script de Geração do Painel HTML

Ao acessar o URL do seu IIS, o administrador tem uma visão instantânea, eliminando a necessidade de RDP. O uso de cores vibrantes sobre o fundo escuro garante que os problemas (vermelho e amarelo) saltem imediatamente aos olhos.

E aí, o que vocês acharam desse painel?

O post Painel Visual no IIS para Monitorar Serviços de Vários Servidores Usando PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
269
Monitore Logon e Logoff no Windows com PowerShell – Versão Melhorada https://paulocostati.com.br/microsoft/monitore-logon-e-logoff-no-windows-com-powershell-versao-melhorada/?utm_source=rss&utm_medium=rss&utm_campaign=monitore-logon-e-logoff-no-windows-com-powershell-versao-melhorada Tue, 30 Sep 2025 11:39:57 +0000 https://paulocostati.com.br/?p=255 Fala pessoal, tudo bem com vocês? No post anterior eu mostrei como usar PowerShell para monitorar e automatizar serviços do […]

O post Monitore Logon e Logoff no Windows com PowerShell – Versão Melhorada apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Fala pessoal, tudo bem com vocês?

No post anterior eu mostrei como usar PowerShell para monitorar e automatizar serviços do Windows.

Agora eu trago uma versão melhorada e mais completa, voltada para quem precisa auditar logons e logoffs de usuários, seja em servidores ou estações de trabalho.


O que essa versão traz de novo

Com esse script você vai conseguir:

  • Coletar eventos de Logon (4624), Logoff (4634) e Logoff de usuário (4647).
  • Definir a quantidade de dias que deseja analisar.
  • Gerar relatórios em dois formatos:
    • CSV – perfeito para Excel ou Power BI.
    • HTML – visual limpo e pronto para abrir no navegador.
  • Obter informações importantes como:
    • Data do evento
    • Usuário
    • Tipo de logon
    • Máquina de origem

Tudo isso de forma automatizada, com mensagens claras durante a execução.


Requisitos

Antes de rodar, verifique:

  • PowerShell 5 ou superior (já vem no Windows 10/11 e Windows Server 2016+).
  • Executar como Administrador (o log de segurança exige permissão elevada).

Como usar

  1. Copie o script abaixo e salve como, por exemplo: C:\\Scripts\\Relatorio-LogonLogoff.ps1
  2. Abra o PowerShell como Administrador.
  3. Execute: .\\Relatorio-LogonLogoff.ps1
  4. Informe o número de dias de eventos que deseja coletar.
  5. O script cria a pasta: C:\\Temp\\LogonLogoff E salva lá os relatórios:
    • Relatorio-Logonlogoff.csv
    • Relatorio-Logonlogoff.html

Script

Write-Host "Iniciando coleta de eventos de Logon/Logoff..." -ForegroundColor Cyan

try {
    [int]$Dias = Read-Host "Quantos dias de eventos você deseja coletar?"
}
catch {
    Write-Host "Entrada inválida. Por favor, insira um número inteiro (ex: 10)." -ForegroundColor Red
    return
}

$OutputFolder = "C:\\Temp\\LogonLogoff"
$OutputCsv = "$OutputFolder\\Relatorio-Logonlogoff.csv"
$OutputHtml = "$OutputFolder\\Relatorio-Logonlogoff.html"

$ReportDate = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
$ComputerName = $env:COMPUTERNAME
$ReportCreator = $env:USERNAME

Write-Host "Verificando/Criando o diretório de saída: $OutputFolder" -ForegroundColor Blue
if (-not (Test-Path $OutputFolder)) {
    try {
        New-Item -Path $OutputFolder -ItemType Directory -Force | Out-Null
        Write-Host "Diretório '$OutputFolder' criado com sucesso!" -ForegroundColor Green
    }
    catch {
        Write-Host "Erro ao criar o diretório. Por favor, verifique suas permissões." -ForegroundColor Red
        return
    }
}

Write-Host "Buscando eventos dos últimos '$Dias' dias..." -ForegroundColor Blue
Write-Progress -Activity "Coletando eventos..." -Status "Isso pode levar alguns minutos..." -PercentComplete 10

try {
    $Events = Get-WinEvent -FilterHashtable @{
        LogName   = 'Security'
        Id        = 4624, 4634, 4647
        StartTime = (Get-Date).AddDays(-$Dias)
    } | Select-Object @{Name='Data do Evento'; Expression={$_.TimeCreated}},
        Id,
        @{Name='Usuário'; Expression={$_.Properties[5].Value}},
        @{Name='Tipo de Logon'; Expression={
            switch ($_.Properties[8].Value) {
                2 { "Interativo (Local)" }
                3 { "Rede" }
                4 { "Batch" }
                5 { "Serviço" }
                7 { "Desbloquear (Tela)" }
                10 { "RemoteInteractive (RDP/Terminal)" }
                default { "Outros" }
            }
        }},
        @{Name='Máquina de Origem'; Expression={$_.Properties[11].Value}}

    Write-Progress -Activity "Coletando eventos..." -Status "Coleta concluída. Salvando relatórios..." -PercentComplete 50

    $Events | Export-Csv -Path $OutputCsv -NoTypeInformation -Delimiter ';'
    Write-Host "Relatório CSV salvo em: $OutputCsv" -ForegroundColor Green

    $HtmlHeader = @"
<head>
    <title>Relatório de Logon/Logoff dos últimos $Dias dias</title>
    <style>
        body { font-family: Arial, sans-serif; background-color: #f4f4f4; color: #333; margin: 20px; }
        h1 { color: #0056b3; text-align: center; }
        .header-info { text-align: center; margin-bottom: 20px; }
        .header-info p { margin: 5px 0; font-size: 14px; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { padding: 12px 15px; text-align: left; border-bottom: 1px solid #ddd; }
        th { background-color: #007bff; color: white; }
        tr:nth-child(even) { background-color: #f9f9f9; }
        tr:hover { background-color: #f1f1f1; }
    </style>
</head>
"@
    $HtmlBody = @"
<body>
    <div class="header-info">
        <h1>Relatório de Logon/Logoff dos últimos $Dias dias</h1>
        <p><strong>Relatório Gerado em:</strong> $ReportDate</p>
        <p><strong>Computador:</strong> $ComputerName</p>
        <p><strong>Criado por:</strong> $ReportCreator</p>
    </div>
"@

    $EventsHtmlTable = $Events | ConvertTo-Html -As Table -Fragment
    $HtmlContent = "<html>" + $HtmlHeader + $HtmlBody + $EventsHtmlTable + "</body></html>"
    $HtmlContent | Out-File -FilePath $OutputHtml -Encoding UTF8

    Write-Host "Relatório HTML salvo em: $OutputHtml" -ForegroundColor Green
    Write-Progress -Activity "Coletando eventos..." -Status "Relatórios prontos!" -PercentComplete 100
    Start-Sleep -Seconds 2
}
catch {
    Write-Host "Ocorreu um erro ao coletar os eventos. Verifique se o script está rodando como Administrador e se você tem eventos de segurança disponíveis." -ForegroundColor Red
}


Resultado

O relatório em HTML final traz uma tabela bem organizada com todos os eventos coletados, pronta para:

  • consulta rápida,
  • envio em relatórios internos,
  • ou até integração em um processo de auditoria.

Conclusão

Esse script deixa o processo de auditoria de logon/logoff muito mais simples e visual.

Se você já faz esse tipo de análise no dia a dia, pode usar essa versão como base e adaptá-la conforme a sua necessidade.

E aí, o que vocês acharam dessa versão melhorada?

Deixem nos comentários como vocês fazem o monitoramento de logon/logoff no ambiente de vocês!

O post Monitore Logon e Logoff no Windows com PowerShell – Versão Melhorada apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
255
Cansado de tarefas manuais? Automatize tudo no Windows Server com PowerShell! https://paulocostati.com.br/windows-server/cansado-de-tarefas-manuais-automatize-tudo-no-windows-server-com-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=cansado-de-tarefas-manuais-automatize-tudo-no-windows-server-com-powershell Sat, 20 Sep 2025 09:00:00 +0000 https://paulocostati.com.br/?p=250 Cansado de tarefas manuais? Automatize tudo no Windows Server com PowerShell! Fala, pessoal, tudo bem com vocês? Se você trabalha […]

O post Cansado de tarefas manuais? Automatize tudo no Windows Server com PowerShell! apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Cansado de tarefas manuais? Automatize tudo no Windows Server com PowerShell!

Fala, pessoal, tudo bem com vocês?

Se você trabalha com administração de servidores, sabe que a rotina pode ser exaustiva. Gerenciar serviços, criar usuários, fazer backups… é um trabalho manual e que consome um tempo enorme. A boa notícia é que o PowerShell chegou para transformar essa rotina! Com ele, você automatiza tarefas repetitivas, economiza tempo e minimiza erros, podendo focar em coisas mais importantes.

Neste post, vou mostrar como automatizar as tarefas mais comuns para você dizer adeus ao trabalho manual.

Gerenciamento de Serviços: Fique no controle!

Manter os serviços essenciais do Windows Server funcionando é fundamental. O PowerShell permite que você gerencie esses serviços facilmente, seja para iniciar, parar ou apenas verificar o status.

  • Verificar o Status: Use Get-Service para ver o status de todos os serviços no servidor. Se quiser checar um específico, como o Windows Update, use Get-Service -Name wuauserv

  • Iniciar ou Parar: Para iniciar ou parar um serviço, os cmdlets são Start-Service e Stop-Service. Por exemplo, para iniciar o Windows Update, o comando é Start-Service -Name wuauserv.

    Para pará-lo, use Stop-Service -Name wuauserv

Scripts que trabalham para você

A cereja do bolo é criar um script que verifica se um serviço está parado e, se estiver, o inicia automaticamente. Isso garante a alta disponibilidade de serviços críticos.

				
					$servico = Get-Service -Name wuauserv
if ($servico.Status -eq 'Stopped') {
    Start-Service -Name wuauserv
    Write-Host "Serviço Windows Update iniciado."
} else {
    Write-Host "O serviço já está em execução."
}
				
			

Onde aplicar essa automação?

Essa automação é super útil para:

  • Garantir que serviços críticos como o SQL Server ou o Exchange estejam sempre em execução.

  • Automatizar a inicialização de serviços após uma reinicialização do servidor.

  • Monitorar e manter a saúde do seu ambiente sem precisar entrar no servidor a todo momento.

O post Cansado de tarefas manuais? Automatize tudo no Windows Server com PowerShell! apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
250
Monitore e Automatize Serviços do Windows com PowerShell https://paulocostati.com.br/windows-server/monitore-e-automatize-servicos-do-windows-com-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=monitore-e-automatize-servicos-do-windows-com-powershell Tue, 16 Sep 2025 23:00:23 +0000 https://paulocostati.com.br/?p=237 Monitore e Automatize Serviços do Windows com PowerShell Fala pessoal, tudo bem com vocês? Já aconteceu de um serviço crítico […]

O post Monitore e Automatize Serviços do Windows com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Monitore e Automatize Serviços do Windows com PowerShell

Fala pessoal, tudo bem com vocês?

Já aconteceu de um serviço crítico parar de funcionar e você descobrir tarde demais?
Neste post, vou te mostrar como monitorar serviços do Windows automaticamente usando PowerShell, gerar relatórios diários e até reiniciar serviços parados — tudo de forma simples, prática e segura.

O que você vai aprender

  • Monitorar serviços essenciais (IIS, SQL Server, Exchange, etc.).

  • Reiniciar serviços automaticamente se eles estiverem parados.

  • Gerar relatórios HTML de status para auditoria.

  • Automatizar a execução diária com Task Scheduler.

				
					<#
.DESCRIPTION
Monitora serviços do Windows, reinicia se estiverem parados e gera relatório HTML.
.AUTHOR
Paulo Costa
.VERSION
1.0
#>

param(
    [String[]]$servicos = @("Spooler", "wuauserv", "BITS"), # Serviços para monitorar, adicione ou remova conforme necessário
    [String]$ReportFolder = "C:\ServiceReports\" # Pasta onde o relatório será salvo
)

if (-not (Test-Path $ReportFolder)) { New-Item -ItemType Directory -Path $ReportFolder -Force | Out-Null }
$ReportFile = Join-Path $ReportFolder ("ServiceReport_" + (Get-Date -Format "yyyyMMdd_HHmmss") + ".html")

$ReportData = @()

foreach ($svc in $servicos) {
    try {
        $servico = Get-Service -Name $svc -ErrorAction Stop
        $statusBefore = $servico.Status

        if ($servico.Status -ne "Running") {
            Start-Service -Name $svc -ErrorAction SilentlyContinue
            Start-Sleep -Seconds 3
            $servico.Refresh()
        }

        $ReportData += [PSCustomObject]@{
            Serviço = $svc
            StatusAnterior = $statusBefore
            StatusDepois  = $servico.Status
            Data    = Get-Date
        }
    } catch {
        $ReportData += [PSCustomObject]@{
            Serviço = $svc
            StatusAnterior = "Erro"
            StatusDepois  = "Erro"
            Data    = Get-Date
        }
    }
}

$Html = $ReportData | Sort-Object Serviço | ConvertTo-Html `
    -Title "Relatório de Serviços - $env:COMPUTERNAME" `
    -PreContent "<h2>Relatório de Serviços do Windows - $env:COMPUTERNAME</h2><p>Gerado em: $(Get-Date)</p>" `
    -PostContent "<p style='font-size:12px;color:gray;'>Script desenvolvido por Paulo Costa</p>"

$Html | Out-File -FilePath $ReportFile -Encoding UTF8
Write-Host "Relatório gerado: $ReportFile" -ForegroundColor Green

				
			

Automatizando a execução

Para rodar diariamente sem intervenção:

  1. Abra Task Scheduler.

  2. Crie Basic Task → Nome: Monitorar Serviços.

  3. Trigger: Daily → Hora desejada.

  4. Action: Start a Program → powershell.exe

    • Add arguments: -File "C:\temp\Services.ps1"

  5. Salve e teste.

Agora você terá relatórios diários automáticos e os serviços sempre monitorados.

O post Monitore e Automatize Serviços do Windows com PowerShell apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
237
Certification Weeks Microsoft & Fast Lane: Treinamento gratuito + Certificação oficial! https://paulocostati.com.br/microsoft/certification-weeks-microsoft-fast-lane-treinamento-gratuito-certificacao-oficial/?utm_source=rss&utm_medium=rss&utm_campaign=certification-weeks-microsoft-fast-lane-treinamento-gratuito-certificacao-oficial Fri, 29 Aug 2025 16:35:21 +0000 https://paulocostati.com.br/?p=220 Certification Weeks Microsoft & Fast Lane: Treinamento gratuito + Certificação oficial! A Microsoft, em parceria com a Fast Lane, está […]

O post Certification Weeks Microsoft & Fast Lane: Treinamento gratuito + Certificação oficial! apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Certification Weeks Microsoft & Fast Lane: Treinamento gratuito + Certificação oficial!

A Microsoft, em parceria com a Fast Lane, está oferecendo a oportunidade perfeita para quem deseja elevar a carreira em TI: treinamentos intensivos, online e gratuitos, com direito a voucher oficial de exame de certificação Microsoft.

Datas e Trilhas Disponíveis

  • Cloud, AI & Security: 22–26 de setembro

  • AI Business Solutions: 29 de setembro–3 de outubro

Pré-requisitos para participar

  • Trabalhar em uma empresa parceira Microsoft

  • Usar e-mail corporativo no cadastro (ex.: @empresa.com.br)

  • Participar de todas as sessões ao vivo (gravações não contam para o voucher)

  • Concluir os labs práticos disponibilizados pela Skillable

  • Apenas 1 voucher por pessoa

Como funciona na prática

  1. Inscreva-se na trilha desejada:

  2. Participe das aulas ao vivo durante a semana do evento

  3. Conclua os laboratórios práticos (Skillable) — acesso por 30 dias

  4. Receba o voucher gratuito por e-mail após validação

  5. Agende seu exame oficial Microsoft e conquiste a certificação

Por que vale a pena?

  • Capacitação com instrutores especialistas

  • Conteúdo atualizado sobre Azure, AI, Segurança, Power Platform, Dynamics 365 e muito mais

  • Hands-on labs para fixação prática

  • Certificação oficial que agrega valor ao currículo

O post Certification Weeks Microsoft & Fast Lane: Treinamento gratuito + Certificação oficial! apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
220
Cansado de caçar logs no Event Viewer? Veja como automatizar relatórios de Logon/Logoff com PowerShell​ https://paulocostati.com.br/windows-server/cansado-de-cacar-logs-no-event-viewer-veja-como-automatizar-relatorios-de-logon-logoff-com-powershell/?utm_source=rss&utm_medium=rss&utm_campaign=cansado-de-cacar-logs-no-event-viewer-veja-como-automatizar-relatorios-de-logon-logoff-com-powershell Wed, 27 Aug 2025 00:07:42 +0000 https://paulocostati.com.br/?p=209 Cansado de caçar logs no Event Viewer? Veja como automatizar relatórios de Logon/Logoff com PowerShell Fala pessoal, tudo bem com […]

O post Cansado de caçar logs no Event Viewer? Veja como automatizar relatórios de Logon/Logoff com PowerShell​ apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>

Cansado de caçar logs no Event Viewer? Veja como automatizar relatórios de Logon/Logoff com PowerShell

Fala pessoal, tudo bem com vocês?
No post de hoje eu vou mostrar como usar PowerShell para gerar relatórios de logon e logoff de usuários no Windows.

Recebi recentemente mensagens de colegas de TI dizendo que estavam com dificuldades para acompanhar os acessos dos usuários em servidores e estações de trabalho. O Event Viewer até guarda tudo, mas vamos combinar: procurar evento por evento é cansativo, manual e nada produtivo.

A boa notícia é que dá para automatizar tudo com PowerShell e ter um relatório claro, pronto para auditorias, segurança ou até para resolver chamados de suporte.

 

Onde estão essas informações?

O Windows registra tudo no Log de Segurança. Para logon e logoff, os eventos principais são:

  • 4624 → Logon realizado com sucesso
  • 4634 → Logoff realizado
  • 4647 → Logoff iniciado pelo próprio usuário

Combinando esses três, conseguimos montar um relatório completo de entradas e saídas.

 

Script em PowerShell – CSV + HTML

Aqui está um script que vai além: ele gera tanto um CSV para análise crua quanto um HTML bem formatado para consulta rápida.

				
					Write-Host "Iniciando coleta de eventos de logon e logoff..." -ForegroundColor Cyan

## aqui você pode alterar para a quantidade de dias e o local de onde salvar
$Dias = 2
$OutputCsv = "C:\Temp\Relatorio-LogonLogoff.csv"
$OutputHtml = "C:\Temp\Relatorio-LogonLogoff.html"

#Pode alterar a quantidade de eventos...
$Events = Get-WinEvent -LogName Security -MaxEvents 100 | Where-Object {
    $_.Id -in 4624,4634,4647 -and $_.TimeCreated -gt (Get-Date).AddDays(-$Dias)
} | Select-Object TimeCreated, Id, @{Name="Usuario";Expression={$_.Properties[5].Value}}, MachineName

# Exporta para CSV
$Events | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8

# Exporta para HTML
$Html = $Events | ConvertTo-Html -Property TimeCreated,Id,Usuario,MachineName -Title "Relatório de Logon/Logoff" | Out-String
$Html | Set-Content $OutputHtml -Encoding UTF8

Write-Host "Relatórios gerados com sucesso:" -ForegroundColor Green
Write-Host "CSV: $OutputCsv"
Write-Host "HTML: $OutputHtml"
				
			

Resultado

 CSV – Para quem precisa importar em Excel ou Power BI.
 HTML – Para abrir no navegador, com visual limpo e fácil de entender.

Como evoluir esse script

Esse é só o começo. Você pode levar a automação ainda mais longe:

  • Enviar o HTML por e-mail diariamente usando Send-MailMessage
  • Agendar no Task Scheduler para rodar automaticamente
  • Centralizar logs de vários servidores e gerar relatórios unificados
  • Integrar com SIEM (Microsoft Sentinel, Splunk, etc.

Conclusão

Com algumas linhas de PowerShell, você já transforma um trabalho manual e chato em um relatório automático e organizado. Isso economiza tempo, dá mais controle sobre o ambiente e facilita auditorias de segurança.

Agora quero saber de vocês:
Hoje, como vocês monitoram logon/logoff no ambiente?
Esse tipo de relatório ajudaria no dia a dia da sua equipe?

Deixa aqui nos comentários que vou adorar saber.

O post Cansado de caçar logs no Event Viewer? Veja como automatizar relatórios de Logon/Logoff com PowerShell​ apareceu primeiro em Paulo Costa TI - Expert Solutions Microsoft | MCSE | MCSA | MCT.

]]>
209
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 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.

]]>
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 […]

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