.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