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.

Fiz uma pesquisa sobre ferramentas opensource ou freeware, mas não encontrei nada que fosse simples e prático de implementar.  Não sou nenhum "developer-master-da-nasa" quem me conhece sabe disso... mas com um pouco de criatividade e utilizando corretamente as ferramentas disponíveis (leia-se I.A.) desenvolvi depois de alguns ajustes, pesquisas e tentativas-e-erros um script que é fácil de implementar.

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:

  1. Rodar em Powershell
  2. Saber o IP de um Controlador de Domínio AD.
  3. 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  ;-)   


# #################################################
# Script de Obtém usuarios logados em um Domain Controller via WMI.
# Código: PowerShell
#
# 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

Postagens mais visitadas deste blog

Zabbix // Instalando Zabbix Server v.7.2 (Ubuntu 24.04)

Hyper-V Scripts | Gerenciamento de VM-RAM e VM-DiSK