5

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

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

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

4

3 回答 3

5

坚强...

我寻找一种使用 .NET 方法填充用户字段的方法。不幸的是,没有,您必须导入普通的旧 Win32 API [ReportEvent 函数]( http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx )DLLImportAttribute

正如Platform Invoke Data Types所说,您还必须使用正确的类型重新声明函数

所以

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

于 2008-10-01T20:53:30.907 回答
0

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

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

于 2008-09-29T02:26:45.500 回答
0

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

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

于 2008-09-29T02:36:00.737 回答