.NET:如何在EventLog条目中设置用户信息?

时间:2020-03-06 14:51:29  来源:igfitidea点击:

System.Diagnostics.EventLog类提供了一种与Windows事件日志进行交互的方法。我一直在使用它进行简单的日志记录...

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

有没有一种方法可以使用.NET在生成的事件日志条目中设置用户信息?

解决方案

我们需要将其自己添加到事件消息中。

使用System.Security.Principal命名空间获取记录事件的线程的当前标识。

通常,执行调用EventLog.WriteEntry方法的代码的用户将是条目的事件日志中显示的用户。

我们可以尝试通过创建自己的Principal和Identity并将其与当前线程关联来模拟其他用户,但是不建议这样做,因为这可能会引入安全性问题,并且肯定会使应用程序复杂化。

顽皮...

我寻找一种用.NET方法填充用户字段的方法。不幸的是,没有任何东西,我们必须导入带有DLLImportAttribute`的普通的旧Win32 API ReportEvent函数

我们还必须使用正确的类型重新声明该函数,如平台调用数据类型所述

所以

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和[ConvertStringSidToSid](http://msdn.microsoft.com/ zh-CN / library / aa376402(VS.85).aspx)

哦,我们现在正在编写非托管代码...当心内存泄漏。祝我们好运:p