En Linux, si quiero observar el inicio de sesión del sistema en la terminal en tiempo real, puedo usar el tail
comando para generar el /var/log/syslog
archivo con el interruptor -f
o --follow
, que "genera datos agregados a medida que el archivo crece", por ejemplo:
tail -f /var/log/syslog
... o también podría usar:
dmesg --follow
... donde -w, --follow
el argumento dmesg
significa "Esperar mensajes nuevos".
En cualquier caso, ambas aplicaciones en este modo generalmente bloquean la terminal y luego descargan nuevas líneas de texto/mensajes a medida que aparecen, hasta que presiona Ctrl-C para salir de ellas.
En Windows, entiendo que el equivalente al registro del sistema es el Visor de eventos (registro), que es una aplicación GUI. Después de un tiempo, encontréhttps://www.petri.com/command-line-event-log- que señala que se puede utilizar la WEVTUTIL.EXE
aplicación de línea de comandos para consultar el registro de eventos de Windows.
Entonces, probé esto:
C:\>wevtutil qe System
... pero esto simplemente descarta todos los eventos y luego sale (igual que si llamara dmesg
a Linux sin ningún argumento).
Revisé la ayuda wevtutil /?
, pero no puedo ver ningún argumento de línea de comando que se ponga wevtutil
en modo "seguir" (es decir, que bloquee el terminal después de haber descargado todo hasta ese punto y luego imprima nuevos eventos/líneas de texto tal como están). registrado).
Entonces, ¿es posible empezar wevtutil
a trabajar en modo de seguimiento y, de ser así, cómo? Si no es así, ¿hay otra utilidad que pueda usar y que haga lo mismo: volcar el registro de eventos del sistema de Windows a la terminal en modo de seguimiento?
Respuesta1
Ir asysinternals.com, luego consulte la documentación de ProcessExplorer. Puede configurar filtros para exe, eventos, mensajes y en tiempo real o duración. También puedes rastrear y depurar. Sysinternals Suite ofrece muchos mejores detalles que el visor de eventos.
Una vez que encuentre los eventos u objetos que necesita, verifique las propiedades para ver a qué puede llamar en la terminal.
Respuesta2
Bien, busqué algo un poco más; encontró esto:
... que ofrece ejemplos del uso de PowerShell para este comportamiento. Basado en esta publicación, esto es lo que hice:
Primero, quería crear un script de PowerShell; la páginahttps://www.windowscentral.com/how-create-and-run-your-first-powershell-script-file-windows-10señala que la extensión para un script de PowerShell es .ps1
.
Luego, quería crear específicamente el script en la raíz de la unidad C:
. Resulta que esto está protegido en Windows 10; debe tener privilegios de administrador para hacer esto (de lo contrario, obtendrá Access is denied.
). Entonces, encendí el símbolo del sistema en modo administrador ("Ejecutar como administrador") y creé estos dos archivos:
C:\WINDOWS\system32>cd C:\
C:\>echo > wevent_tail_01.ps1
C:\>echo > wevent_tail_02.ps1
Tenga en cuenta que estos archivos no estarán vacíos, pero tendrán la línea de texto ECHO is on.
; sin embargo, esa línea se puede eliminar; o (https://ss64.com/ps/syntax-comments.html) con el prefijo #
que es el carácter de comentario en PowerShell.
Luego, abrí esos archivos en el Bloc de notas para editarlos, desde el mismo terminal, por lo que se mantienen los privilegios administrativos (de lo contrario, se le negará el acceso al intentar guardar los archivos desde el Bloc de notas):
C:\>notepad wevent_tail_01.ps1
C:\>notepad wevent_tail_02.ps1
Luego, pegué este código de SO:15262196 como wevent_tail_01.ps1
:
$idx = (get-eventlog -LogName System -Newest 1).Index
while ($true)
{
start-sleep -Seconds 1
$idx2 = (Get-EventLog -LogName System -newest 1).index
get-eventlog -logname system -newest ($idx2 - $idx) | sort index
$idx = $idx2
}
... y pegué el código delotra respuestaen wevent_tail_02.ps1
, pero no pude hacerlo funcionar. Entonces, en el resto de esta publicación, solo usaré wevent_tail_01.ps1
.
Ahora es el momento de ejecutar este script en PowerShell; la publicación de Windows Central señala que los scripts se ejecutan anteponiendo su ruta con un signo y un espacio &
; sin embargo, si inicia PowerShell normalmente y lo prueba, obtendrá:
PS C:\> & "C:\wevent_tail_01.ps1"
& : File C:\wevent_tail_01.ps1 cannot be loaded because running scripts is disabled on this system. For more
information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:3
+ & "C:\wevent_tail_01.ps1"
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
La publicación de Windows Central recomienda utilizar Set-ExecutionPolicy RemoteSigned
para solucionar este problema, pero para completar este comando, deberá volver a ejecutar PowerShell con privilegios administrativos; sin embargo, también puede limitarlo al usuario actual, en cuyo caso puede mantener el PowerShell iniciado normalmente:
PS C:\> Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): A
PS C:\>
Entonces, en este punto, deberíamos tener permiso para ejecutar nuestro script:
PS C:\> & "C:\wevent_tail_01.ps1"
... y bueno, el script bloqueará la terminal, pero lo más probable es que no se descargue ningún texto. Entonces, nos gustaría probar y ver si esto funciona.
Para ello necesitaremos abrir otro PowerShell, pero con propiedades administrativas; Encontré la información correcta enhttps://mcpmag.com/articles/2016/09/08/powershell-to-write-to-the-event-log.aspx- en resumen: para escribir cosas arbitrarias en los registros de eventos de Windows, necesitamos especificar una "fuente":
PS C:\WINDOWS\system32> New-EventLog -LogName System -Source 'MySysTest'
... y luego, podemos usar Write-EventLog
para escribir en el registro de eventos:
PS C:\WINDOWS\system32> Write-EventLog -LogName "System" -Source "MySysTest" -EventID 3001 -EntryType Information -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20
PS C:\WINDOWS\system32> Write-EventLog -LogName "System" -Source "MySysTest" -EventID 3001 -EntryType Warning -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20
PS C:\WINDOWS\system32> Write-EventLog -LogName "System" -Source "MySysTest" -EventID 3001 -EntryType Error -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20
Si ahora cambiamos al primer PowerShell, donde se C:\wevent_tail_01.ps1
estaba ejecutando y bloqueando, deberíamos ver algo como:
PS C:\> & "C:\wevent_tail_01.ps1"
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
2577 Jun 27 10:34 Information MySysTest 3001 MyApp added a user-requested feature to the dis...
2578 Jun 27 10:35 Warning MySysTest 3001 MyApp added a user-requested feature to the dis...
2579 Jun 27 10:35 Error MySysTest 3001 MyApp added a user-requested feature to the dis...
De hecho, al principio no vi esto al cambiar a esta terminal, pero luego creo que hice clic derecho una vez y "se despertó" y luego comenzó a descargar líneas en tiempo real.
Bueno, supongo que esto es lo que quería, aunque esperaba que hubiera sido un poco más fácil...
EDITAR: si desea "seguir" el registro del sistema y de la aplicación, aquí está el script de PowerShell:
$sidx = (get-eventlog -LogName System -Newest 1).Index
$aidx = (get-eventlog -LogName Application -Newest 1).Index
while ($true)
{
start-sleep -Seconds 1
$sidx2 = (Get-EventLog -LogName System -newest 1).index
$aidx2 = (Get-EventLog -LogName Application -newest 1).index
get-eventlog -logname system -newest ($sidx2 - $sidx) | sort index
get-eventlog -logname application -newest ($aidx2 - $aidx) | sort index
$sidx = $sidx2
$aidx = $aidx2
}
... y para probar, tutenerpara crear un nuevo proveedor, con un nombre único, registrado en el registro de la aplicación, entonces:
New-EventLog -LogName Application -Source 'MyAppTest'
... que puedes probar/iniciar con:
Write-EventLog -LogName "Application" -Source "MyAppTest" -EventID 3001 -EntryType Error -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20