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

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

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

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

Toughie ……

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

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

所以

 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 /库/ aa376402(VS.85)的.aspx)

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

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

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

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

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