#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