🔍 Monitorización de logins Windows con PowerShell: detecta intrusiones antes de que sea tarde

Monitorización de logins Windows con PowerShell: detecta intrusiones antes de que sea tarde

Table of Contents

Monitorización de logins Windows: detecta con PowerShell al atacante que lleva meses dentro de tu PC

Un atacante con credenciales válidas puede permanecer dentro de un sistema durante meses sin ser detectado. La monitorización de logins Windows es la primera línea de defensa para detectarlo a tiempo. En Seguridad en mi PC documentamos cómo implementarla con PowerShell de forma gratuita y automatizada, sin herramientas externas, analizando los eventos de inicio de sesión del registro de seguridad de Windows. Todas las guías sobre protección del sistema están disponibles en la sección de seguridad Windows, y puedes explorar el catálogo completo en artículos de seguridad en Windows.

La monitorización de logins en Windows consiste en analizar los eventos de inicio de sesión del registro de seguridad para detectar accesos no autorizados, ataques de fuerza bruta, credential stuffing o actividad sospechosa en el sistema. En esta guía aprenderás a implementarla con PowerShell de forma gratuita y automatizada, sin necesidad de herramientas externas ni soluciones SIEM de coste elevado.

📅 2026 · 🕐 8 minutos de lectura

Esta guía complementa nuestro artículo sobre cómo endurecer Windows 11 y el hardening de cuentas Windows. Si ya ejecutaste ese script de hardening, la política de auditoría ya está activa en tu sistema.


💡 Resumen rápido

🔍 Monitorización de logins Windows con PowerShell: detecta intrusiones en 5 minutos

Detecta intrusiones, ataques de fuerza bruta, password spraying y uso de credenciales comprometidas usando únicamente PowerShell y la auditoría nativa del registro de seguridad de Windows. Sin herramientas externas ni coste de implantación.

  • ✅ Activa la política de auditoría con auditpol en un comando
  • ✅ Analiza el evento 4624 (login exitoso) y el evento 4625 (login fallido)
  • ✅ Detecta el evento 4740 para cuentas bloqueadas por fuerza bruta activa
  • ✅ Script avanzado: resumen de intentos fallidos por usuario con detección de password spraying
  • ✅ Tarea programada que ejecuta la monitorización en inicio, reinicio y cada hora

¿Qué es la monitorización de logins Windows?

📌 ¿Qué es la monitorización de logins Windows?

💡 Definición rápida Monitorización de logins Windows: Proceso de revisar y analizar los eventos de inicio de sesión del registro de seguridad de Windows para identificar accesos sospechosos, intentos fallidos repetidos, patrones de fuerza bruta, uso de credenciales comprometidas procedentes de filtraciones o accesos desde usuarios o dispositivos desconocidos. Se implementa mediante la política de auditoría nativa de Windows y PowerShell sin instalar software adicional ni soluciones SIEM.

👉 La monitorización de logins Windows detecta intrusiones en tiempo real, identifica ataques de fuerza bruta y password spraying, y mejora la visibilidad de accesos sobre el sistema.

  • ✔ Detecta ataques de fuerza bruta y password spraying mediante el análisis del evento 4625 en el registro de seguridad
  • ✔ Identifica accesos con credenciales comprometidas procedentes de brechas de datos (evento 4624 sin intentos fallidos previos)
  • ✔ Alerta sobre inicios de sesión en horarios anómalos, desde IPs desconocidas o con cuentas de servicio no habituales
  • ✔ Proporciona evidencia forense digital ante incidentes de seguridad para respuesta a incidentes
  • ✔ Detecta escalación de privilegios mediante el evento 4672 (privilegios especiales asignados)

👉 Según el informe Cost of a Data Breach de IBM Security, el tiempo medio de detección de un atacante con credenciales válidas es de 207 días. La monitorización del registro de eventos de inicio de sesión reduce drásticamente ese plazo a minutos u horas.

💡 ¿Qué es el registro de seguridad de Windows?

El registro de seguridad de Windows (Security Event Log) es un componente del sistema operativo que registra automáticamente los eventos relacionados con la seguridad: intentos de inicio de sesión, cambios en políticas de auditoría, accesos a objetos protegidos y modificaciones en privilegios de cuentas. Cada evento tiene un identificador numérico (Event ID) estandarizado: el 4624 para logins exitosos, el 4625 para intentos fallidos y el 4740 para cuentas bloqueadas. Para que estos eventos se registren, la política de auditoría debe estar activa mediante auditpol.

🔗 ¿De dónde vienen las credenciales que usa el atacante para entrar sin dejar rastro?

La mayoría de los accesos no autorizados con credenciales válidas tienen su origen fuera del equipo: un ataque de phishing que engañó al usuario para que entregara su contraseña, una brecha de datos en un servicio externo que expuso sus credenciales en la dark web, o una campaña de credential stuffing que probó combinaciones de usuario y clave filtradas en otras plataformas. El atacante no necesita vulnerar Windows directamente: le basta con usar una contraseña real para que el sistema lo trate como un usuario legítimo. Por eso la monitorización de logins no puede entenderse de forma aislada, sino como parte de una estrategia completa de seguridad online. Consulta nuestra guía completa de seguridad online para proteger tu vida digital en 2026 para ver cómo encajan todas estas capas de protección.


Tipos de ataques que detecta la monitorización de logins Windows

🔍 Tipos de ataques que detecta la monitorización de logins Windows

👉 Cada técnica de ataque documentada en MITRE ATT&CK deja una huella distinta en el registro de eventos de seguridad de Windows:

Tipo de ataqueEvento claveIndicador en el registroTécnica MITRENivel de riesgo
Fuerza bruta4625 repetido+10 eventos 4625/hora por el mismo usuarioT1110.001🔴 Crítico
Password spraying4625 distribuidoMúltiples usuarios distintos, pocos intentos cada unoT1110.003🔴 Crítico
Credenciales robadas (credential stuffing)4624 sin 4625 previosLogin exitoso desde IP desconocida sin intentos fallidosT1078🔴 Crítico
Escalación de privilegios4672Privilegios especiales asignados a cuenta estándarT1068🔴 Alto
Cuenta bloqueada por ataque4740Bloqueo automático tras superar intentos máximosT1110🟠 Alto
Acceso fuera de horario4624Login exitoso en horario no habitual del usuarioT1078🟠 Medio-alto
Movimiento lateral4624 tipo 3Inicio de sesión de red desde otro equipo internoT1021🔴 Crítico
⚠️ El ataque más peligroso no genera evento 4625: el de las credenciales comprometidas

El uso de credenciales comprometidas (técnica MITRE T1078) es el vector más difícil de detectar precisamente porque no genera intentos fallidos: el atacante entra directamente con un inicio de sesión exitoso (evento 4624) usando una contraseña real obtenida de una filtración previa o campaña de credential stuffing. Millones de combinaciones de usuario y contraseña circulan en mercados de la dark web procedentes de brechas en servicios de terceros. Si el usuario reutiliza esa contraseña en Windows, el atacante entra sin llamar a la puerta. La monitorización del evento 4624 desde IPs o dispositivos desconocidos, combinada con la vigilancia activa de si tus credenciales han sido expuestas en brechas de datos, es la única forma de detectar este tipo de intrusión a tiempo. Comprueba si tus credenciales están circulando en la red oscura con nuestra guía sobre cómo rastrear si tus credenciales están expuestas en la dark web.

¿Cómo auditar logins en Windows?

¿Cómo auditar logins en Windows?

⚙️ Requisitos previos

  • ✔ Windows 10 / 11 o Windows Server 2016/2019/2022
  • ✔ PowerShell 5.1 o superior (incluido en Windows 10 y posteriores por defecto)
  • ✔ Permisos de administrador local para activar la política de auditoría
  • ✔ Política de auditoría activa en el registro de seguridad (se configura en el Paso 1)

🛠️ Paso 1: Activar la política de auditoría de logins en Windows

👉 Sin política de auditoría activa, los eventos de inicio de sesión no se registran en el registro de seguridad de Windows. Ejecuta este comando como administrador para activarla:

# Activar auditoria de inicio de sesion (exitos y fallos)
auditpol /set /subcategory:"Logon" /success:enable /failure:enable

# Verificar que la politica de auditoria esta activa
auditpol /get /subcategory:"Logon"

💡 ¿Qué hace auditpol y por qué es necesario?

auditpol es la herramienta de línea de comandos de Windows para gestionar la política de auditoría de seguridad. El parámetro /set /subcategory:"Logon" activa el registro de los eventos de inicio de sesión tanto exitosos (4624) como fallidos (4625) en el registro de seguridad de Windows. Sin este paso, el registro no contiene información de logins y todo el análisis posterior es imposible. El resultado esperado del comando de verificación es Logon: Success and Failure.

👉 Referencia oficial: Audit Logon, Event IDs de seguridad, Microsoft Learn.


🔎 Paso 2: Consultar intentos fallidos con PowerShell

👉 El evento 4625 del registro de seguridad registra cada intento fallido de inicio de sesión en Windows, incluyendo el nombre de usuario, el tipo de login y, en muchos casos, la dirección IP de origen:

# Ver todos los intentos fallidos de inicio de sesion
Get-WinEvent -LogName Security | Where-Object {$_.Id -eq 4625}

# Filtrar los intentos fallidos de las ultimas 24 horas
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4625
    StartTime=(Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Message

🤖 Paso 3: Script básico de detección de accesos sospechosos

👉 Este script analiza el registro de seguridad de Windows y resume los intentos fallidos por usuario, los logins exitosos recientes y las cuentas bloqueadas para detectar patrones de fuerza bruta, password spraying y uso de credenciales comprometidas:

# ============================================================
# MONITORIZACION DE LOGINS WINDOWS - Script PowerShell basico
# Detecta fuerza bruta, password spraying, credenciales
# comprometidas, escalacion de privilegios y movimiento lateral
# ============================================================

# Resumen de intentos fallidos por usuario (ultimas 24h)
Write-Host "=== INTENTOS FALLIDOS POR USUARIO (ultimas 24h) ===" -ForegroundColor Yellow
Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4625
    StartTime=(Get-Date).AddHours(-24)
} | Group-Object {$_.Properties[5].Value} |
Sort-Object Count -Descending |
Select-Object Name, Count | Format-Table -AutoSize

# Logins exitosos recientes (ultimas 24h)
Write-Host "=== LOGINS EXITOSOS RECIENTES (ultimas 24h) ===" -ForegroundColor Green
Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4624
    StartTime=(Get-Date).AddHours(-24)
} | Select-Object TimeCreated,
    @{N='Usuario';E={$_.Properties[5].Value}},
    @{N='TipoLogin';E={$_.Properties[8].Value}},
    @{N='IPOrigen';E={$_.Properties[18].Value}} |
Format-Table -AutoSize

# Cuentas bloqueadas por fuerza bruta (evento 4740)
Write-Host "=== CUENTAS BLOQUEADAS (evento 4740) ===" -ForegroundColor Red
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} `
    -ErrorAction SilentlyContinue |
Select-Object TimeCreated, Message | Format-Table -AutoSize

# Escalacion de privilegios (evento 4672)
Write-Host "=== PRIVILEGIOS ESPECIALES ASIGNADOS (evento 4672) ===" -ForegroundColor Magenta
Get-WinEvent -FilterHashtable @{
    LogName='Security'; Id=4672
    StartTime=(Get-Date).AddHours(-24)
} -ErrorAction SilentlyContinue |
Select-Object TimeCreated,
    @{N='Usuario';E={$_.Properties[1].Value}} |
Format-Table -AutoSize

Write-Host "Monitorizacion de logins Windows completada." -ForegroundColor Cyan

⚙️ Script completo: Monitorización automática con tareas programadas (inicio, reinicio y cada hora)

A continuación encontrarás un script PowerShell completo y unificado que automatiza toda la monitorización de logins Windows: activa la política de auditoría si no estaba activa, ejecuta la detección de patrones sospechosos sobre el registro de seguridad, exporta los resultados a un archivo CSV histórico para análisis forense y crea tres tareas programadas que ejecutan la monitorización en cada inicio, en cada reinicio y cada hora. De esta forma el sistema queda vigilado 24/7 sin intervención manual del usuario.

⚠️ Antes de ejecutar: Este script crea tres tareas programadas en el sistema y un log permanente en C:\Logs\monitor-logins.log más un CSV histórico en C:\Logs\monitor-logins-historico.csv. Es completamente reversible mediante el script de reversión incluido. No ejecutes scripts de fuentes que no conozcas y lee siempre el código antes de pegarlo en PowerShell.

📅 Tareas programadas que crea este script

El script registra tres tareas independientes en el Programador de tareas de Windows. Cada una se ejecuta en un disparador distinto para garantizar la cobertura completa de la monitorización:

Nombre de la tareaDisparadorFrecuenciaPropósito
Monitor-Logins-InicioAl iniciar Windows (-AtStartup)Cada arranque del equipoDetecta intentos durante apagados o reinicios y revisa qué pasó mientras el equipo estaba apagado
Monitor-Logins-LogonAl iniciar sesión cualquier usuario (-AtLogOn)Cada vez que alguien inicia sesiónCaptura el evento de login y verifica si la sesión recién iniciada coincide con un patrón sospechoso reciente
Monitor-Logins-HorariaProgramado cada hora (-RepetitionInterval 1h)24 veces al díaVigilancia continua: revisa el registro cada hora para detectar fuerza bruta, password spraying o accesos anómalos en curso
Cómo funcionan las tareas programadas: Las tres tareas se ejecutan como SYSTEM con privilegios elevados y en modo oculto (sin ventana visible). Cada ejecución añade una línea al CSV histórico con la fecha, el tipo de disparador y el resumen de lo detectado, y escribe los detalles completos en el log de texto. De esta forma siempre tienes un histórico completo para análisis forense en caso de incidente.

📥 Pasos para instalar y activar la monitorización automática

  1. Abre PowerShell como administrador: pulsa la tecla Windows, escribe PowerShell, haz clic derecho sobre Windows PowerShell y selecciona Ejecutar como administrador.
  2. Permite la ejecución de scripts en la sesión actual (no afecta a futuras sesiones):
    Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
  3. Crea la carpeta de scripts del sistema: el script se instalará en C:\Scripts\ para que las tareas programadas lo encuentren siempre en la misma ruta:
    New-Item -ItemType Directory -Path "C:\Scripts" -Force
  4. Crea el archivo del script: abre el Bloc de notas, pega el código que verás más abajo y guárdalo como Monitor-Logins.ps1 directamente en C:\Scripts\. Asegúrate de que el tipo de archivo sea Todos los archivos, no .txt.
  5. Ejecuta el script por primera vez desde PowerShell (esto activará la auditoría, hará la primera detección Y creará las tres tareas programadas):
    C:\Scripts\Monitor-Logins.ps1
  6. Verifica que las tres tareas programadas se crearon correctamente:
    Get-ScheduledTask -TaskName "Monitor-Logins-*"
  7. Revisa el log y el CSV histórico: C:\Logs\monitor-logins.log contiene los resultados detallados y C:\Logs\monitor-logins-historico.csv el resumen de cada ejecución.
  8. Reinicia el equipo: la tarea de inicio se ejecutará automáticamente y comprobarás que el sistema queda monitorizado 24/7.

💻 Script de monitorización automática (copia y pega)

# ============================================================
# Script: Monitorizacion de logins Windows + 3 tareas programadas
# Autor:  seguridadenmipc.com
# Compat: Windows 10 / 11 / Server 2019+
# Uso:    Ejecutar como administrador (1a vez)
#         Despues se ejecuta solo en inicio, logon y cada hora
# Ruta:   C:\Scripts\Monitor-Logins.ps1
# ============================================================

# 1. Verificar privilegios de administrador
if (-not ([Security.Principal.WindowsPrincipal] `
    [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
    [Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "[X] Ejecuta este script como Administrador." -ForegroundColor Red
    exit
}

# 2. Preparar log y CSV historico
$logDir = "C:\Logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir | Out-Null }
$log = "$logDir\monitor-logins.log"
$csv = "$logDir\monitor-logins-historico.csv"
Start-Transcript -Path $log -Append | Out-Null

Write-Host "=== Monitorizacion de logins Windows ===" -ForegroundColor Cyan
Write-Host "Fecha: $(Get-Date)" -ForegroundColor Gray

# 3. Activar politica de auditoria si no esta activa
try {
    auditpol /set /subcategory:"Logon" /success:enable /failure:enable | Out-Null
    Write-Host "[OK] Politica de auditoria de Logon activa." -ForegroundColor Green
} catch { Write-Host "[X] Error en auditpol: $_" -ForegroundColor Red }

# 4. Detectar fuerza bruta: usuarios con +10 fallos en 24h
Write-Host "`n--- Fuerza bruta (4625 +10/usuario en 24h) ---" -ForegroundColor Yellow
$fuerzaBruta = @()
try {
    $eventos4625 = Get-WinEvent -FilterHashtable @{
        LogName='Security'; Id=4625
        StartTime=(Get-Date).AddHours(-24)
    } -ErrorAction SilentlyContinue
    $fuerzaBruta = $eventos4625 | Group-Object {$_.Properties[5].Value} |
                   Where-Object { $_.Count -ge 10 } |
                   Sort-Object Count -Descending
    if ($fuerzaBruta) {
        $fuerzaBruta | Select-Object Name, Count | Format-Table -AutoSize
    } else {
        Write-Host "[OK] Sin patron de fuerza bruta detectado." -ForegroundColor Green
    }
} catch { Write-Host "[!] Sin eventos 4625 en 24h." -ForegroundColor Yellow }

# 5. Detectar password spraying: 5+ usuarios distintos con fallos en 24h
Write-Host "`n--- Password spraying (5+ usuarios distintos con fallos) ---" -ForegroundColor Yellow
$passwordSpray = @()
try {
    if ($eventos4625) {
        $usuariosFallo = $eventos4625 | Group-Object {$_.Properties[5].Value}
        if ($usuariosFallo.Count -ge 5) {
            $passwordSpray = $usuariosFallo
            Write-Host "[!] Posible password spraying: $($usuariosFallo.Count) usuarios afectados." -ForegroundColor Red
            $usuariosFallo | Select-Object Name, Count | Format-Table -AutoSize
        } else {
            Write-Host "[OK] Sin patron de password spraying." -ForegroundColor Green
        }
    }
} catch {}

# 6. Cuentas bloqueadas (4740) en 24h
Write-Host "`n--- Cuentas bloqueadas (4740) en 24h ---" -ForegroundColor Yellow
$bloqueadas = @()
try {
    $bloqueadas = Get-WinEvent -FilterHashtable @{
        LogName='Security'; Id=4740
        StartTime=(Get-Date).AddHours(-24)
    } -ErrorAction SilentlyContinue
    if ($bloqueadas) {
        $bloqueadas | Select-Object TimeCreated,
            @{N='CuentaBloqueada';E={$_.Properties[0].Value}} | Format-Table -AutoSize
    } else {
        Write-Host "[OK] Sin cuentas bloqueadas." -ForegroundColor Green
    }
} catch {}

# 7. Logins exitosos (4624) en 24h con IP origen
Write-Host "`n--- Logins exitosos en 24h (4624) ---" -ForegroundColor Yellow
$loginsOk = @()
try {
    $loginsOk = Get-WinEvent -FilterHashtable @{
        LogName='Security'; Id=4624
        StartTime=(Get-Date).AddHours(-24)
    } -ErrorAction SilentlyContinue |
    Select-Object TimeCreated,
        @{N='Usuario';E={$_.Properties[5].Value}},
        @{N='TipoLogin';E={$_.Properties[8].Value}},
        @{N='IPOrigen';E={$_.Properties[18].Value}}
    if ($loginsOk) {
        Write-Host "[i] $($loginsOk.Count) logins exitosos en 24h." -ForegroundColor Cyan
    }
} catch {}

# 8. Privilegios especiales asignados (4672) en 24h
Write-Host "`n--- Privilegios especiales asignados (4672) en 24h ---" -ForegroundColor Yellow
$privilegios = @()
try {
    $privilegios = Get-WinEvent -FilterHashtable @{
        LogName='Security'; Id=4672
        StartTime=(Get-Date).AddHours(-24)
    } -ErrorAction SilentlyContinue
    if ($privilegios) {
        Write-Host "[i] $($privilegios.Count) eventos 4672 en 24h." -ForegroundColor Cyan
    }
} catch {}

# 9. Anadir resumen al CSV historico
$disparador = if ($args[0]) { $args[0] } else { "Manual" }
$resumen = [PSCustomObject]@{
    Fecha = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
    Disparador = $disparador
    UsuariosFuerzaBruta = $fuerzaBruta.Count
    UsuariosPasswordSpray = $passwordSpray.Count
    CuentasBloqueadas = $bloqueadas.Count
    LoginsExitosos = $loginsOk.Count
    PrivilegiosAsignados = $privilegios.Count
}
$resumen | Export-Csv -Path $csv -Append -NoTypeInformation -Encoding UTF8
Write-Host "[OK] Resumen anadido al CSV historico." -ForegroundColor Green

# 10. Crear las 3 tareas programadas (solo si no existen)
$scriptPath = "C:\Scripts\Monitor-Logins.ps1"

# 10a. Tarea: ejecutar al inicio de Windows
try {
    if (-not (Get-ScheduledTask -TaskName "Monitor-Logins-Inicio" -ErrorAction SilentlyContinue)) {
        $action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
            -Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Inicio"
        $trigger = New-ScheduledTaskTrigger -AtStartup
        $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
            -LogonType ServiceAccount -RunLevel Highest
        $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
            -DontStopIfGoingOnBatteries -StartWhenAvailable `
            -ExecutionTimeLimit (New-TimeSpan -Minutes 5)
        Register-ScheduledTask -TaskName "Monitor-Logins-Inicio" `
            -Action $action -Trigger $trigger -Principal $principal -Settings $settings `
            -Description "Monitorizacion de logins al iniciar Windows - seguridadenmipc.com" | Out-Null
        Write-Host "[OK] Tarea 'Monitor-Logins-Inicio' creada (al arrancar)." -ForegroundColor Green
    } else {
        Write-Host "[i] Tarea 'Monitor-Logins-Inicio' ya existe." -ForegroundColor Cyan
    }
} catch { Write-Host "[X] Error en tarea Inicio: $_" -ForegroundColor Red }

# 10b. Tarea: ejecutar al iniciar sesion cualquier usuario
try {
    if (-not (Get-ScheduledTask -TaskName "Monitor-Logins-Logon" -ErrorAction SilentlyContinue)) {
        $action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
            -Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Logon"
        $trigger = New-ScheduledTaskTrigger -AtLogOn
        $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
            -LogonType ServiceAccount -RunLevel Highest
        $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
            -DontStopIfGoingOnBatteries -StartWhenAvailable `
            -ExecutionTimeLimit (New-TimeSpan -Minutes 5)
        Register-ScheduledTask -TaskName "Monitor-Logins-Logon" `
            -Action $action -Trigger $trigger -Principal $principal -Settings $settings `
            -Description "Monitorizacion de logins al iniciar sesion - seguridadenmipc.com" | Out-Null
        Write-Host "[OK] Tarea 'Monitor-Logins-Logon' creada (al iniciar sesion)." -ForegroundColor Green
    } else {
        Write-Host "[i] Tarea 'Monitor-Logins-Logon' ya existe." -ForegroundColor Cyan
    }
} catch { Write-Host "[X] Error en tarea Logon: $_" -ForegroundColor Red }

# 10c. Tarea: ejecutar cada hora
try {
    if (-not (Get-ScheduledTask -TaskName "Monitor-Logins-Horaria" -ErrorAction SilentlyContinue)) {
        $action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
            -Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Horaria"
        $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5) `
            -RepetitionInterval (New-TimeSpan -Hours 1)
        $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
            -LogonType ServiceAccount -RunLevel Highest
        $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
            -DontStopIfGoingOnBatteries -StartWhenAvailable `
            -ExecutionTimeLimit (New-TimeSpan -Minutes 5)
        Register-ScheduledTask -TaskName "Monitor-Logins-Horaria" `
            -Action $action -Trigger $trigger -Principal $principal -Settings $settings `
            -Description "Monitorizacion de logins cada hora - seguridadenmipc.com" | Out-Null
        Write-Host "[OK] Tarea 'Monitor-Logins-Horaria' creada (cada hora)." -ForegroundColor Green
    } else {
        Write-Host "[i] Tarea 'Monitor-Logins-Horaria' ya existe." -ForegroundColor Cyan
    }
} catch { Write-Host "[X] Error en tarea Horaria: $_" -ForegroundColor Red }

Write-Host "`n[OK] Monitorizacion activa. Disparador: $disparador" -ForegroundColor Green
Write-Host "     Log:    $log" -ForegroundColor Gray
Write-Host "     CSV:    $csv" -ForegroundColor Gray
Stop-Transcript | Out-Null

↩️ Script de reversión (elimina las 3 tareas y desactiva la monitorización)

Si necesitas desactivar la monitorización automática (por ejemplo, para diagnosticar un problema o aplicar una solución de monitorización corporativa distinta), ejecuta este script. Importante: elimina primero las tres tareas programadas, porque si no, la monitorización seguirá ejecutándose en el siguiente arranque o login.

# ============================================================
# Revertir monitorizacion de logins Windows
# ============================================================

# 1. ELIMINAR las 3 tareas programadas
$tareas = @("Monitor-Logins-Inicio", "Monitor-Logins-Logon", "Monitor-Logins-Horaria")
foreach ($t in $tareas) {
    if (Get-ScheduledTask -TaskName $t -ErrorAction SilentlyContinue) {
        Unregister-ScheduledTask -TaskName $t -Confirm:$false
        Write-Host "[OK] Tarea $t eliminada." -ForegroundColor Green
    }
}

# 2. Desactivar la politica de auditoria (NO recomendado: pierdes visibilidad)
# Descomenta solo si quieres desactivar la auditoria por completo:
# auditpol /set /subcategory:"Logon" /success:disable /failure:disable

Write-Host ""
Write-Host "[OK] Monitorizacion desactivada. Tareas programadas eliminadas." -ForegroundColor Green
Write-Host "    Nota: la politica de auditoria sigue activa por seguridad." -ForegroundColor Yellow
Write-Host "    Logs preservados en: C:\Logs\" -ForegroundColor Cyan

⚠️ Riesgos y efectos reales del script

Antes de ejecutar este script conviene entender exactamente qué cambios aplica y qué funciones de Windows pueden verse afectadas. Es un script de solo lectura sobre el registro de seguridad: no modifica configuraciones del sistema, solo activa la auditoría (si no estaba activa) y consulta eventos. La parte intrusiva son las tres tareas programadas que crea, que sí persisten en el sistema hasta que se eliminen.

Función del sistema¿Se ve afectada?Detalle técnico
Inicio de sesión local🟢 NoEl script solo lee el registro; la tarea Logon se ejecuta tras autenticarse, no antes
Inicio de Windows🟢 NoLa tarea Inicio se ejecuta en background tras el arranque, sin bloquearlo
Reinicio / apagado🟢 NoNo modifica el subsistema de apagado ni BCD
UEFI / arranque seguro🟢 NoNo afecta BCD, Secure Boot ni particiones EFI
Banca, Gmail y plataformas web🟢 NoEl script no toca DNS, hosts, proxy ni red en general
Visualización de sitios web🟢 NoEl script solo lee el registro de seguridad y escribe a disco local
Política de auditoría de Logon🟢 Sí (positivo)Se activa la auditoría de Success y Failure (necesaria para que existan los eventos)
Espacio en disco🟡 MínimoEl log y CSV crecen unos KB por ejecución; controla periódicamente C:\Logs\
Carga de CPU🟡 MínimaCada ejecución consulta el registro durante unos segundos en background
Cuentas y contraseñas existentes🟢 NoEl script no modifica usuarios, políticas de contraseñas ni cuentas locales
Software de terceros (antivirus, EDR)🟡 PosibleAlgunos EDR pueden marcar la lectura masiva del registro como actividad anómala (excluye C:\Scripts\ si es necesario)
🚨 Casos en los que conviene revisar antes de ejecutar:
  • Si tu equipo es gestionado por el departamento de IT de una empresa (ya pueden tener una solución SIEM corporativa que entre en conflicto)
  • Si tienes un EDR/XDR corporativo activo (puede marcar las consultas masivas a Get-WinEvent como actividad sospechosa)
  • Si el equipo tiene poco espacio en disco (<10 GB libres): el CSV histórico crece con el tiempo, planifica una limpieza periódica
  • Si la batería del portátil es crítica: aunque las tareas están configuradas para ejecutarse con batería, suman algunas decenas de ejecuciones diarias
En estos casos, ajusta la frecuencia de la tarea horaria (cada 4h o cada 8h) o desactiva alguna de las tres tareas según tu necesidad.
⚠️ Cómo verificar que las tareas programadas funcionan: Abre el Programador de tareas (Win+R → taskschd.msc), busca las tres tareas Monitor-Logins-* en la Biblioteca y revisa el campo "Último resultado" de cada una (debe ser 0x0 = éxito) y la fecha de la última ejecución. También puedes consultar el CSV histórico: Import-Csv C:\Logs\monitor-logins-historico.csv | Select -Last 20 mostrará las últimas 20 ejecuciones con su disparador y resumen.

En equipos domésticos o profesionales sin solución corporativa de monitorización, este script es seguro y proporciona el nivel de visibilidad que recomiendan organismos como CISA, NIST e INCIBE para reducir el tiempo medio de detección de intrusiones de los 207 días de media a minutos u horas.

⚠️ Patrones sospechosos en el registro de eventos y acción recomendada

👉 Identifica rápidamente qué nivel de alerta corresponde a cada patrón detectado en el registro de seguridad de Windows:

Patrón detectado en el registroNivel de alertaAcción recomendada
+10 eventos 4625 en 1 hora (mismo usuario)🔴 CríticoBloquear cuenta, revisar IP de origen, activar política de bloqueo automático
4625 en múltiples usuarios con pocos intentos cada uno🔴 CríticoSospechar password spraying; aislar red y revisar todos los usuarios afectados
4624 sin ningún 4625 previo desde IP o dispositivo desconocido🔴 CríticoPosible credential stuffing o uso de credenciales de la dark web; verificar urgentemente
4740: cuenta bloqueada automáticamente🟠 AltoNo desbloquear sin investigar la causa; revisar los 4625 previos en el registro
4672: privilegios especiales asignados a cuenta estándar🟠 AltoPosible escalación de privilegios; verificar si el cambio fue autorizado
4624 tipo 3 (inicio de sesión de red) desde equipo interno desconocido🟠 AltoPosible movimiento lateral; identificar el equipo origen y verificar
4624 fuera del horario habitual del usuario🟡 MedioConfirmar directamente con el usuario si el acceso fue legítimo
4625 esporádicos (1-3 al día, siempre misma IP)🟢 BajoMonitorizar sin acción inmediata; puede ser error de contraseña del propio usuario
🚨 Patrón crítico especial: cientos de eventos 4625 seguidos de un 4624 desde IP exterior

Este es el patrón exacto de un ataque de fuerza bruta exitoso contra el escritorio remoto de Windows (RDP, puerto 3389). El puerto 3389 expuesto a Internet sin protección adicional es uno de los vectores de entrada más explotados para instalar ransomware y troyanos de acceso remoto (RAT): el atacante prueba miles de combinaciones de credenciales de forma automatizada hasta que una funciona. Si en el registro de seguridad observas una avalancha de eventos 4625 seguida de un 4624 desde una IP que no reconoces, el sistema puede estar comprometido. La respuesta inmediata es desconectar el equipo de la red sin apagarlo para preservar la evidencia forense digital. Para prevenir este vector, el escritorio remoto nunca debe exponerse directamente a Internet: debe combinarse con VPN, 2FA y política de bloqueo de cuentas tras un número máximo de intentos fallidos configurado en la política de seguridad local.

✅ Checklist de verificación mensual del registro de logins

Revisa estos puntos regularmente para mantener la visibilidad sobre los accesos al sistema:

  • ☐ La política de auditoría está activa: auditpol /get /subcategory:"Logon" devuelve "Success and Failure"
  • ☐ Las tres tareas Monitor-Logins-* aparecen en estado Ready: Get-ScheduledTask -TaskName "Monitor-Logins-*"
  • ☐ El CSV histórico se actualiza correctamente: Import-Csv C:\Logs\monitor-logins-historico.csv | Select -Last 5
  • ☐ No hay usuarios con más de 10 eventos 4625 en las últimas 24 horas
  • ☐ No hay eventos 4624 desde IPs o dispositivos que no reconozco
  • ☐ No hay cuentas en estado bloqueado (evento 4740) sin causa identificada
  • ☐ No hay eventos 4672 asignando privilegios especiales a cuentas estándar
  • ☐ No hay eventos 4624 tipo 3 desde equipos internos no autorizados (posible movimiento lateral)
  • ☐ El registro de seguridad de Windows no ha sido borrado o modificado (evento 1102)
  • ☐ El tamaño de C:\Logs\monitor-logins-historico.csv es razonable (rota o archiva si supera 50 MB)
  • ☐ He verificado si mis credenciales aparecen en bases de datos de filtraciones recientes
  • ☐ El 2FA está activo en todas las cuentas críticas para bloquear accesos aunque la contraseña esté comprometida

🆚 Sin monitorización vs con monitorización de logins Windows

CaracterísticaSin monitorizaciónCon monitorización de logins Windows
Visibilidad de accesos🔴 Ninguna; el registro no está activo🟢 Total; todos los eventos de inicio de sesión registrados
Detección de fuerza bruta🔴 Imposible🟢 Inmediata mediante análisis del evento 4625
Detección de credential stuffing🔴 Imposible; no hay rastro del acceso🟢 Posible analizando 4624 sin 4625 previos desde IP desconocida
Detección de password spraying🔴 Imposible🟢 Detectable por distribución anómala del evento 4625
Detección de movimiento lateral🔴 Imposible🟢 Posible mediante análisis de eventos 4624 tipo 3
Vigilancia automática 24/7🔴 Inexistente🟢 Tres tareas programadas (inicio + logon + cada hora)
Histórico para análisis forense🔴 Sin trazabilidad🟢 CSV histórico permanente con resumen de cada ejecución
Tiempo medio de detección🔴 207 días (media IBM Security 2024)🟢 Minutos u horas con tareas automáticas
Coste de implantación🟢 Gratuito (PowerShell nativo + auditoría integrada en Windows)
Recomendado

Automatización de la monitorización de logins Windows

🔄 Automatización de la monitorización de logins Windows

💡 ¿Cómo automatizar la monitorización de logins Windows?

El script de la sección anterior ya crea automáticamente las tres tareas programadas (inicio, logon y cada hora). Si quieres ir un paso más allá, puedes ampliar el script para enviar alertas automáticas por email usando Send-MailMessage en PowerShell cuando detecte patrones críticos como más de 10 eventos 4625 seguidos o un 4624 desde IP desconocida, o configurar suscripciones a eventos en el Visor de eventos para reenviar los eventos 4625 y 4740 a un equipo central de monitorización.

  • 📅 Tareas programadas en Windows, ejecutan el script automáticamente sin intervención manual; el script de esta guía instala las tres (inicio, logon y horaria) en una sola ejecución
  • 📧 Alertas automáticas por email, notificaciones instantáneas ante patrones críticos usando Send-MailMessage en PowerShell
  • 📋 CSV histórico permanente, el script ya exporta los resultados a C:\Logs\monitor-logins-historico.csv para análisis de tendencias y evidencia forense digital
  • 🔔 Integración con el Visor de eventos de Windows, configura suscripciones a eventos para recibir alertas en tiempo real ante el evento 4625 o 4740

🧠 Buenas prácticas para la monitorización de logins Windows

  • 🔒 Combina con el hardening de cuentas Windows y la política de bloqueo automático de cuentas para que el sistema responda automáticamente ante ataques de fuerza bruta detectados
  • 🛡️ Mantén activo Windows Defender como capa adicional de detección de malware y actividad maliciosa en tiempo real
  • 🔑 Usa contraseñas únicas y seguras para cada cuenta; las contraseñas reutilizadas alimentan el credential stuffing y hacen indetectable la intrusión inicial
  • 📱 Activa el 2FA (autenticación de dos factores) para bloquear accesos no autorizados aunque la contraseña haya sido comprometida en una brecha de datos
  • 🕵️ Comprueba si tus credenciales han sido filtradas en brechas de datos con servicios de Dark Web Monitoring; una credencial filtrada es el origen más frecuente de intrusiones sin evento 4625
  • 📏 Configura una política de bloqueo de cuentas tras 5-10 intentos fallidos en la política de seguridad local para limitar automáticamente los ataques de fuerza bruta

🌐 La monitorización de logins es solo una capa: el contexto más amplio importa

La auditoría de inicio de sesión en Windows detecta el ataque cuando ya está en marcha. Para evitar que llegue a ese punto, es igualmente necesario trabajar en las capas previas: contraseñas únicas y robustas que eliminen el riesgo de credential stuffing, doble factor de autenticación que bloquee el acceso aunque la contraseña esté comprometida, y vigilancia activa de brechas de datos que alerte en cuanto una credencial tuya quede expuesta en la dark web. Todo ello forma parte de una estrategia integral de protección de la identidad digital y la seguridad online personal que va mucho más allá del sistema operativo. Si quieres entender cómo encajan todas estas capas desde una perspectiva global, consulta nuestra guía de seguridad online con las 10 medidas más efectivas para proteger tu vida digital en 2026.

Recomendación oficial CISA: La CISA recomienda la monitorización de eventos de autenticación como control prioritario para interrumpir el ciclo de ataque antes de la exfiltración de datos. Fuente: Ransomware Guide, CISA.

🏁 Conclusión

La monitorización de logins Windows con PowerShell permite detectar accesos sospechosos en tiempo real y prevenir intrusiones de forma eficaz y gratuita, analizando el registro de seguridad de Windows sin necesidad de herramientas externas ni soluciones SIEM. Implementar esta capa de visibilidad, combinada con el hardening de cuentas, la política de bloqueo automático y Windows Defender, convierte un sistema reactivo en uno proactivo capaz de detectar ataques antes de que causen daño o escalen a un incidente completo.

Lo más valioso de la solución de esta guía es que las tres tareas programadas (inicio, logon y cada hora) garantizan vigilancia 24/7 sin intervención del usuario, y el CSV histórico permanente proporciona la evidencia forense necesaria para responder a cualquier incidente con datos concretos. Es monitorización de nivel empresarial al alcance de cualquier equipo Windows 10 u 11.

  • 🔒 Activa la política de auditoría con auditpol como primer paso; sin ella el registro de seguridad no contiene eventos de inicio de sesión
  • 🔒 Los eventos 4625, 4624, 4740 y 4672 son los indicadores clave del registro; analízalos en conjunto para detectar patrones de ataque complejos
  • 🔒 Un 4624 sin 4625 previos desde IP desconocida es la señal más peligrosa del registro: indica credential stuffing con credenciales comprometidas de la dark web
  • 🔒 Las tres tareas programadas reducen el tiempo de detección de los 207 días de media a minutos: vigilancia continua sin intervención manual
  • 🔒 Combina con el hardening de cuentas Windows y el 2FA: la monitorización detecta, el hardening y el segundo factor previenen

❓ Preguntas frecuentes sobre monitorización de logins Windows

¿Qué evento indica un login fallido en Windows?

👉 El evento 4625 en el registro de seguridad de Windows. Registra cada intento fallido de inicio de sesión con información del usuario, tipo de login y, en muchos casos, la dirección IP de origen. Es el indicador principal para detectar ataques de fuerza bruta y password spraying.

¿Necesito herramientas externas para la monitorización de logins Windows?

👉 No. PowerShell y la política de auditoría nativa de Windows son suficientes para implementar una monitorización completa del registro de seguridad sin instalar software adicional ni soluciones SIEM de coste elevado.

¿Es difícil configurar la monitorización de logins?

👉 No. Con un único comando auditpol activas la política de auditoría y con el script de esta guía tienes la monitorización de logins Windows funcionando, las tres tareas programadas creadas y el CSV histórico inicializado en menos de 5 minutos.

¿La monitorización de logins Windows sirve para detectar hackeos?

👉 Sí, especialmente ataques de fuerza bruta (muchos eventos 4625 en el registro), password spraying (4625 distribuido entre múltiples usuarios) y uso de credenciales robadas mediante credential stuffing (evento 4624 sin intentos fallidos previos desde IP desconocida).

¿Con qué frecuencia debo revisar los logs de inicio de sesión?

👉 Las tres tareas programadas que crea el script ya hacen la revisión automáticamente: en cada arranque, en cada login y cada hora. Tú solo necesitas revisar manualmente el CSV histórico (C:\Logs\monitor-logins-historico.csv) una vez al mes para detectar tendencias o anomalías que requieran investigación humana.

¿Qué diferencia hay entre el evento 4624 y el 4625?

👉 El 4624 registra un inicio de sesión exitoso en el registro de seguridad y el 4625 un intento fallido. Para una monitorización completa debes analizar ambos en conjunto: muchos 4625 indican fuerza bruta, y un 4624 sin 4625 previos desde IP desconocida puede indicar uso de credenciales comprometidas procedentes de una brecha de datos.

¿Qué es el evento 4740 en Windows?

👉 El evento 4740 indica que una cuenta de usuario ha sido bloqueada automáticamente por superar el número máximo de intentos fallidos configurado en la política de seguridad local. Es una señal clara de un ataque de fuerza bruta activo y requiere investigación inmediata del registro de seguridad antes de desbloquear la cuenta.

¿Qué es el password spraying y cómo se detecta en el registro de Windows?

👉 El password spraying es una variante del ataque de fuerza bruta documentada en MITRE ATT&CK T1110.003 que prueba una o pocas contraseñas comunes contra muchos usuarios distintos para evitar el bloqueo de cuentas. En el registro de seguridad de Windows se detecta por una distribución anómala del evento 4625: muchos usuarios diferentes con pocos intentos fallidos cada uno en el mismo período de tiempo, patrón que el script de monitorización identifica en el paso de agrupación por usuario.

¿Las tres tareas programadas ralentizan el equipo?

👉 No de forma perceptible. Cada ejecución dura unos pocos segundos, se realiza en background como SYSTEM y en modo oculto (sin ventana visible). La carga combinada de las tres tareas (inicio + logon + cada hora) suma menos de un minuto de CPU al día en un equipo doméstico. El log y el CSV crecen unos KB por ejecución, así que el impacto en disco también es mínimo.

¿Cómo desactivo las tareas programadas si quiero parar la monitorización?

👉 Tienes dos opciones. La rápida: ejecuta el script de reversión incluido en esta guía, que elimina las tres tareas (Monitor-Logins-Inicio, Monitor-Logins-Logon y Monitor-Logins-Horaria). La manual: abre el Programador de tareas (Win+R → taskschd.msc), localiza las tres tareas en la Biblioteca y pulsa Eliminar en cada una. La política de auditoría sigue activa por seguridad y los logs históricos se conservan en C:\Logs\.

¿Puedo cambiar la frecuencia de la tarea horaria si me parece excesiva?

👉 Sí. Abre el Programador de tareas, localiza Monitor-Logins-Horaria, ve a la pestaña Desencadenadores, edita el desencadenador y cambia el campo "Repetir cada" a 4 horas, 8 horas o el intervalo que prefieras. También puedes desactivar esa tarea en concreto y dejar solo las dos basadas en eventos (inicio y logon), aunque perderás la vigilancia continua entre sesiones.

⚠️ Nota editorial: Los Event IDs documentados en este artículo están respaldados por la documentación oficial de Microsoft sobre Audit Logon. Para que el script funcione correctamente, la política de auditoría debe estar activa mediante auditpol (el script lo hace automáticamente en su primera ejecución). Si ejecutaste previamente el script de hardening de cuentas Windows de esta web, la política ya está activada en tu sistema.

Autor

Entusiasta de la seguridad informática con años de experiencia en protección de sistemas Windows y defensa contra amenazas digitales. Apasionado por la tecnología y la privacidad, comparto en este blog consejos prácticos, análisis detallados y guías paso a paso para que cualquier usuario pueda fortalecer la seguridad de su PC y su vida digital

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir