如何让EventLog将用户名记录到Window事件日志中?

我正在使用C#写入Windows事件日志 。 我可以在mmc.exe“计算机管理”工具中设置每个字段,但“用户”字段除外。

客户端应用程序是ASP.NET并使用表单身份validation。

public static void WriteOnce() { EventLog log = new EventLog("MyApp"); if (!EventLog.SourceExists("MySource")) { EventSourceCreationData data = new EventSourceCreationData("MySource", "MyApp"); EventLog.CreateEventSource(data); } log.Source = "MySource"; log.WriteEntry("Hello World", EventLogEntryType.Information,123,456,new byte[]{1,2,3}); } 

更新:我在ASP.NET中检查过,即使设置了标识impersonation = true&authentication = windows且仍然没有用户。

我还在控制台应用程序中检查了没有用户。

用户是您的AppDomain运行的当前用户。 这不能设置,Windows不允许您“欺骗”其他用户。

事件日志中的用户名基于运行应用程序的上下文。 它无法明确设置。 如果这是一个ASP.NET应用程序,则可能正在使用该服务帐户。

编辑:我发现了一个类似的问题 。 它建议使用Win32 Api ReportEvent函数来设置用户信息。

System.Diagnostics允许您的ASP.NET应用程序直接访问Windows事件日志。 由于您的应用程序是ASP.NET应用程序,因此您可以使用

HttpContext.Current.User.Identity.Name

获取当前用户名(在这种情况下,由于您使用的是表单身份validation,因此将是表单身份validation令牌)。

我发现了一个博客条目,解释了如何做到这一点,虽然似乎没有完全可管理的方式来做到这一点。 要捕获用户ID,您必须使用pinvoke / native方法调用。

http://www.infosysblogs.com/microsoft/2007/09/logging_events_with_user_detai_1.html

对于上述情况,它将用户记录为ASPNET或NETWORK SERVICES,或登录用户的控制台应用程序。 api调用本身将指针参数带到SID。 我没有试着看看欺骗是否可行。

JPucket可能是正确的,在系统事件日志中获取表单身份validation用户的ID的唯一方法是通过消息字段。