.NET: Как установить информацию о пользователе в записи EventLog? - PullRequest
4 голосов
/ 29 сентября 2008

Класс System.Diagnostics.EventLog предоставляет способ взаимодействия с журналом событий Windows. Я использую это все время для простой регистрации ...

System.Diagnostics.EventLog.WriteEntry("MyEventSource", "My Special Message")

Есть ли способ установить информацию о пользователе в итоговой записи журнала событий с помощью .NET?

Ответы [ 3 ]

5 голосов
/ 02 октября 2008

Toughie ...

Я искал способ заполнить поле пользователя методом .NET. К сожалению, их нет, и вы должны импортировать простой старый Win32 API [функция ReportEvent] (http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx) с DLLImportAttribute

Необходимо также повторно объявить функцию с правильными типами, как Типы данных вызова платформы говорит

So

BOOL ReportEvent(
__in  HANDLE hEventLog,
__in  WORD wType,
__in  WORD wCategory,
__in  DWORD dwEventID,
__in  PSID lpUserSid,
__in  WORD wNumStrings,
__in  DWORD dwDataSize,
__in  LPCTSTR *lpStrings,
__in  LPVOID lpRawData
);

становится

[DllImport("Advapi32.dll", EntryPoint="ReportEventW",  SetLastError=true,
CharSet=CharSet.Unicode)]
bool WriteEvent(
  IntPtr hEventLog, //Where to find it ?
  ushort  wType,
  ushort  wCategory,
  ulong dwEventID,
  IntPtr lpUserSid, // We'll leave this struct alone, so just feed it a pointer
  ushort wNumStrings,
  ushort dwDataSize,
  string[] lpStrings,
  IntPtr lpRawData
);

Вы также хотите посмотреть на [OpenEventLog] (http://msdn.microsoft.com/en-us/library/aa363672(VS.85).aspx) и [ConvertStringSidToSid] (http://msdn.microsoft.com/en-us/library/aa376402(VS.85).aspx)

О, и теперь вы пишете неуправляемый код ... Остерегайтесь утечек памяти. Удачи: p

0 голосов
/ 29 сентября 2008

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

Вы можете попробовать выдать себя за другого пользователя, создав собственный Принципал и Идентификацию и связав его с текущим потоком, однако это не рекомендуется, поскольку это может привести к проблемам безопасности и определенно усложнит ваше приложение.

0 голосов
/ 29 сентября 2008

Вам нужно добавить его самостоятельно в сообщение о событии.

Используйте пространство имен System.Security.Principal, чтобы получить текущий идентификатор потока, регистрирующего событие.

...