Encuentra todos los usuarios bloqueados (o con fallas de autenticacion) y guarda un log en .\eventos
function show-progressbar([int]$actual,[int]$completo,[string]$status,[string]$Activity) | |
{ | |
$porcentaje=($actual/$completo)*100 | |
if (!$status){ | |
$status="Buscando datos $actual de $completo" | |
} | |
if (!$Activity){ | |
$Activity="Obteniendo Resultados" | |
} | |
Write-Progress -Activity $Activity -status $status -percentComplete $porcentaje | |
} | |
############################################################### | |
# Ya explique esta funcion en este post # | |
# https://powershelleando.com.ar/2014/05/30/show-progressbar/ # | |
############################################################### | |
import-module activedirectory | |
$logcompleto=@() | |
$logdcs=@() | |
$cuentadc=1 | |
# crea una carpeta "Eventos". Si ya existe no hace nada. | |
New-Item -Name eventos -Type directory -Force | |
# Levanta todos los DCs | |
$dcs=Get-ADDomainController -Filter * | |
$dctotal=$dcs.count | |
foreach ($dc in $dcs){ | |
$nombredc=$dc.name | |
# Variable de ayuda para filtrar cuando no hay eventos | |
$sineventos=$false | |
$cuentaeventos=0 | |
# Variable de ayuda para filtrar eventos de no repeticion | |
$mostrar=$true | |
$tipo=" " | |
# Revisando Domain Controller $nombredc - Chequeando disponibilidad. | |
$Status="Revisando Domain Controller $nombredc ($cuentadc de $dctotal)- Chequeando disponibilidad." | |
show-progressbar $cuentadc $dctotal $status | |
$online = Test-Connection $nombredc -Quiet -count 1 | |
if ($online){ | |
# Revisando Domain Controller $nombredc - Recuperando eventos. | |
$Status="Revisando Domain Controller $nombredc ($cuentadc de $dctotal) - Recuperando eventos." | |
show-progressbar $cuentadc $dctotal $status | |
# Get-WinEvent busca en el log de eventos, usamos -FilterXPath | |
#para consultar por eventos especificos, en este caso, indicamos | |
#los dos EventIDs que nos pueden resultar interesantes. | |
# EventID=4740 es el evento de bloqueo de usuario | |
# EventID=4625 es el evento de intento fallido de login | |
$logs=(Invoke-Command -computername $nombredc -ScriptBlock {Get-WinEvent -FilterXml "<QueryList><Query Path='Security'><Select Path='Security'>*[System[(EventID=4740 or EventID=4625)]]</Select></Query></QueryList>" -ErrorAction silentlyContinue} ) | |
if ($logs -eq $null){ | |
# Marca que no hay eventos para acomodar | |
$sineventos=$true | |
$eventostotal=0 | |
} | |
if (!$sineventos){ | |
$eventostotal=$logs.count | |
# Revisa evento por evento | |
foreach ($evento in $logs){ | |
$cuentaeventos+=1 | |
# Revisando Domain Controller $nombredc - cantidad de eventos | |
$Status="Revisando Domain Controller $nombredc ($cuentadc de $dctotal) - Evento numero $cuentaeventos de $eventostotal" | |
show-progressbar $cuentadc $dctotal $status | |
# mensaje tiene la variable message del evento | |
$mensaje=$evento.message | |
$hora=$evento.TimeCreated.ToShortTimeString() | |
$fecha=$evento.TimeCreated.ToShortDateString() | |
$id=$evento.ID | |
$datos=$mensaje.Split("`n") | |
Switch ($id) | |
{ | |
4740{ | |
## CASE 4740 - Bloqueo de un usuario | |
# datos[10] tiene la linea del usuario | |
$usuario=(($datos[10].split("`t"))[3]) | |
# datos[13] tiene la linea del equipo que genero el evento | |
$Maquina=(($datos[13].split("`t"))[2]) | |
$tipo="Bloqueo" | |
## FIN CASE 4740 | |
} | |
4625{ | |
## CASE 4625 - Intento de login fallido | |
## (chequear por si es un error) | |
if ($evento.Providername -eq "Microsoft-Windows-Security-Auditing"){ | |
# datos[12] tiene la linea del usuario | |
$usuario=(($datos[12].split("`t"))[3]) | |
# datos[25] tiene la linea del equipo que | |
#genero el evento | |
$Maquina=(($datos[25].split("`t"))[2]) | |
$tipo="Intento de Login" | |
} | |
else{ | |
$mostrar=$false | |
} | |
## FIN CASE 4625 | |
} | |
default{ | |
## Hubo un error. | |
$usuario="ERROR" | |
$maquina="ERROR" | |
$tipo="ERROR" | |
} | |
} | |
if ($mostrar){ | |
$logcompleto+= $usuario | select-object @{Expression={$usuario};Label="Usuario"},@{Expression={$maquina};Label="Equipo"},@{Expression={$tipo};Label="Evento"},@{Expression={$fecha};Label="Fecha"},@{Expression={$Hora};Label="Hora"},@{Expression={$nombredc};Label="DC"} | |
} | |
} | |
} | |
} | |
else{ | |
# Si el domain controller no esta disponible | |
write-host "El domain controller $nombredc esta OFFLINE" -backgroundcolor "red" -ForegroundColor black | |
} | |
$logDCS+=$cuentadc|select-object @{Expression={$nombredc};Label="DC"}, @{Expression={$online};Label="Online"}, @{Expression={$cuentaeventos};Label="Eventos"} | |
$cuentadc+=1 | |
} | |
# Exporta el log de los usuarios bloqueados a CSV | |
$logcompleto| export-csv ./eventos/Log_Bloqueados.csv | |
# Exporta el log de estado de los DCs a CSV | |
$logdcs | export-csv ./eventos/log_dcs.csv | |
##Fin | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment