System.Diagnostics.EventLog 类提供了一种与 Windows 事件日志交互的方法。我一直用它来进行简单的日志记录...
System.Diagnostics.EventLog.WriteEntry("MyEventSource", "My Special Message")
有没有办法使用 .NET 在生成的事件日志条目中设置用户信息?
坚强...
我寻找一种使用 .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
您需要自己将其添加到事件消息中。
使用 System.Security.Principal 命名空间来获取记录事件的线程的当前标识。
通常,执行调用 EventLog.WriteEntry 方法的代码的用户将是该条目的事件日志中显示的用户。
您可以尝试通过创建自己的 Principal 和 Identity 并将其与当前线程关联来模拟另一个用户,但是不建议这样做,因为它可能会引入安全问题并且肯定会使您的应用程序复杂化。