Запись в Windows EventLog из произвольного источника
Я пытаюсь записать в Windows EventLog из разных источников, чтобы воссоздать серию событий в моей системе. Идея состоит в том, чтобы я мог взять XML-код события и воссоздать его в EventLog. До сих пор я выяснил, как создать простое событие из произвольного поставщика на основе имени источника с помощью EventLog.WriteEntry("Service Control Manager", "a test message", EventLogEntryType.Information, 7036, 0);
но это только классический журнал, который не поддерживает более продвинутую структуру данных, которая мне нужна для имитации современного журнала. Я пытался использовать System.Diagnostics.Eventing.EventProvider.WriteEvent, но это работает только для некоторых GUID провайдера (я могу заставить его работать для устранения неполадок питания, но не для диспетчера управления службами, например). Я не смог ничего найти в интернете, и я искал несколько дней, было бы очень полезно, если бы кто-нибудь знал, как это сделать - на C# или нет.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics.Eventing;
using System.Diagnostics;
namespace ETWDemo
{
class Program
{
static void Main(string[] args)
{
//This writes a simple message event
EventLog.WriteEntry("Service Control Manager", "a basic message", EventLogEntryType.Information, 7036, 0);
//The rest of this writes a modern EventLog
//this is the GUID for the Service Control Manager
var eventProvider = new EventProvider(new Guid("{555908d1-a6d7-4695-8e1e-26931d2012f4}"));
if (eventProvider.IsEnabled())
Console.WriteLine("Provider is enabled");
//Outputs 'True' on my system
EventDescriptor eventDescriptor;
unchecked
{
eventDescriptor = new EventDescriptor(
7036, //EventId
0, //Version
0x0, //Channel Id
0x4, //Level
0x0, //OpCode
0x0, //Task
(long)0x8000000000000000); //Keywords
}
var wroteOk = eventProvider.WriteEvent(ref eventDescriptor, "pls", "wrk");
if (wroteOk)
Console.WriteLine("Claims to have written correctly");
else
Console.WriteLine("Did not write correctly");
//Console outputs "Claims to have written correctly", but nothing changes in the eventLog
}
}
}