PowerShell para Administradores: Active Directory, Windows Server, Microsoft 365 e Automação de Suporte

Na primeira parte deste guia, vimos como o PowerShell pode ser utilizado para diagnosticar problemas, reparar o Windows e automatizar tarefas comuns.

Agora vamos avançar para um cenário mais profissional.

Em ambientes corporativos, o PowerShell pode ser utilizado para administrar servidores Windows, Active Directory, computadores clientes, usuários, grupos, serviços, Microsoft Entra ID, Microsoft 365, Exchange Online e tarefas de suporte em larga escala.

A grande vantagem está na automação: uma tarefa que levaria vários minutos sendo executada manualmente em dezenas de computadores pode ser transformada em um único script.

Atenção: os exemplos deste artigo são destinados a ambientes de laboratório, testes e administração autorizada. Sempre valide os comandos antes de executá-los em produção e utilize contas com o menor privilégio necessário.

1. O verdadeiro poder do PowerShell para profissionais de TI

O PowerShell deixa de ser apenas uma ferramenta para executar comandos e passa a funcionar como uma verdadeira plataforma de automação.

Imagine precisar:

  • consultar 500 usuários do Active Directory;
  • identificar contas bloqueadas;
  • encontrar computadores inativos;
  • verificar servidores remotamente;
  • reiniciar um serviço em vários servidores;
  • coletar informações de dezenas de máquinas;
  • criar usuários em lote;
  • consultar caixas de correio do Microsoft 365;
  • gerar relatórios automaticamente.

Fazer isso manualmente seria extremamente trabalhoso.

Com PowerShell, muitas dessas tarefas podem ser transformadas em scripts reutilizáveis.

2. PowerShell e Active Directory

Para administrar um domínio tradicional baseado em Active Directory Domain Services (AD DS), o módulo ActiveDirectory oferece diversos cmdlets para consultar e administrar usuários, computadores, grupos e outros objetos.

Entre os mais importantes estão:

Get-ADUser
Get-ADComputer
Get-ADGroup
Get-ADGroupMember
Get-ADOrganizationalUnit
Get-ADDomain
Get-ADDomainController
Search-ADAccount

O Get-ADComputer, por exemplo, permite pesquisar computadores do domínio utilizando filtros, LDAP e diferentes propriedades.

3. Consultando usuários do domínio

Para localizar um usuário:

Get-ADUser -Identity joao.silva

Para consultar propriedades adicionais:

Get-ADUser joao.silva -Properties *

Uma consulta mais organizada:

Get-ADUser joao.silva -Properties Department,Title,EmailAddress |
Select-Object Name,SamAccountName,Department,Title,EmailAddress

Isso é muito útil durante atendimentos de suporte e auditorias internas.

4. Localizando usuários específicos

Pesquisar usuários pelo departamento:

Get-ADUser -Filter "Department -eq 'TI'" |
Select-Object Name,SamAccountName,Department

Pesquisar usuários pelo nome:

Get-ADUser -Filter "Name -like '*Silva*'"

Exportar o resultado:

Get-ADUser -Filter * |
Select-Object Name,SamAccountName,Enabled |
Export-Csv C:\Temp\usuarios.csv -NoTypeInformation -Encoding UTF8

Assim, uma consulta do Active Directory pode ser transformada rapidamente em um relatório.

5. Contas bloqueadas no Active Directory

Um dos comandos mais úteis para suporte:

Search-ADAccount -LockedOut

O cmdlet Search-ADAccount também permite localizar contas desabilitadas, expiradas, inativas, com senha expirada e outros estados.

Para desbloquear um usuário:

Unlock-ADAccount -Identity joao.silva

Boa prática: antes de desbloquear uma conta repetidamente, investigue a causa do bloqueio. Uma senha antiga armazenada em um celular, serviço, tarefa agendada ou computador pode provocar novos bloqueios.

6. Computadores do domínio

Listar computadores:

Get-ADComputer -Filter * |
Select-Object Name

Pesquisar computadores com determinado padrão:

Get-ADComputer -Filter "Name -like 'PC-*'"

Consultar propriedades adicionais:

Get-ADComputer -Identity PC001 -Properties *

Exportar inventário:

Get-ADComputer -Filter * |
Select-Object Name,OperatingSystem,LastLogonDate |
Export-Csv C:\Temp\computadores.csv -NoTypeInformation -Encoding UTF8

7. Encontrando computadores inativos

Uma tarefa comum de administração é identificar máquinas que não apresentam atividade recente.

Por exemplo:

$Data = (Get-Date).AddDays(-90)

Get-ADComputer -Filter * -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt $Data} |
Select-Object Name,LastLogonDate

Para gerar relatório:

$Data = (Get-Date).AddDays(-90)

Get-ADComputer -Filter * -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt $Data} |
Select-Object Name,LastLogonDate |
Export-Csv C:\Temp\computadores-inativos.csv -NoTypeInformation -Encoding UTF8

Importante: LastLogonDate é uma propriedade útil para inventário, mas não deve ser interpretada de forma simplista como uma prova absoluta de que um equipamento está definitivamente fora de uso.

8. Trabalhando com grupos do Active Directory

Consultar membros de um grupo:

Get-ADGroupMember -Identity "Administradores"

Mostrar apenas usuários:

Get-ADGroupMember -Identity "Administradores" |
Where-Object {$_.objectClass -eq "user"}

Exportar membros:

Get-ADGroupMember "Administradores" |
Select-Object Name,SamAccountName,ObjectClass |
Export-Csv C:\Temp\grupo.csv -NoTypeInformation -Encoding UTF8

Isso pode ser muito útil em auditorias de permissões.

9. Descobrindo os controladores de domínio

Para listar os Domain Controllers:

Get-ADDomainController -Filter *

Para descobrir um controlador específico:

Get-ADDomainController -Discover

O cmdlet também permite localizar controladores considerando critérios de serviço, site e versão do Active Directory.

10. PowerShell Remoting: administrando computadores remotamente

Aqui está uma das funcionalidades mais poderosas do PowerShell.

Em vez de acessar fisicamente cada servidor, podemos executar comandos remotamente.

Por exemplo:

Invoke-Command -ComputerName SERVER01 -ScriptBlock {
    Get-Service
}

O Invoke-Command pode executar comandos em computadores remotos e também em vários computadores de uma única vez.

Executando comandos em vários servidores

$Servidores = "SERVER01","SERVER02","SERVER03"

Invoke-Command -ComputerName $Servidores -ScriptBlock {
    Get-Service -Name Spooler
}

Imagine ter 30 servidores e precisar verificar o serviço de impressão.

Em vez de acessar cada servidor individualmente, o PowerShell pode executar a consulta em todos eles.

11. Criando uma sessão persistente

Quando várias operações serão realizadas no mesmo servidor, podemos utilizar New-PSSession.

$Sessao = New-PSSession -ComputerName SERVER01

Depois:

Invoke-Command -Session $Sessao -ScriptBlock {
    Get-ComputerInfo
}

Ao terminar:

Remove-PSSession $Sessao

Uma PSSession mantém uma conexão persistente, permitindo executar vários comandos na mesma sessão.

12. Verificando servidores remotamente

Um script simples:

$Servidores = "SERVER01","SERVER02","SERVER03"

Invoke-Command -ComputerName $Servidores -ScriptBlock {

    [PSCustomObject]@{
        Computador = $env:COMPUTERNAME
        Sistema    = (Get-CimInstance Win32_OperatingSystem).Caption
        MemoriaGB  = [math]::Round(
            (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2
        )
        Uptime     = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
    }

} | Format-Table -AutoSize

Esse tipo de script é excelente para criar uma rotina de inventário rápido de servidores.

13. Windows Server com PowerShell

O PowerShell também permite administrar funções e recursos do Windows Server.

Listar recursos:

Get-WindowsFeature

Consultar um recurso específico:

Get-WindowsFeature -Name Web-Server

Instalar IIS:

Install-WindowsFeature Web-Server -IncludeManagementTools

A Microsoft documenta que Get-WindowsFeature pode consultar recursos local ou remotamente, enquanto Install-WindowsFeature permite instalar funções e recursos do Windows Server.

Simular antes de executar

Uma excelente prática é utilizar:

Install-WindowsFeature Web-Server -WhatIf

O parâmetro -WhatIf ajuda a verificar o que aconteceria sem realizar a alteração.

14. Monitoramento rápido do servidor

Consultar processos:

Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10

Ver memória:

Get-CimInstance Win32_OperatingSystem |
Select-Object @{
    Name="MemoriaLivreGB"
    Expression={[math]::Round($_.FreePhysicalMemory/1MB,2)}
}

Ver discos:

Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object DeviceID,
@{N="TotalGB";E={[math]::Round($_.Size/1GB,2)}},
@{N="LivreGB";E={[math]::Round($_.FreeSpace/1GB,2)}}

15. Eventos do Windows

Para investigar problemas, o PowerShell pode consultar os logs do Event Viewer através do Get-WinEvent.

Por exemplo:

Get-WinEvent -LogName System -MaxEvents 20

Filtrar eventos recentes:

Get-WinEvent -LogName System -MaxEvents 100 |
Where-Object {$_.LevelDisplayName -eq "Error"}

Essa abordagem pode ser muito útil para investigar problemas de serviços, drivers, inicialização e falhas do sistema.

16. PowerShell e Microsoft 365

O gerenciamento moderno do Microsoft 365 pode ser automatizado utilizando diferentes módulos, dependendo do serviço.

Para identidade e recursos expostos pelo Microsoft Graph, a Microsoft disponibiliza o Microsoft Graph PowerShell SDK, que permite administrar identidades e automatizar tarefas em escala.

Para Exchange Online, utiliza-se o módulo ExchangeOnlineManagement e o cmdlet Connect-ExchangeOnline.

17. Microsoft Graph PowerShell

Instalar o SDK:

Install-Module Microsoft.Graph -Scope CurrentUser

Depois:

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

A autenticação solicitará as permissões necessárias.

Importante: permissões do Microsoft Graph dependem do comando utilizado e da configuração do ambiente. Utilize somente os escopos necessários.

A Microsoft recomenda o PowerShell 7 ou posterior para o Microsoft Graph PowerShell SDK.

18. Consultando usuários do Microsoft Entra ID

Depois da autenticação:

Get-MgUser -Top 20

Consultar um usuário:

Get-MgUser -UserId "usuario@empresa.com"

Selecionar informações específicas:

Get-MgUser -UserId "usuario@empresa.com" |
Select-Object DisplayName,UserPrincipalName,AccountEnabled

O Microsoft Graph PowerShell também oferece recursos para pesquisar usuários, contas desabilitadas, licenças e informações de atividade.

19. Exchange Online

Instalar o módulo:

Install-Module ExchangeOnlineManagement

Conectar:

Connect-ExchangeOnline

Ou especificar o usuário:

Connect-ExchangeOnline -UserPrincipalName admin@empresa.com

A autenticação moderna é utilizada pelo Connect-ExchangeOnline, inclusive em ambientes com MFA.

Listar caixas de correio:

Get-EXOMailbox -ResultSize 20

Pesquisar uma caixa específica:

Get-EXOMailbox -Identity usuario@empresa.com

Para Exchange Online, a Microsoft recomenda utilizar os cmdlets Get-EXO* quando houver uma versão equivalente otimizada, como Get-EXOMailbox.

20. Relatório de caixas de correio

Um relatório simples:

Get-EXOMailbox -ResultSize Unlimited |
Select-Object DisplayName,UserPrincipalName,PrimarySmtpAddress |
Export-Csv C:\Temp\mailboxes.csv -NoTypeInformation -Encoding UTF8

Essa técnica pode ser adaptada para criar relatórios periódicos de usuários e recursos do Microsoft 365.

21. Script profissional: inventário de computadores

Agora vamos criar algo mais próximo de uma rotina real de suporte.

$Computadores = Get-ADComputer -Filter * |
Where-Object {$_.Enabled -eq $true}

$Relatorio = foreach ($Computador in $Computadores) {

    try {

        $Info = Invoke-Command -ComputerName $Computador.Name -ScriptBlock {

            $OS = Get-CimInstance Win32_OperatingSystem
            $CS = Get-CimInstance Win32_ComputerSystem

            [PSCustomObject]@{
                Computador = $env:COMPUTERNAME
                Sistema = $OS.Caption
                Versao = $OS.Version
                MemoriaGB = [math]::Round(
                    $CS.TotalPhysicalMemory / 1GB, 2
                )
            }

        } -ErrorAction Stop

        $Info

    }
    catch {

        [PSCustomObject]@{
            Computador = $Computador.Name
            Sistema = "Não acessível"
            Versao = ""
            MemoriaGB = ""
        }
    }
}

$Relatorio |
Export-Csv C:\Temp\inventario.csv -NoTypeInformation -Encoding UTF8

O que esse script faz?

  1. Consulta os computadores habilitados no Active Directory.
  2. Tenta conectar remotamente.
  3. Coleta informações do sistema.
  4. Captura memória instalada.
  5. Identifica computadores inacessíveis.
  6. Exporta tudo para CSV.

Esse é um exemplo clássico de como transformar várias tarefas manuais em uma única rotina.

22. Script para verificar serviços em vários servidores

$Servidores = Get-Content C:\Temp\servidores.txt

$Resultado = foreach ($Servidor in $Servidores) {

    Invoke-Command -ComputerName $Servidor -ScriptBlock {

        Get-Service |
        Where-Object {
            $_.Status -eq "Stopped" -and
            $_.StartType -eq "Automatic"
        } |
        Select-Object @{
            N="Computador"
            E={$env:COMPUTERNAME}
        },Name,DisplayName,Status,StartType

    } -ErrorAction SilentlyContinue
}

$Resultado |
Export-Csv C:\Temp\servicos-parados.csv -NoTypeInformation -Encoding UTF8

Esse script pode ajudar a identificar rapidamente serviços configurados para inicialização automática que estão parados.

23. Script para reiniciar o Spooler em vários computadores

$Computadores = Get-Content C:\Temp\computadores.txt

Invoke-Command -ComputerName $Computadores -ScriptBlock {

    Restart-Service -Name Spooler -Force

    [PSCustomObject]@{
        Computador = $env:COMPUTERNAME
        Servico = "Spooler"
        Status = (Get-Service Spooler).Status
    }

}

Isso pode economizar bastante tempo em ambientes com problemas recorrentes de impressão.

24. Criando scripts mais seguros

Scripts profissionais devem possuir validações.

Em vez de simplesmente executar uma alteração:

Restart-Service Spooler

podemos verificar primeiro:

$Servico = Get-Service Spooler

if ($Servico.Status -eq "Running") {

    Restart-Service Spooler

    Write-Host "Spooler reiniciado com sucesso."

}
else {

    Write-Host "O Spooler já estava parado."

}

Outra prática importante é utilizar:

-WhatIf

quando o cmdlet oferecer suporte.

Por exemplo:

Remove-Item C:\Temp\*.log -WhatIf

Assim, você consegue avaliar a operação antes de efetivamente executá-la.

25. Registrando o que o script fez

Para rotinas administrativas, registrar as operações pode ser extremamente importante.

Uma opção simples:

$Log = "C:\Temp\suporte.log"

"[$(Get-Date)] Início da rotina" |
Out-File $Log -Append

"[$(Get-Date)] Computador: $env:COMPUTERNAME" |
Out-File $Log -Append

"[$(Get-Date)] Usuário: $env:USERNAME" |
Out-File $Log -Append

Você pode utilizar essa estrutura para registrar início, fim, erros e resultados das operações.

26. Criando funções reutilizáveis

Em vez de repetir comandos, transforme rotinas em funções.

function Testar-Servidor {

    param(
        [string]$Servidor
    )

    Test-Connection $Servidor -Count 2 -Quiet
}

Depois:

Testar-Servidor SERVER01

Ou:

Testar-Servidor SERVER02

Esse conceito é fundamental para criar uma biblioteca própria de ferramentas de suporte.

27. Criando seu próprio kit de suporte

Um profissional pode criar uma pasta:

C:\TI\PowerShell\

E organizar seus scripts:

01-Diagnostico-PC.ps1
02-Inventario.ps1
03-Teste-Rede.ps1
04-Servicos.ps1
05-ActiveDirectory.ps1
06-Relatorio-M365.ps1
07-Manutencao.ps1
08-Servidores.ps1

Com o tempo, essa biblioteca pode se transformar em um verdadeiro kit de automação para suporte técnico.

28. Segurança: o que NÃO fazer

PowerShell oferece enorme poder administrativo e deve ser tratado como uma ferramenta de infraestrutura, não apenas como um terminal.

Evite:

Set-ExecutionPolicy Unrestricted

sem entender as implicações.

Também não execute scripts desconhecidos simplesmente porque foram encontrados em fóruns ou redes sociais.

Nunca coloque senhas diretamente no código:

$Senha = "123456"

Prefira mecanismos seguros de autenticação e gerenciamento de credenciais.

Em ambientes Microsoft 365, utilize autenticação moderna e permissões adequadas. O Microsoft Graph PowerShell utiliza autenticação e permissões específicas para cada recurso acessado.

29. Boas práticas para scripts profissionais

Um bom script de PowerShell deve ser:

✔ Legível
Utilize nomes claros para variáveis e funções.

✔ Reutilizável
Evite criar scripts que funcionem somente para uma máquina.

✔ Seguro
Valide entradas e evite operações destrutivas sem confirmação.

✔ Documentado
Explique o objetivo e os requisitos do script.

✔ Registrável
Quando possível, mantenha logs das operações.

✔ Testado
Teste primeiro em laboratório.

✔ Idempotente quando possível
Uma rotina bem projetada deve poder ser executada novamente sem causar alterações desnecessárias.

✔ Menor privilégio
Execute somente com as permissões necessárias.

30. Dicas avançadas para o administrador

Use o pipeline

O grande diferencial do PowerShell está no pipeline:

Get-Process |
Where-Object {$_.CPU -gt 100} |
Sort-Object CPU -Descending

Filtre o mais cedo possível

Em grandes ambientes, prefira filtros no próprio cmdlet quando disponíveis, em vez de trazer milhares de objetos para depois filtrá-los localmente.

Use Select-Object

Get-Process |
Select-Object Name,CPU,Id

Exporte resultados

... | Export-Csv C:\Temp\relatorio.csv -NoTypeInformation

Formate somente no final

Evite usar Format-Table no meio de pipelines que ainda serão processados.

Prefira:

Get-Service |
Where-Object {$_.Status -eq "Running"} |
Export-Csv C:\Temp\servicos.csv -NoTypeInformation

e deixe a formatação visual para o momento de exibir os dados.

PowerShell + Active Directory + Microsoft 365: o verdadeiro ganho

O grande diferencial aparece quando essas tecnologias são combinadas.

Imagine o seguinte cenário:

Um funcionário deixa a empresa.

O administrador poderia precisar:

  1. localizar o usuário no Active Directory;
  2. desabilitar a conta;
  3. remover grupos;
  4. verificar o Microsoft Entra ID;
  5. bloquear acessos;
  6. consultar licenças;
  7. verificar a caixa de correio;
  8. registrar a operação;
  9. gerar um relatório.

Com PowerShell, grande parte desse processo pode ser automatizada, desde que as políticas de segurança e os requisitos de cada ambiente sejam respeitados.

O Microsoft Graph PowerShell foi justamente desenvolvido para ajudar na administração de identidades e automação em escala.

Conclusão

O PowerShell é uma das ferramentas mais valiosas para quem trabalha com infraestrutura, suporte técnico, redes e administração de ambientes Microsoft.

Seu verdadeiro potencial não está apenas em executar comandos isolados, mas em conectar diferentes tecnologias e transformar tarefas repetitivas em processos automatizados.

Active Directory + Windows Server + PowerShell Remoting + Microsoft Graph + Exchange Online + scripts personalizados formam uma combinação extremamente poderosa para o administrador moderno.

Comece com pequenas automações, valide cada etapa em laboratório e, gradualmente, transforme suas tarefas repetitivas em scripts confiáveis.

A melhor automação não é aquela que simplesmente executa muitos comandos; é aquela que reduz trabalho manual sem comprometer segurança, controle e rastreabilidade.

Referência rápida — comandos essenciais

# Active Directory
Get-ADUser
Get-ADComputer
Get-ADGroup
Search-ADAccount
Get-ADDomainController

# Remoting
Invoke-Command
New-PSSession
Enter-PSSession

# Windows Server
Get-WindowsFeature
Install-WindowsFeature
Get-WinEvent

# Diagnóstico
Get-Process
Get-Service
Get-CimInstance
Test-Connection
Test-NetConnection

# Microsoft Graph
Connect-MgGraph
Get-MgUser
Get-MgGroup

# Exchange Online
Connect-ExchangeOnline
Get-EXOMailbox

# Exportação
Export-Csv
Out-File

# Segurança/teste
-WhatIf
-Confirm

Documentação oficial

Para aprofundar os estudos, vale consultar diretamente a documentação do Microsoft Learn, especialmente as referências de PowerShell, Active Directory, Microsoft Graph PowerShell, PowerShell Remoting e Exchange Online PowerShell.

👉 Retorne para Home ou Post

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *