Hur man upptäcker och analyserar Blue Screens of Death (BSOD) med PowerShell

Blue Screen of Death (BSOD) är en term som får det att gå kalla kårar längs ryggraden på många datoranvändare. Det är en stoppfelsskärm som visas på ett Windows-datorsystem efter ett allvarligt systemfel. BSOD orsakas ofta av hårdvaru- eller drivrutinsproblem, men kan även utlösas av programvarufel, vilket leder till ett abrupt stopp i systemets funktioner. Att förstå och diagnostisera dessa fel är av största vikt inom IT-området, och i den här artikeln beskrivs ett PowerShell-skript som är utformat för att upptäcka och logga dessa oväntade avstängningar.

Bakgrund

Skriptet använder BlueScreenView-verktyget från Nirsoft, ett verktyg som är särskilt utformat för att analysera minidumpfiler som genereras under en BSOD. För IT-proffs och tjänsteleverantörer (MSP) är det ovärderligt att automatisera processen för att upptäcka och analysera dessa minidumpfiler, eftersom det ger en systematisk metod för felsökning.

Manus

#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 {}

 

Detaljerad uppdelning

  1. Förkunskapskrav: Skriptet kräver PowerShell version 5.1 och är utformat för Windows 10 och Windows Server 2016.
  2. Initialisering: Den börjar med att säkerställa att den har administratörsbehörighet, vilket är nödvändigt för att komma åt systemloggar och minidumpfiler.
  3. Oväntade avstängningar: Skriptet söker sedan efter oväntade avstängningshändelser i systemloggen.
  4. Minidump Check: Den söker efter minidump-filer i den angivna katalogen.
  5. Integration av BlueScreenView: Om minidump-filer upptäcks laddar skriptet ner och kör BlueScreenView och exporterar resultaten till en CSV-fil.
  6. Parsning av data: CSV-data konverteras till en uppsättning objekt som användaren kan visa.
  7. Rengöring: Efter analysen tas alla nedladdade eller extraherade filer bort.

Potentiella användningsområden

Tänk dig en IT-expert, Alex, som har uppmärksammats på återkommande BSOD:s på ett företags designavdelning. Istället för att manuellt gå igenom varje system använder Alex detta skript. På några ögonblick identifierar han en specifik drivrutin som orsakar BSOD, vilket möjliggör en målinriktad lösning. Detta skript blir därmed ett kraftfullt verktyg i hans felsökningsarsenal.

Jämförelser

Händelsevisaren i Windows ger insikter, men saknar den detaljerade minidump-analys som BlueScreenView erbjuder. Detta script överbryggar detta gap på ett effektivt sätt och erbjuder en mer heltäckande metod än manuella metoder.

Vanliga frågor

  • Fråga: Kan detta skript köras på äldre Windows-versioner?
    Svar: Den är optimerad för Windows 10 och Windows Server 2016. Äldre versioner kanske inte stöder alla funktioner.
  • Fråga: Vad händer om BlueScreenView inte kan laddas ner eller extraheras?
    Svar: Om det finns ett problem avslutas skriptet med felkod 2. Se till att du har en stabil internetanslutning och tillräckliga behörigheter.
  • Fråga: Hur kan jag använda skriptet på äldre Windows-versioner?
    Svar: Även om skriptet är utformat för nyare versioner kan du behöva ändra vissa parametrar eller integrera äldre verktyg för kompatibilitet med äldre Windows-versioner.

Konsekvenser för säkerheten

BSOD är inte bara ett irritationsmoment, de kan även vara ett säkerhetsproblem. En återkommande BSOD kan vara ett tecken på att en skadlig enhet försöker kompromettera systemet. Genom att logga och analysera dessa händelser kan IT-personal identifiera potentiella hot och säkerställa systemsäkerheten.

Rekommendationer

  • Kör alltid skriptet med administratörsbehörighet för att säkerställa full funktionalitet.
  • Uppdatera regelbundet BlueScreenView-verktyget för att dra nytta av de senaste funktionerna och säkerställa kompatibilitet.
  • Övervaka system för återkommande BSOD eftersom de kan tyda på djupare säkerhetsproblem.

Avslutande tankar

I den dynamiska IT-världen ger verktyg som NinjaOne, i kombination med skript som det som diskuterats, yrkesverksamma möjlighet att upprätthålla systemhälsa och säkerhet. Att upptäcka och analysera BSOD-loggar och oväntade avstängningar blir en strömlinjeformad process som säkerställer effektiv och säker drift.

Nästa steg

För att bygga upp ett effektivt och handlingskraftigt IT-team krävs en centraliserad lösning som fungerar som ett centralt redskap för att leverera IT-tjänster. NinjaOne gör det möjligt för IT-teams att övervaka, hantera, säkra och stödja alla sina enheter, oavsett var de befinner sig, utan behovet av en komplex infrastruktur på plats.

Lär dig mer om NinjaOne endpoint-hantering, ta en live tour, eller starta en gratis provperiod av NinjaOne.

Kategorier:

Du kanske även gillar

×

Se NinjaOne i aktion!

Genom att skicka detta formulär accepterar jag NinjaOne:s integritetspolicy.

NinjaOne Villkor och bestämmelser

Genom att klicka på knappen ”Jag accepterar” nedan anger du att du accepterar följande juridiska villkor samt våra användarvillkor:

  • Äganderätt: NinjaOne äger och kommer att fortsätta att äga alla rättigheter, titlar och intressen i och till manuset (inklusive upphovsrätten). NinjaOne ger dig en begränsad licens att använda skriptet i enlighet med dessa juridiska villkor.
  • Begränsning av användning: Du får endast använda skriptet för dina legitima personliga eller interna affärssyften, och du får inte dela skriptet med någon annan part.
  • Republikbildning Förbud: Du får under inga omständigheter återpublicera skriptet i något skriptbibliotek som tillhör eller kontrolleras av någon annan programvaruleverantör.
  • Friskrivning från garantiansvar: Skriptet tillhandahålls ”i befintligt skick” och ”som tillgängligt”, utan garanti av något slag. NinjaOne ger inga löften eller garantier om att skriptet kommer att vara fritt från defekter eller att det kommer att uppfylla dina specifika behov eller förväntningar.
  • Antagande av risk: Din användning av skriptet sker på egen risk. Du bekräftar att det finns vissa inneboende risker med att använda skriptet, och du förstår och tar på dig var och en av dessa risker.
  • Avstående och befrielse: Du kommer inte att hålla NinjaOne ansvarig för några negativa eller oavsiktliga konsekvenser till följd av din användning av skriptet, och du avstår från alla juridiska eller skäliga rättigheter eller rättsmedel som du kan ha mot NinjaOne i samband med din användning av skriptet.
  • EULA: Om du är en NinjaOne-kund omfattas din användning av skriptet av det licensavtal för slutanvändare som gäller för dig (EULA).