C# .NET:如何在事件日志条目中设置用户信息?

C# .NET:如何在事件日志条目中设置用户信息?,c#,.net,vb.net,event-log,C#,.net,Vb.net,Event Log,System.Diagnostics.EventLog类提供了与windows事件日志交互的方法。我一直用它来做简单的日志记录 System.Diagnostics.EventLog.WriteEntry("MyEventSource", "My Special Message") 是否有办法使用.NET在生成的事件日志条目中设置用户信息?您需要自己将其添加到事件消息中 使用System.Security.Principal命名空间获取记录事件的线程的当前标识。通常,执行调用EventLog.

System.Diagnostics.EventLog类提供了与windows事件日志交互的方法。我一直用它来做简单的日志记录

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

是否有办法使用.NET在生成的事件日志条目中设置用户信息?

您需要自己将其添加到事件消息中


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

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

您可以尝试通过创建自己的主体和身份并将其与当前线程关联来模拟另一个用户,但不建议这样做,因为这可能会带来安全问题,并且肯定会使您的应用程序复杂化。

Toughie

我寻找了一种用.NET方法填充用户字段的方法。不幸的是,没有,您必须导入普通的旧Win32 API[ReportEvent函数](带有
DLLImportAttribute

您还必须使用正确的类型重新声明函数,如

所以

变成

[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](


哦,您现在正在编写非托管代码……请注意内存泄漏。祝您好运:p

不是来自托管代码。从托管代码调用底层api的说明如下:
[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
);