Данный скрипт решает задачу сбора и анализа дампов, собранных со всех доменных машин. Такое решение возникло в результате необходимости отобразить масштаб проблемы с антивирусным ПО, регулярно отправляющим систему в 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
В нашей ситуации такой отчет позволил продемонстрировать наличие массовости проблемы и следовательно необходимости обновления либо смены антивирусного ПО