Administração de Active Directory
Sobre
Olá! Visitante, reunimos aqui, informações sobre como otimizar alguns processos em ambientes que tenham Active Directory, seja em Windows quando em Linux.
Comandos
Para verificar a data de expiração da senha de um usuário específico no Active Directory usando PowerShell, você pode usar o seguinte comando: Esse comando mostra a última vez que a senha foi alterada. Para calcular a expiração, é necessário saber a política de senha (normalmente 90 dias, por exemplo).
- Substitua 'usuario' pelo nome de login ou UPN
Get-ADUser -Identity "usuario" -Properties "PasswordLastSet" | Select-Object Name, PasswordLastSet
Para Verificar se a senha expira ou não (PasswordNeverExpires)
Get-ADUser -Identity "usuario" -Properties "PasswordNeverExpires" | Select-Object Name, PasswordNeverExpires
Scripts
Você pode usar este script PowerShell completo, que calcula exatamente isso com base na política do domínio, porem este este script é para pesquisar usuário por usuário, copie e salve como arquivo .bat e rode como administrador.
@echo off
setlocal ENABLEDELAYEDEXPANSION
:: Solicita o nome do usuário
set /p USERNAME=Digite o login do usuario AD (SamAccountName ou UPN):
:: Executa PowerShell para pegar a expiração da senha
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command ^
"try { ^
Import-Module ActiveDirectory -ErrorAction Stop; ^
$user = Get-ADUser -Identity '%USERNAME%' -Properties 'msDS-UserPasswordExpiryTimeComputed','PasswordNeverExpires'; ^
if ($null -eq $user) { Write-Host 'Usuario nao encontrado.'; exit 1 } ^
if ($user.PasswordNeverExpires) { Write-Host 'A senha deste usuario nunca expira.'; exit 0 } ^
$expira = [datetime]::FromFileTime($user.'msDS-UserPasswordExpiryTimeComputed'); ^
$dias = ($expira - (Get-Date)).Days; ^
Write-Host '----------------------------------------------'; ^
Write-Host 'Usuario: ' $user.SamAccountName; ^
Write-Host 'Expira em: ' $expira.ToString('dd/MM/yyyy HH:mm'); ^
Write-Host 'Dias restantes:' $dias; ^
Write-Host '----------------------------------------------'; ^
} catch { ^
Write-Host 'Erro ao consultar o usuario ou o dominio.' ^
}"
pause
Para listar todos usuários com senha a expirar use este script, copie e salve como arquivo .ps1 e rode como administrador.
# Verifica se módulo ActiveDirectory está disponível
if (-not (Get-Module -ListAvailable -Name ActiveDirectory)) {
Write-Host "O módulo ActiveDirectory não está instalado. Instale o RSAT." -ForegroundColor Red
Read-Host -Prompt "Pressione ENTER para sair"
exit
}
Import-Module ActiveDirectory
# Entrada: número de dias antes da expiração
$dias = Read-Host "Digite o número de dias para listar usuários com senha prestes a expirar"
if (-not [int]::TryParse($dias, [ref]0)) {
Write-Host "Valor inválido. Informe um número inteiro." -ForegroundColor Red
Read-Host -Prompt "Pressione ENTER para sair"
exit
}
$dias = [int]$dias
$hoje = Get-Date
$resultados = @()
Write-Host "`nConsultando usuários do AD...`n" -ForegroundColor Cyan
$usuarios = Get-ADUser -Filter * -Properties msDS-UserPasswordExpiryTimeComputed, PasswordNeverExpires, Enabled, DisplayName, Mail
foreach ($u in $usuarios) {
if ($u.Enabled -and -not $u.PasswordNeverExpires -and $u.'msDS-UserPasswordExpiryTimeComputed') {
$expira = [datetime]::FromFileTime($u.'msDS-UserPasswordExpiryTimeComputed')
$diasRest = ($expira - $hoje).Days
if ($diasRest -ge 0 -and $diasRest -le $dias) {
$resultados += [PSCustomObject]@{
Usuario = $u.SamAccountName
Nome = $u.DisplayName
Email = $u.Mail
ExpiraEm = $expira.ToString("dd/MM/yyyy")
DiasRestantes = $diasRest
}
}
}
}
if ($resultados.Count -eq 0) {
Write-Host "`nNenhum usuario com senha expirando em ate $dias dias." -ForegroundColor Yellow
} else {
Write-Host "`nUsuarios com senha expirando em ate $dias dias:`n" -ForegroundColor Green
$resultados | Sort-Object DiasRestantes | Format-Table -AutoSize
}
# Exportar?
$exportar = Read-Host "`nDeseja exportar os resultados para arquivo? (S/N)"
if ($exportar -match "^[Ss]$") {
$tipo = Read-Host "Escolha o formato: csv ou txt"
$caminho = Read-Host "Digite o caminho completo para salvar (ex: C:\temp\expira.csv) OBS: precisa informar!"
try {
if ($tipo -ieq "csv") {
$resultados | Export-Csv -Path $caminho -Encoding UTF8 -NoTypeInformation
} elseif ($tipo -ieq "txt") {
$resultados | Out-File -FilePath $caminho -Encoding UTF8
} else {
Write-Host "Formato inválido. Nenhum arquivo exportado." -ForegroundColor Red
}
if (Test-Path $caminho) {
Write-Host "Arquivo exportado para: $caminho" -ForegroundColor Cyan
}
} catch {
Write-Host "Erro ao exportar: $_" -ForegroundColor Red
}
}
Write-Host "`nConsulta finalizada." -ForegroundColor Cyan
Read-Host -Prompt "`nPressione ENTER para sair"
- O que ele faz:
Pergunta quantos dias quer buscar;
Carrega todos os usuários do AD;
Ignora usuários desabilitados ou com senha que nunca expira;
Calcula quantos dias faltam para expirar;
Pergunta se quer exportar para um arquivo csv ou txt