Automacao do Active Directory com PowerShell

Gerenciar um Active Directory com centenas ou milhares de usuarios manualmente e impraticavel e propenso a erros. O PowerShell oferece cmdlets nativos para automatizar praticamente todas as tarefas administrativas do AD, desde provisionamento de usuarios ate auditoria de contas e gerenciamento de grupos. Este guia apresenta scripts praticos e essenciais que todo administrador Windows deve conhecer para tornar suas operacoes de AD mais eficientes e consistentes.

Provisionamento de Usuarios

Instale o modulo e crie usuarios individuais ou em massa:

# Instalar modulo RSAT (Windows Server)
Install-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory

# Criar usuario individual
New-ADUser -Name "Maria Silva" `
    -SamAccountName "maria.silva" `
    -UserPrincipalName "maria.silva@empresa.local" `
    -GivenName "Maria" `
    -Surname "Silva" `
    -Department "TI" `
    -Title "Analista de Sistemas" `
    -Path "OU=TI,DC=empresa,DC=local" `
    -AccountPassword (ConvertTo-SecureString "SenhaTemp123!" -AsPlainText -Force) `
    -ChangePasswordAtLogon $true `
    -Enabled $true

Para provisionamento em massa, prepare um arquivo CSV e processe-o com pipeline:

# Conteudo do CSV: Name,SamAccountName,UPN,Department,Title
Import-Csv -Path "C:\dados\novos_usuarios.csv" | ForEach-Object {
    $password = ConvertTo-SecureString "SenhaInicial2026!" -AsPlainText -Force
    New-ADUser -Name $_.Name `
        -SamAccountName $_.SamAccountName `
        -UserPrincipalName $_.UPN `
        -Department $_.Department `
        -Title $_.Title `
        -Path "OU=$($_.Department),DC=empresa,DC=local" `
        -AccountPassword $password `
        -ChangePasswordAtLogon $true `
        -Enabled $true

    Write-Host "Usuario criado: $($_.Name)" -ForegroundColor Green
}

Gerenciamento de Grupos

Automatize a criacao de grupos e gerenciamento de membros:

# Criar grupo de seguranca
New-ADGroup -Name "Equipe-DevOps" `
    -GroupScope Global `
    -GroupCategory Security `
    -Path "OU=Grupos,DC=empresa,DC=local" `
    -Description "Equipe de DevOps - Acesso a servidores de producao"

# Adicionar membros ao grupo
Add-ADGroupMember -Identity "Equipe-DevOps" -Members "maria.silva","joao.santos"

# Listar membros de um grupo
Get-ADGroupMember -Identity "Equipe-DevOps" | Select-Object Name, SamAccountName

# Copiar membros de um grupo para outro
Get-ADGroupMember -Identity "Equipe-Dev" |
    ForEach-Object { Add-ADGroupMember -Identity "Equipe-DevOps" -Members $_.SamAccountName }

# Encontrar todos os grupos de um usuario
Get-ADPrincipalGroupMembership -Identity "maria.silva" | Select-Object Name

Para garantir que um grupo contenha exatamente os membros especificados em uma lista, compare e sincronize:

$membrosDesejados = Import-Csv "C:\dados\membros_devops.csv" | Select-Object -ExpandProperty SamAccountName
$membrosAtuais = Get-ADGroupMember -Identity "Equipe-DevOps" | Select-Object -ExpandProperty SamAccountName

# Remover membros que nao estao na lista
$membrosAtuais | Where-Object { $_ -notin $membrosDesejados } |
    ForEach-Object { Remove-ADGroupMember -Identity "Equipe-DevOps" -Members $_ -Confirm:$false }

# Adicionar membros faltantes
$membrosDesejados | Where-Object { $_ -notin $membrosAtuais } |
    ForEach-Object { Add-ADGroupMember -Identity "Equipe-DevOps" -Members $_ }

Relatorios e Auditoria

Gere relatorios essenciais para manter o AD organizado e seguro:

# Contas inativas (sem login ha 90 dias)
$dataLimite = (Get-Date).AddDays(-90)
Search-ADAccount -AccountInactive -DateTime $dataLimite -UsersOnly |
    Select-Object Name, SamAccountName, LastLogonDate |
    Export-Csv "C:\relatorios\contas_inativas.csv" -NoTypeInformation

# Contas bloqueadas
Search-ADAccount -LockedOut | Select-Object Name, SamAccountName, LockedOut |
    Format-Table -AutoSize

# Contas com senha expirada
Search-ADAccount -PasswordExpired | Select-Object Name, SamAccountName |
    Export-Csv "C:\relatorios\senhas_expiradas.csv" -NoTypeInformation

# Usuarios criados nos ultimos 30 dias
$ultimos30dias = (Get-Date).AddDays(-30)
Get-ADUser -Filter { WhenCreated -ge $ultimos30dias } -Properties WhenCreated, Department |
    Select-Object Name, Department, WhenCreated |
    Sort-Object WhenCreated -Descending |
    Format-Table -AutoSize

Automacao e Tarefas Agendadas

Crie scripts completos para tarefas recorrentes e agende sua execucao:

# Script de manutencao semanal - salvar como Manutencao-AD.ps1
$logFile = "C:\logs\manutencao_ad_$(Get-Date -Format 'yyyyMMdd').log"

# Desabilitar contas inativas
$inativas = Search-ADAccount -AccountInactive -DateTime (Get-Date).AddDays(-180) -UsersOnly
foreach ($conta in $inativas) {
    Disable-ADAccount -Identity $conta.SamAccountName
    "$((Get-Date).ToString()) - Desabilitada: $($conta.Name)" | Out-File $logFile -Append
}

# Desbloquear contas automaticamente (opcional)
Search-ADAccount -LockedOut | ForEach-Object {
    Unlock-ADAccount -Identity $_.SamAccountName
    "$((Get-Date).ToString()) - Desbloqueada: $($_.Name)" | Out-File $logFile -Append
}

Write-Host "Manutencao concluida. Log: $logFile"

Agende o script no Task Scheduler via PowerShell:

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -File C:\scripts\Manutencao-AD.ps1"
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 6am
Register-ScheduledTask -TaskName "Manutencao-AD-Semanal" `
    -Action $action -Trigger $trigger -RunLevel Highest `
    -User "EMPRESA\svc-admin" -Password "SenhaServico"

Resumo

O PowerShell transforma a administracao do Active Directory de uma serie de tarefas manuais repetitivas em processos automatizados, consistentes e auditaveis. Com scripts para provisionamento em massa, gerenciamento de grupos, relatorios de seguranca e manutencao automatica, voce reduz erros humanos e libera tempo para atividades estrategicas na administracao da infraestrutura Windows.

Artigos Relacionados