5

我正在使用 C#写入Windows 事件日志。我可以设置 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 中进行了检查,即使设置了身份模拟=true & authentication=windows 并且仍然没有用户。

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

4

4 回答 4

2

那么用户是您的 AppDomain 正在运行的当前用户。这无法设置,Windows 将不允许您“欺骗”其他用户。

于 2009-06-08T15:03:30.203 回答
2

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

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

于 2009-06-08T15:04:40.297 回答
1

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

HttpContext.Current.User.Identity.Name

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

于 2009-06-08T15:30:45.827 回答
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 的唯一方法是通过消息字段。

于 2009-06-08T16:30:19.620 回答