Используйте C # для сбора журналов событий за указанный период времени - PullRequest
1 голос
/ 26 марта 2012

Кто-нибудь знает, возможно ли сохранить журналы событий Windows с заданного интервала времени в виде текстового файла на C #?Например, я хочу сохранить журналы системных событий с 10 до 11 часов утра в текстовом файле.Если это возможно, есть ли у кого-нибудь ссылка на хороший учебник или, возможно, фрагмент кода, который мог бы помочь мне?Я искал в Интернете, но не могу получить то, что ищу.

Ответы [ 2 ]

4 голосов
/ 26 марта 2012
3 голосов
/ 28 апреля 2014

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

Обратите внимание, что TimeGenerated - это когда события происходят, а TimeWritten - когда они регистрируются. 'RecordNumber' - это уникальный индекс, полезный для предотвращения коллизий или дублирования регистрации.

Существует System.Management.ManagementDateTimeConverter , который преобразует между C # DateTime и форматом WMI CIM_DATETIME. Но имейте в виду, что UTC CIM превращается в МЕСТНЫЙ DateTime, оставляя Kind Unspecified, поэтому установите Kind впоследствии, чтобы избежать головной боли!

Это пример захвата сбоев безопасности (для отслеживания блокировок) за последние 30 минут:

private void SearchEventViewer(string computerName, string userName, string userPass)
{
    var scope = CreateManagementScope(computerName, userName, userPass);
    var startTime = ManagementDateTimeConverter.ToDmtfDateTime(DateTime.UtcNow.AddMinutes(-30));
    var query = new SelectQuery("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND EventType = '5' AND TimeGenerated > '" + startTime + "'");

    using (var searcher = new ManagementObjectSearcher(scope, query))
    {
        var result = searcher.Get();

        foreach (var item in result)
        {
            var eventTimeLocal = DateTime.SpecifyKind(ManagementDateTimeConverter.ToDateTime(item["TimeGenerated"].ToString()), DateTimeKind.Local);
            var eventTimeUtc   = eventTimeLocal.ToUniversalTime();

            var eventDetails = item["Message"].ToString().Replace("\r\n\r\n", "\r\n");
            eventDetails += "\r\nEventCode: "     + item["EventCode"];
            eventDetails += "\r\nCatogory: "      + item["Category"];
            eventDetails += "\r\nRecord Number: " + item["RecordNumber"];
            eventDetails += "\r\nLocal Time: "    + eventTimeLocal.ToString("yyyy-MM-dd HH:mm:ss");

            // Do something...
        }
    }
}

private ManagementScope CreateManagementScope(string computerName, string username = "", string password = "")
{
    var managementPath = @"\\" + computerName + @"\root\cimv2";
    var scope = new ManagementScope(managementPath);

    if (username != "" && password != "")
    {
        scope.Options = new ConnectionOptions
        {
            Username = username,
            Password = password,
            Impersonation = ImpersonationLevel.Impersonate,
            Authentication = AuthenticationLevel.PacketPrivacy
        };
    }

    return scope;
}
...