Автоматизация сбора и анализа дампов Windows

Данный скрипт решает задачу сбора и анализа дампов, собранных со всех доменных машин. Такое решение возникло в результате необходимости отобразить масштаб проблемы с антивирусным ПО, регулярно отправляющим систему в BSOD

Перед использованием скрипта нужно обеспечить 3 пререквизита:

1) Установить модуль WintellectPowerShell

Install-Module WintellectPowerShell

2) Установить SDK.
Ссылку на SDK найдете тут.
Выберите образ соответствующий версии вашей системы.

После загрузки образа нужно будет выполнить установку только Debug компонентов — в них входит необходимый нам для работы модуля исполняемый файл cdb.exe

3) Создайте файл C:\Temp\BasicAnalysis.txt и сохраните туда текст: !analyze -v

Код скрипта с комментариями:

# Настройка фильтра и получение списка всех доменных ПК, кроме серверов
$comps = (Get-ADComputer -f {Enabled -eq $true} | ?{ $_.DistinguishedName -notmatch 'OU=Servers'}).Name

$List = New-Object 'System.Collections.Generic.List[System.Object]'
foreach($comp in $comps ){

Write-Host $comp -ForegroundColor Green
# Проверяем доступность ПК и наличия папки для дампов
if( $(Test-Connection $comp -Count 1 -ErrorAction SilentlyContinue) -and $(Test-Path "\\$comp\c$\Windows\Minidump\" -ErrorAction SilentlyContinue ) ){
        
        # Определяем типа найденного дампа: mini или full
        if( $mini = dir "\\$comp\C$\Windows\Minidump" -ea SilentlyContinue | sort LastWriteTime -Descending | %{ Get-Date $_.LastWriteTime -UFormat "%d/%m/%Y %T"}  ){
        Write-Host "Mini dump: $($mini)" -ForegroundColor Yellow
        }

        if( $FullDump = dir "\\$comp\C$\Windows\MEMORY.DMP" -ea SilentlyContinue | %{ Get-Date $_.LastWriteTime -UFormat "%d/%m/%Y %T"}  ){
        Write-Host "Full dump: $($FullDump)" -ForegroundColor Red
        }

        # Автоматизируем расшифровку дампа
            # Что бы не копился мусор, очищаем папку в каждой итерации
            Remove-Item "C:\Temp\Dump\*" -ErrorAction SilentlyContinue
            # Копируем последний файл минидампа
            Copy-Item $(dir "\\$comp\c$\Windows\Minidump\" | sort LastWriteTime | select -Last 1).fullname "C:\Temp\Dump\"
            # Получаем расшифровку дампа в текстовый файл
            Get-DumpAnalysis -files (dir 'C:\Temp\Dump\*.dmp') -CdbProgramPath "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -DebuggingScript "C:\Temp\BasicAnalysis.txt"
            # Файл BasicAnalysis.txt должен содержать одну инструкцию для базового анализа дампов: !analyze -v
            # Записываем полученную расшифровку в переменную
            $log = New-Object 'System.Collections.Generic.List[System.Object]'            
            (dir "C:\Temp\Dump\*.log" | select -Last 1 | Get-Content) | %{ $log.Add( $_ ) }
            $log.RemoveAt(0)      
            $log[32]

            $log = dir "C:\Temp\Dump\*.log" | select -Last 1 | Get-Content

            # Парсим необходимые строки
            $Error_about = ($log | Select-String '[\S]*\s\([\d]+\)(?=)' ).Matches.Value
            $OSNAME = ($log | Select-String 'OSNAME:\s*(.*\b)' ).Matches.Groups[1].Value
            $Error_code =  ( $log | Select-String 'Kernel base = (0x[\w\d]{8})').Matches.Groups[1].Value
            $SYMBOL_NAME = (($log | Select-String 'SYMBOL_NAME') -replace "SYMBOL_NAME:" ).TrimStart()
            $MODULE_NAME = (($log | Select-String 'MODULE_NAME') -replace "MODULE_NAME:" ).TrimStart()
            $IMAGE_NAME =  (($log | Select-String 'IMAGE_NAME') -replace "IMAGE_NAME:" ).TrimStart()
            $IMAGE_VERSION = (($log | Select-String 'IMAGE_VERSION') -replace "IMAGE_VERSION:" ).TrimStart()

            $List.add( ( @{CompName=$comp;OS=$OSNAME;error_about=$Error_about;Error_code=$Error_code;SYMBOL_NAME=$SYMBOL_NAME;MODULE_NAME=$MODULE_NAME;IMAGE_NAME=$IMAGE_NAME;IMAGE_VERSION=$IMAGE_VERSION;MiniDump=$mini;FullDump=$FullDump;} | % { New-Object object | Add-Member -NotePropertyMembers $_ -PassThru }) )

        Write-Host `n
    }

Clear-Variable Matches,mini,FullDump,Error_about,OSNAME,Error_code,SYMBOL_NAME,MODULE_NAME,IMAGE_NAME,IMAGE_VERSION,Error_code

}

$List | ? { $_.FullDump -ne $null -or $_.MiniDump -ne $null } |`
select CompName,OS,error_about,Error_code,SYMBOL_NAME,MODULE_NAME,IMAGE_NAME,IMAGE_VERSION,FullDump, @{Name="MiniDump";Expression={ $_.MiniDump -join ';'  }} | Export-Csv -NoTypeInformation -Path C:\Temp\BsodDumpReport_parse.csv -Delimiter ';'

В результате мы получим файл, который можно открыть в Excell

В нашей ситуации такой отчет позволил продемонстрировать наличие массовости проблемы и следовательно необходимости обновления либо смены антивирусного ПО

Добавить комментарий

Ваш адрес email не будет опубликован.