¿Cómo utilizo PowerShell para crear un evento en un registro de Windows?
Table of Contents
I. Introducción
En este tutorial, utilizaremos PowerShell para crear un registro personalizado y eventos personalizados en el Visor de sucesos de Windows o Windows Server, utilizando dos cmdlets: New-EventLog y Write-EventLog. Además, veremos cómo utilizar la clase .NET "EventLog" para crear entradas avanzadas.
En Windows, el sistema operativo, los componentes y las aplicaciones pueden generar eventos que se registran en los distintos logs centralizados en el Visor de Eventos. Estos registros son una mina de información para los administradores del sistema, pero también para los equipos de seguridad: una acción sospechosa puede registrarse en un evento, que luego representa un rastro interesante.
El siguiente paso es recopilar estos eventos en un sumidero de registros o SIEM, con el fin de analizarlos y detectar comportamientos sospechosos o anomalías en una infraestructura.
Gracias al comando Write-EventLog, o al uso de la clase EventLog, podemos alimentar los registros de Windows con eventos personalizados que, a su vez, pueden ser explotados por una solución como un SIEM. En otras palabras, su script PowerShell puede crear eventos que contengan la información de su elección.
Nota : antes de que Write-EventLog estuviera disponible, esta acción era posible en Windows utilizando la utilidad de línea de comandos EVENTCREATE.exe.
II. Uso del cmdlet New-EventLog
Dentro del Visor de Sucesos, podemos crear un registro personalizado, asociado al nombre que elijamos, siempre que no esté ya en uso. Este paso es opcional, ya que podemos crear registros en ciertos registros nativos, como el registro de "Aplicaciones" de Windows.
Sin embargo, si creamos un registro personalizado y registramos en él nuestros propios eventos, podremos "aislar" nuestros eventos personalizados. Esto también puede significar adaptar la configuración de su herramienta de recopilación de registros para que admita este nuevo registro.
El siguiente comando crea un registro llamado "PowerShell-Demo", que acepta dos fuentes: "Script-1" y "Script-2". Puedes añadir tantos como quieras, y puedes añadir fuentes adicionales a un registro existente. Esto es esencial, ya que cada evento de registro debe estar asociado a una fuente.
New-EventLog -LogName "PowerShell-Demo" -Source "Script-1","Script-2"
Este registro será visible inmediatamente en el Visor de Sucesos en "Registros de aplicaciones y servicios".

Para añadir una fuente adicional, basta con ejecutar de nuevo New-EventLog, especificando el nombre del registro y el nombre de la fuente adicional que se desea añadir. He aquí un ejemplo de cómo añadir la fuente "Script-3":
New-EventLog -LogName "PowerShell-Demo" -Source "Script-3"
Si te equivocas, por ejemplo, en el nombre de tu registro, puedes borrarlo con este comando:
Remove-EventLog -LogName "PowerShell-Demo"
Para obtener más información sobre el uso de este cmdlet, consulte esta página:
III. Uso del cmdlet Write-EventLog
Ahora veremos cómo escribir un nuevo evento en el registro de eventos que acabamos de crear. También podríamos añadirlo a otro registro (cuidado, algunos están protegidos), ya que el parámetro "-LogName" del comando Write-EventLog se utiliza para especificar el registro de destino.
Al igual que con otros cmdlets de PowerShell, puede especificar el nombre del cmdlet, seguido de cada parámetro y su valor, pero en este caso, la escritura sugerida a continuación facilita la lectura.
$Event = @{
LogName = "PowerShell-Demo"
Source = "Script-1"
EntryType = "Error"
EventId = 10000
Message = "This alert was generated from PowerShell"
}
Write-EventLog @Event
Este trozo de código creará un evento "Error" en nuestro registro, asociado al origen "Script-1" y al ID "10000". Contendrá el mensaje "Esta alerta se generó a partir de PowerShell", como puedes ver en la imagen inferior. Intenta utilizar diferentes IDs para tus tipos de eventos, y evita utilizar IDs ya usados por Windows.

En lugar del tipo "Error", que genera un error, puede utilizar los siguientes valores: Warning, Informational, SuccessAudit y FailureAudit. Tenga en cuenta que este comando admite el parámetro "-ComputerName", que permite crear un evento en el registro de un ordenador remoto.
Para ver este registro personalizado, o cualquier otro registro, puede utilizar el cmdlet de PowerShell "Get-EventLog". Aunque este cmdlet es muy útil, no te da acceso a todos los registros, así que ten en cuenta que también hay un segundo cmdlet para ver los registros: "Get-WinEvent".
Aquí está el comando a utilizar para recuperar nuestros registros:
Get-EventLog -LogName "PowerShell-Demo"
Para obtener más información sobre el uso de estos cmdlets, eche un vistazo a estas páginas:
- Microsoft Learn - Write-EventLog
- Microsoft Learn - Obtener registro de eventos
- Microsoft Learn - Get-WinEvent
IV. Uso de la clase EventLog en PowerShell
Para ir un paso más allá en la escritura de eventos en un registro de Windows, necesitamos explotar la clase EventLog directamente desde PowerShell. Esto nos permitirá añadir datos mejor estructurados a nuestro evento, especialmente en la sección "EventData" visible desde la vista XML. Esto es útil para almacenar múltiples piezas de información, al tiempo que permite que cada pieza de información sea recuperada de forma independiente.
He aquí un ejemplo:

Esto complica el registro de un nuevo evento, ya que tenemos que crear nuestros propios objetos y prescindir del uso de Write-EventLog. Se utilizará un primer objeto "System .Diagnostics .EventInstance" para indicar el número de identificación y el tipo de evento, mientras que un segundo objeto "System.Diagnostics.EventLog" se utilizará para especificar los datos del evento.
Sin embargo, para simplificar las cosas, le sugerimos que utilice esta función:
function Write-EventLogV2 {
<#
.SYNOPSIS
Crea un evento en el visor de eventos
.DESCRIPTION
La función utiliza CmdLet WriteEvent para crear un evento a partir de los parámetros de entrada.
.PARAMETER dataUser
Nombre de usuario que se introducirá en el contenido del evento que se va a crear
.PARAMETER dataDescription
Contenido de la descripción a introducir en el contenido del evento a crear
.PARAMETER ID
ID del evento que se va a crear
.PARAMETER evtLog
Agenda de actos por crear
.PARAMETER evtSource
Fuente del evento a crear
.EXAMPLE
New-EventLog -dataUser "John" -dataDescription "nueva descripción"
.OUTPUTS
None
#>
param(
[Parameter(Mandatory=$true)]$dataUser,
$dataDescription="",
$ID=10000,
$evtLog="PowerShell-Demo",
$evtSource="Script-2"
)
# Carga el origen del evento en el registro si no está ya cargado.
# Esta operación fallará si el origen del evento ya está asignado a otro registro.
if ([System.Diagnostics.EventLog]::SourceExists($evtSource) -eq $false) {
[System.Diagnostics.EventLog]::CreateEventSource($evtSource, $evtLog)
}
# Construir y grabar el evento
$evtID = New-Object System.Diagnostics.EventInstance($ID,1)
$evtObject = New-Object System.Diagnostics.EventLog
$evtObject.Log = $evtLog
$evtObject.Source = $evtSource
$evtObject.WriteEvent($evtID, @($dataUser,"Description : $dataDescription"))
}
Como entrada, esta función acepta dos mensajes ($dataUser y $dataDescription - puede renombrar estos parámetros cuyo nombre ha sido elegido con respecto al script original), un número ID (por defecto, será 10000), el nombre de un registro de eventos (por defecto, será "PowerShell-Demo") y una fuente (por defecto, será "Script-2").
Además, por defecto, esta función genera eventos de tipo "Información". Si desea cambiar el tipo de evento, debe ajustar el valor en esta línea:
$evtID = New-Object System.Diagnostics.EventInstance($ID,1)
El primer valor corresponde al ID deseado, aquí asociado a la variable $ID, mientras que el segundo valor corresponde al tipo de evento. El 1 corresponde al tipo "Información".
Esto generará eventos similares a este :


Si es necesario, puede añadir otros valores en la segunda parte de "$evtObject.WriteEvent" para tener líneas adicionales "<Data>".
V. Conclusión
Siguiendo este tutorial, deberías ser capaz de crear tus propios eventos personalizados en los logs de Windows, ¡ya sea en un log existente o en tu propio log usando PowerShell! Siéntete libre de utilizar estos cmdlets o esta función en tus scripts, ¡y adáptalos a tus necesidades! En cualquier caso, ¡esto abre algunas posibilidades muy interesantes!