Cómo detectar y analizar las BSOD con PowerShell

La pantalla azul de la muerte (BSOD) es un término del mundo de la informática que a menudo produce escalofríos en los usuarios. Es una pantalla de error de parada que aparece en un sistema informático Windows tras un error fatal del sistema. A menudo causadas por problemas de hardware o controladores, las BSOD también pueden ser desencadenadas por errores de software, provocando una interrupción brusca del funcionamiento del sistema. Comprender y diagnosticar estos errores es primordial en el ámbito de las TI y, por eso, en este post profundizaremos en un script de PowerShell diseñado para detectar y registrar estos cierres inesperados.

Antecedentes

El script utiliza la herramienta BlueScreenView de Nirsoft, una utilidad diseñada específicamente para analizar archivos minidump generados durante una BSOD. Para los profesionales de TI y los proveedores de servicios gestionados (MSP), la automatización del proceso de detección y análisis de estos archivos minidump tiene un valor incalculable, ya que ofrece un enfoque sistemático para la solución de problemas.

El script para detectar y analizar pantallas azules de la muerte (BSOD)

#Requires -Version 5.1

<#
.SYNOPSIS
    Conditional script for detecting BSOD's. Uses BlueScreenView from Nirsoft.
.DESCRIPTION
    Conditional script for detecting BSOD's. Uses BlueScreenView from Nirsoft.
    Will always show the number of Unexpected shutdowns if system is setup to log those events.
        This doesn't always mean that there was a BSOD as this includes things like holding the power button or pressing the rest button.
    When a mini dump is detected in C:WindowsMinidump then this will output the results and exit with an exit code of 1.
    When none have been found then this will exit with an exit code of 0.
    When it couldn't download or extract BlueScreenView then this will exit with an exit code of 2.
.OUTPUTS
    None
.NOTES
    This should be the default, but in case this was modified instructions below.
    Minimal Setup:
        Open System Properties.
        Click on Settings under Startup and Recovery.
        Make sure that "Write an event to the system log" is checked.
        Under System failure change to "Write debugging information" to Automatic memory dump.
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes:
    Initial Release
    (c) 2023 NinjaOne
    By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param ()

process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    # Get unexpected shutdown events from System log
    $UnexpectedShutdownEvents = Get-WinEvent -FilterHashtable @{LogName = 'System'; ID = 6008 }
    if ($UnexpectedShutdownEvents) {
        Write-Host "Unexpected shutdowns found: $($UnexpectedShutdownEvents.Count)"
        Write-Host ""
    }

    # Check if any minidumps exist and exit if none are found
    if (-not $(Get-ChildItem -Path "C:WindowsMinidump" -ErrorAction SilentlyContinue)) {
        Write-Host "No mini dumps found."
        exit 0
    }
    
    # Download Blue Screen View, run, and export results to a csv file
    try {
        Invoke-WebRequest -Uri $BlueScreenViewUrl -OutFile $ZipPath -ErrorAction Stop
        Expand-Archive -Path $ZipPath -DestinationPath $ENV:Temp -Force -ErrorAction Stop
        Start-Process -FilePath $ExePath -ArgumentList "/scomma ""$CsvPath""" -Wait -ErrorAction Stop
    }
    catch {
        Write-Host "Blue Screen View Command has Failed: $($_.Exception.Message)"
        # Clean Up
        Remove-DownloadedFiles -Path $CsvPath, $ZipPath, $ExePath, "$($ENV:Temp)BlueScreenView.chm", "$($ENV:Temp)readme.txt"
        exit 2
    }

    # Convert the CSV to an array of objects
    $MiniDumps = Get-Content -Path $CsvPath |
        ConvertFrom-Csv -Delimiter ',' -Header $Header |
        Select-Object -Property @{
            'n' = "Timestamp";
            'e' = { [DateTime]::Parse($_.timestamp, [System.Globalization.CultureInfo]::CurrentCulture) }
        }, Dumpfile, Reason, Errorcode, CausedByDriver

    # Clean Up
    Remove-DownloadedFiles -Path $CsvPath, $ZipPath, $ExePath, "$($ENV:Temp)BlueScreenView.chm", "$($ENV:Temp)readme.txt"

    # Output the results
    $MiniDumps | Out-String | Write-Host

    if ($MiniDumps) {
        exit 1
    }
    exit 0
}
begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }
    function Remove-DownloadedFiles {
        param([string[]]$Path)
        process { Remove-Item -Path $Path -Force -ErrorAction SilentlyContinue }
    }

    # CSV Headers
    $Header = @(
        "Dumpfile"
        "Timestamp"
        "Reason"
        "Errorcode"
        "Parameter1"
        "Parameter2"
        "Parameter3"
        "Parameter4"
        "CausedByDriver"
    )

    # Build path variables
    $CsvFileName = "bluescreenview-export.csv"
    $BlueScreenViewZip = "bluescreenview.zip"
    $BlueScreenViewExe = "BlueScreenView.exe"
    $BlueScreenViewUrl = "https://www.nirsoft.net/utils/$BlueScreenViewZip"
    $ZipPath = Join-Path -Path $ENV:Temp -ChildPath $BlueScreenViewZip
    $ExePath = Join-Path -Path $ENV:Temp -ChildPath $BlueScreenViewExe
    $CsvPath = Join-Path -Path $ENV:Temp -ChildPath $CsvFileName
}
end {}

 

Análisis detallado

  1. Requisitos previos: el script requiere PowerShell versión 5.1 y está diseñado para Windows 10 y Windows Server 2016.
  2. Inicialización: empieza por asegurarse de que tiene privilegios de administrador, esenciales para acceder a los registros del sistema y a los archivos minidump.
  3. Cierres inesperados: a continuación, el script comprueba si se han producido cierres inesperados en el registro del sistema.
  4. Control de minidumps: busca archivos minidump en el directorio designado.
  5. Integración de BlueScreenView: si se detectan archivos minidump, el script descarga y ejecuta BlueScreenView, exportando los resultados a un archivo CSV.
  6. Análisis de datos: los datos CSV se convierten en una matriz de objetos que el usuario puede visualizar.
  7. Limpieza: tras el análisis, se eliminan todos los archivos descargados o extraídos.

Posibles casos de uso

Pensemos en un profesional de TI, Alex, que ha sido alertado de BSOD recurrentes en el departamento de diseño de una empresa. En lugar de examinar manualmente cada sistema, Alex despliega este script. En unos instantes, identifica un controlador específico que causa las BSOD, lo que permite una solución específica. Este script se convierte así en una poderosa herramienta para la resolución de problemas.

Comparaciones

Aunque el Visor de eventos de Windows ofrece información, carece del análisis detallado de minidumps que proporciona BlueScreenView. Este script cubre eficazmente ese vacío, ofreciendo un enfoque más completo que los métodos manuales.

Preguntas frecuentes

  • P: ¿Puede ejecutarse este script en versiones anteriores de Windows?
    R: Está optimizado para Windows 10 y Windows Server 2016. Es posible que las versiones anteriores no admitan todas las funciones.
  • P: ¿Qué ocurre si BlueScreenView no se descarga o extrae?
    R: Si hay algún problema, el script saldrá con un código de error 2. Asegúrate de tener una conexión a Internet estable y permisos suficientes.
  • P: ¿Cómo puedo utilizar el script en versiones anteriores de Windows?
    R: Aunque el script está diseñado para versiones más recientes, es posible que tengas que modificar ciertos parámetros o integrar utilidades antiguas para que sea compatible con versiones anteriores de Windows.

Implicaciones para la seguridad

Las BSOD no son solamente molestas; pueden ser un problema de seguridad. Una BSOD recurrente puede ser señal de que una entidad maliciosa intenta comprometer el sistema. Al registrar y analizar estos eventos, los profesionales de TI pueden identificar posibles amenazas y garantizar la seguridad del sistema.

Recomendaciones

  • Asegúrate de ejecutar el script con privilegios de administrador para garantizar su plena funcionalidad.
  • Actualiza periódicamente la herramienta BlueScreenView para poder usar las últimas funciones y garantizar la compatibilidad.
  • Supervisa los sistemas en busca de BSOD recurrentes, ya que podrían indicar problemas de seguridad más profundos.

Reflexiones finales

En el dinámico mundo de las TI, herramientas como NinjaOne, cuando se combinan con scripts como el que hemos visto, permiten a los profesionales mantener la salud y la seguridad del sistema. Detectar y analizar los registros de BSOD y los cierres inesperados se convierte en un proceso simplificado, que garantiza la eficacia y la seguridad de las operaciones.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).