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

时间:2009-06-08 14:59:31

标签: c# event-log

我正在使用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但仍然没有用户。

我还在控制台应用中检查过没有用户。

4 个答案:

答案 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的唯一方法是通过消息字段。