Делегаты PowerShell и.NET (трассировка событий для Windows)
Я пытаюсь использовать библиотеку krabsetw ( https://github.com/Microsoft/krabsetw) из скрипта PowerShell. Сценарий может создать сеанс и правильно его настроить, но не может использовать какие-либо события.
Автор сценария:
Function Parse-ETW()
{
Param([O365.Security.ETW.IEventRecord] $record)
Write-Host $record.Id
}
$Trace = New-Object -TypeName O365.Security.ETW.UserTrace -ArgumentList @("Session-$([System.Guid]::NewGuid())")
$Provider = New-Object -TypeName O365.Security.ETW.Provider -ArgumentList @([System.Guid]::Parse("{1C95126E-7EEA-49A9-A3FE-A378B03DDB4D}"))
$Provider.Any = [O365.Security.ETW.Provider]::AllBitsSet
$Job = Register-ObjectEvent -InputObject $Provider -EventName "OnEvent" -Action {Parse-ETW -record $EventArgs}
$Trace.Enable($Provider)
$Trace.Start()
Я также попробую "простую" форму действий:
Register-ObjectEvent -InputObject $Provider -EventName "OnEvent" -Action {Write-Host "Event arrived"}
Также нет результатов. Есть идеи, как заставить это работать?
C# подпись метода, потребляющего события:
public delegate void IEventRecordDelegate(IEventRecord record);
Рабочий код C#
using System;
using O365.Security.ETW;
namespace ManagedExamples
{
public static class DnsTrace
{
public static void Main()
{
var trace = new UserTrace();
var dnsProvider = new Provider(Guid.Parse("{1C95126E-7EEA-49A9-A3FE-A378B03DDB4D}"));
dnsProvider.Any = Provider.AllBitsSet;
dnsProvider.OnEvent += (record) =>
{
Console.WriteLine("Event " + record.Id + " (" + record.Name + ") received.");
};
trace.Enable(dnsProvider);
trace.Start();
}
}
}