我正在使用C#写windows event log。我可以在mmc.exe“计算机管理”工具中设置每个字段,但用户字段除外。
客户端应用程序是ASP.NET并使用表单身份验证。
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中检查过,即使set identity impersonation = true& authentication = windows但仍然没有用户。
我还在控制台应用中检查过没有用户。
答案 0 :(得分:2)
用户是您的AppDomain运行的当前用户。这不能设置,Windows不允许您“欺骗”其他用户。
答案 1 :(得分:2)
事件日志中的用户名基于运行应用程序的上下文。它无法明确设置。如果这是一个ASP.NET应用程序,则可能正在使用该服务帐户。
编辑:我找到了similar question。它建议使用Win32 Api ReportEvent函数来设置用户信息。
答案 2 :(得分:1)
System.Diagnostics
允许您的ASP.NET应用程序直接访问Windows事件日志。由于您的应用程序是ASP.NET应用程序,因此您可以使用
HttpContext.Current.User.Identity.Name
获取当前用户名(在这种情况下,因为您使用的是表单身份验证,因此将是Form Auth令牌。)
答案 3 :(得分:0)
我发现了一个博客条目,解释了如何做到这一点,尽管似乎没有完全可管理的方式来做到这一点。要捕获用户ID,您必须使用pinvoke / native方法调用。
http://www.infosysblogs.com/microsoft/2007/09/logging_events_with_user_detai_1.html
对于上述内容,它将用户记录为ASPNET或NETWORK SERVICES,或登录用户的控制台应用程序。 api调用本身将指针参数带到SID。我没有试着看看是否可以进行欺骗。
JPucket可能是正确的,在系统事件日志中获取经过身份验证的用户的ID的唯一方法是通过消息字段。