Cómo exportar eventos de Seguridad de Windows en PowerShell: paso a paso
Esta guía muestra cómo exportar eventos del registro de Seguridad de Windows en PowerShell para análisis, auditoría e integración con otras herramientas. Saber filtrar por ID, intervalo de tiempo y exportar a CSV o XML es útil para detectar fallos de autenticación, cambios de política o actividades sospechosas.
Requisitos previos
- Windows 10/11 o Windows Server con PowerShell 5.1 o PowerShell 7 instalado.
- Permisos administrativos para leer el registro de Seguridad.
- Editor de texto (Notepad, VS Code) para guardar scripts.
Paso 1: Entender el registro y los Event IDs comunes
Antes de ejecutar comandos, es importante saber que el registro de Seguridad contiene eventos como fallos de inicio de sesión (Event ID 4625), éxito de inicio de sesión (4624) y cambio de privilegios (4672). Identificar los Event IDs que interesan facilita el filtrado y reduce el volumen de datos.
Paso 2: Listar eventos recientes con Get-WinEvent
Get-WinEvent es más flexible que Get-EventLog para registros modernos. Use un filtro simple para ver los 50 eventos más recientes del canal Security.
Get-WinEvent -LogName Security -MaxEvents 50 | Select-Object TimeCreated, Id, LevelDisplayName, Message
Paso 3: Filtrar por Event ID e intervalo de tiempo
Para buscar eventos específicos, combine un Hashtable de filtro con Get-WinEvent. Ejemplo: todos los Event ID 4625 en los últimos 7 días.
$filter = @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-7)}
Get-WinEvent -FilterHashtable $filter | Select-Object TimeCreated, Id, Message
Paso 4: Filtrar por varios Event IDs
Cuando necesita varios Event IDs (p. ej.: 4624 y 4625) use una matriz en el filtro. Esto es útil para comparar exitos y fallos de inicio de sesión.
$ids = @(4624,4625)
$filter = @{LogName='Security'; Id=$ids; StartTime=(Get-Date).AddDays(-1)}
Get-WinEvent -FilterHashtable $filter | Select-Object TimeCreated, Id, Message
Paso 5: Extraer campos útiles del Message
El campo Message contiene texto libre. Para informes, extraiga valores como AccountName o IP con expresiones regulares sencillas.
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
ForEach-Object {
$msg = $_.Message
$account = ($msg -match 'Account Name:\s+(\S+)' ) ? $matches[1] : ''
$ip = ($msg -match 'Source Network Address:\s+(\S+)' ) ? $matches[1] : ''
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
Id = $_.Id
Account = $account
SourceIP = $ip
}
} | Format-Table -AutoSize
Paso 6: Exportar a CSV
Después de construir objetos limpios, exporte a CSV para análisis en Excel o para almacenamiento. Elija una ruta con permisos de escritura.
$out = 'C:\Temp\SecurityEvents.csv'
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=@(4624,4625); StartTime=(Get-Date).AddDays(-7)} |
ForEach-Object {
$msg = $_.Message
$account = ($msg -match 'Account Name:\s+(\S+)' ) ? $matches[1] : ''
$ip = ($msg -match 'Source Network Address:\s+(\S+)' ) ? $matches[1] : ''
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
Id = $_.Id
Account = $account
SourceIP = $ip
}
} | Export-Csv -Path $out -NoTypeInformation -Encoding UTF8
Write-Host "Exportado para $out"
Paso 7: Exportar a XML o fichero bruto
Para archivar la estructura completa del evento, exporte el evento entero en formato XML. Esto preserva todos los campos y es útil para ingestión por herramientas SIEM.
$xmlOut = 'C:\Temp\SecurityEvents.xml'
Get-WinEvent -FilterHashtable @{LogName='Security'; StartTime=(Get-Date).AddDays(-1)} |
Select-Object -First 100 | ForEach-Object { $_.ToXml() } | Out-File -FilePath $xmlOut -Encoding UTF8
Write-Host "XML guardado en $xmlOut"
Paso 8: Programar exportación automática (opción)
Si necesita informes regulares, guarde el script y cree una tarea en el Task Scheduler que ejecute PowerShell con el fichero. Asegúrese de ejecutarlo con credenciales que tengan acceso al registro de Seguridad.
powershell -ExecutionPolicy Bypass -File C:\Scripts\ExportSecurityEvents.ps1
Verificar el resultado
Abra el fichero CSV en Excel o el XML en un editor para confirmar que los eventos se han exportado. Verifique el número de filas, las marcas de tiempo y si los campos Account/SourceIP están rellenados. Si no hay resultados, confirme permisos y el intervalo de tiempo usado.
Conclusión
Exportar eventos de Seguridad en PowerShell permite monitorizar autenticaciones y actividades sospechosas y alimentar SIEMs o informes. Para avanzar, pruebe a filtrar por EventData más específicos, integrar con Send-MailMessage para alertas o enviar a un endpoint REST. Consejo: empiece probando filtros pequeños (1 día, pocos Event IDs) para evitar grandes volcados de datos — ¿qué evento pretende analizar primero?