Como identificar quantos e quais os usuários logados em um Active Directory (Script PowerShell)
Recentemente houve um "feriado imprensado" e várias empresas clientes ofereceram aos seus colaboradores a oportunidade de trabalharem de modo home-office.
Enquanto eu poderia visualizar facilmente a quantidade de usuários conectados ao firewall, pela identificação de conexões clientes OpenVPN SSL (sim.. eu estou em débito sobre um tutorial de implementação de Firewall OPNsense), eu não tinha como fazer a mesma consulta através do Active Directory.
O script "List-Logged-AD-Users-Now" exibe:
- Quantidade de usuários logados neste instante:
- Lista dos usuários logados no Domínio AD.
- Lista dos usuários logados no Controlador de Domínio do AD.
Os pré-requisitos são:
- Rodar em Powershell
- Saber o IP de um Controlador de Domínio AD.
- Informar as credenciais de acesso deste AD.
Depois disto basta salvar o script "List-Logged-AD-Users-Now.ps1" em uma pasta e a partir do powershell, executá-lo. Há muito mais para melhorias neste script e caso possam melhorar basta deixar seu contato que irei incluir sua contribuição/contato dentro do script.
Fique a vontade para usa-lo e adaptar as suas necessidades,
mas lembre-se de manter as referências da fonte. Muito grato ;-)
#
# Escrito em: 02/05/2025 // Ultima Alteração: 02/05/2025
# Coded: Weverton Lima <weverton@getinfo.net.br>
# Source: AI - ChatGPT3
#
# Utilizar o interpretador do PowerShell: v5.0
# ################################################
#
.DESCRIPTION
Consulta sessões ativas no DC sem depender do módulo ActiveDirectory.
#>
Clear-Host
Write-Host "=== CONSULTA DE USUARIOS LOGADOS NO ACTIVE DIRECTORY ===" -ForegroundColor Blue
# Solicita o IP do DC
$DC_IP = Read-Host "Digite o IP do Domain Controller"
# Função para autenticar no AD (se necessário)
function Get-ADCredentials {
param ([string]$DC_IP)
$tentativas = 0
while ($tentativas -lt 3) {
Write-Host "`n--- Autenticacao no AD ---" -ForegroundColor Cyan
$username = Read-Host "Digite o usuario (DOMINIO\usuario ou usuario@dominio)"
$password = Read-Host "Digite a senha" -AsSecureString
$creds = New-Object System.Management.Automation.PSCredential($username, $password)
try {
$test_conn = Invoke-Command -ComputerName $DC_IP -Credential $creds -ScriptBlock { Get-Date } -ErrorAction Stop
Write-Host "autenticacao bem-sucedida!" -ForegroundColor Green
return $creds
} catch {
Write-Host "Erro de Credenciais - Verifique usuario ou Senha." -ForegroundColor Red
$tentar_novamente = Read-Host "Tentar de novo? (Y/N)"
if ($tentar_novamente -ne "Y") { exit }
$tentativas++
}
}
Write-Host "Numero maximo de tentativas excedido." -ForegroundColor Red
exit
}
# Verifica se precisa de autenticacao
try {
$sessoes = Get-WmiObject -Class Win32_LoggedOnUser -ComputerName $DC_IP -ErrorAction Stop | Select-Object Antecedent -Unique
$credenciais = $null
} catch {
Write-Host "autenticacao necessaria." -ForegroundColor Yellow
$credenciais = Get-ADCredentials -DC_IP $DC_IP
}
# Obtém usuarios logados
try {
if ($credenciais) {
$sessoes = Invoke-Command -ComputerName $DC_IP -Credential $credenciais -ScriptBlock {
Get-WmiObject -Class Win32_LoggedOnUser | Select-Object Antecedent -Unique
} -ErrorAction Stop
} else {
$sessoes = Get-WmiObject -Class Win32_LoggedOnUser -ComputerName $DC_IP | Select-Object Antecedent -Unique
}
# Processa os resultados
$usuarios_logados = @()
foreach ($sessao in $sessoes) {
if ($sessao.Antecedent -match 'Domain="(.+)"\,Name="(.+)"') {
$dominio = $matches[1]
$usuario = $matches[2]
$usuarios_logados += "$dominio\$usuario"
}
}
# Remove duplicatas e exibe
$usuarios_logados = $usuarios_logados | Sort-Object -Unique
Write-Host "`n=== RESULTADOS ===" -ForegroundColor Green
Write-Host "Data e Hora da Consulta: $(Get-Date -Format 'dd/MM/yyyy HH:mm:ss')" -ForegroundColor Cyan
Write-Host "Quantidade de usuarios Logados: $($usuarios_logados.Count)" -ForegroundColor Cyan
Write-Host "`nLista de usuarios Logados:" -ForegroundColor Cyan
$usuarios_logados | ForEach-Object { Write-Host "- $_" }
} catch {
Write-Host "Erro ao consultar usuarios: $_" -ForegroundColor Red
}
Write-Host "`nScript concluido." -ForegroundColor Blue
# ################################################
Comentários
Postar um comentário