Как проанализировать etl-файл с помощью Powershell и получить полезную нагрузку без преобразования в другой тип файла

#powershell

#powershell

Вопрос:

Я пробовал:

 $path = "xxx/xxx.etl"
Get-WinEvent -path $path -Oldest
 

но он показывает только события, а не полезную нагрузку.

Ответ №1:

Я думаю, что Microsoft.Диагностика.Трассировка.Библиотека TraceEvent — это то, что вам нужно: https://github.com/microsoft/perfview/blob/master/documentation/TraceEvent/TraceEventLibrary.md

Вот пример того, как использовать его в PowerShell, протестированный в 5.1 и 7.1.

 using namespace Microsoft.Diagnostics.Tracing.Etlx
using namespace System.Security.Principal

# Check if Microsoft.Diagnostics.Tracing.TraceEvent is installed, else install before continuing
if (-not (Get-Package -Name Microsoft.Diagnostics.Tracing.TraceEvent -ErrorAction SilentlyContinue)) {
    "TraceEvent package not foumd, trying to install. This may take a few minutes..."
    # Veryify the current user is part of the administrators group before trying to install package
    if ([WindowsPrincipal]::new([WindowsIdentity]::GetCurrent()).IsinRole([WindowsBuiltInRole]::Administrator)) {
        [void](Install-Package -Name Microsoft.Diagnostics.Tracing.TraceEvent -Force -ForceBootstrap)
    }
    else {
        Write-Warning "Administrator privileges required to install TraceEvent package, re-run script as administrator."
        exit
    }
}
$PackagePath = Get-Package -Name Microsoft.Diagnostics.Tracing.TraceEvent | Select-Object -ExpandProperty Source
$AssemblyPath =  Join-Path (Split-Path $PackagePath) 'libnet45Microsoft.Diagnostics.Tracing.TraceEvent.dll'
try {
    "Loading assembly."
    Add-Type -Path $AssemblyPath
}
catch {
    'Add-Type failed, using [System.Reflection.Assembly]::LoadFrom'
    [void]([System.Reflection.Assembly]::LoadFrom($AssemblyPath))
}
$EtlFile = 'C:scriptlabTestsETLNtKernel.etl'
$TraceLog = [TraceLog]::OpenOrConvert($EtlFile) 
 

Конечно, вам нужно будет изменить путь к $EtlFile .

После запуска у вас должны быть все ваши события $TraceLog.Events , включая полезную нагрузку. Если вы запустите, например. @($TraceLog.Events)[0] | Get-Member *payload* вы получите этот список методов, связанных с полезной нагрузкой:

 Name                MemberType Definition
----                ---------- ----------
PayloadByName       Method     System.Object PayloadByName(string propertyName)
PayloadIndex        Method     int PayloadIndex(string propertyName)
PayloadString       Method     string PayloadString(int index, System.IFormatProvider formatProvider)
PayloadStringByName Method     string PayloadStringByName(string propertyName, System.IFormatProvider formatProvider)
PayloadValue        Method     System.Object PayloadValue(int index)
PayloadNames        Property   string[] PayloadNames {get;}
 

Вы можете установить библиотеку перед запуском скрипта с помощью

 Install-Package -Name Microsoft.Diagnostics.Tracing.TraceEvent
 

или просто запустите скрипт от имени администратора в первый раз. Обратите внимание, что установка пакета может занять некоторое время, поэтому просто дайте ему запуститься.

Если у вас возникнут проблемы с установкой пакета, возможно, стоит убедиться, что ваш модуль PackageManagement обновлен с помощью чего-то вроде:

 Update-Module -Name PackageManagement -Verbose