Как получить EventLog для записи имени пользователя в журнал событий Windows? - PullRequest
5 голосов
/ 08 июня 2009

Я пишу в журнал событий Windows , используя C #. Я могу установить все поля, видимые в инструменте управления компьютером 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, даже если задано олицетворение идентичности = истина и аутентификация = окна и до сих пор нет пользователя.

Я также проверил, в консольном приложении нет пользователя.

Ответы [ 4 ]

2 голосов
/ 08 июня 2009

Имя пользователя в журнале событий зависит от контекста, в котором работает ваше приложение. Это не может быть явно установлено. Если это приложение ASP.NET, возможно, оно использует учетную запись службы.

РЕДАКТИРОВАТЬ: Я нашел аналогичный вопрос . Он предлагает использовать функцию Win32 Api ReportEvent для установки информации о пользователе.

2 голосов
/ 08 июня 2009

Ну, пользователь является текущим пользователем, под которым работает ваш AppDomain. Это нельзя установить, и Windows не позволит вам «подделать» другого пользователя.

1 голос
/ 08 июня 2009

System.Diagnostics разрешает вашему приложению ASP.NET прямой доступ к журналу событий Windows. Поскольку ваше приложение является приложением ASP.NET, вы можете использовать

HttpContext.Current.User.Identity.Name

для получения текущего имени пользователя (в данном случае это будет токен аутентификации формы, поскольку вы используете аутентификацию форм).

0 голосов
/ 08 июня 2009

Я нашел запись в блоге, в которой объясняется, как это сделать, хотя, похоже, нет полностью управляемого способа сделать это. Чтобы перехватить идентификатор пользователя, вы должны использовать вызовы метода pinvoke / native.

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

Для вышеизложенного он регистрирует пользователя как ASPNET или NETWORK SERVICES или зарегистрированного пользователя для консольных приложений. Сам вызов API принимает параметр указателя на SID. Я не пытался выяснить, возможна ли подделка.

JPucket может быть прав, что единственный способ получить идентификатор пользователя, прошедшего проверку подлинности с помощью форм, в журнале системных событий - через поле сообщения.

...