Log Parser — запрос через MSUtill и чтение записи через коды C#

я нахожу много тем о Log Parser, но ни одна из них не соответствует моему желанию,

мне нужно применить этот запрос к синтаксическому анализатору журнала, выберите * из безопасности

И получите строки событий, затем прочитайте их строку за строкой, зная, к какому столбцу я обращаюсь...

пожалуйста помоги...

что должно быть отключено: 1. Запросить событие Windows через LogParser.dll (с использованием библиотеки MSUtill) 2. Получить и поместить строки в любой контейнер 3. Прочитать строки одну за другой 4. Быть способным отделить каждую ячейку строки и прочитать их отдельно, как столбец идентификатора события доступа или столбец сообщений...


--К вопросу

были вещи, но я их не понял, например, человек использует это, берет одну строку, а мне нужно несколько строк, мне интересно, что конвертировать дальше: | какой класс мне нужно использовать

LogQueryClass logger = new LogQueryClassClass();
            COMIISW3CInputContextClass inputContext = new COMIISW3CInputContextClassClass();
            string query = // i change it during test
            ILogRecord record = logger.Execute(query, inputContext).getRecord();

или другое использование этого: кажется, что тоже возвращается один результат

// prepare LogParser Recordset & Record objects
            ILogRecordset rsLP = null;
            ILogRecord rowLP = null;

            LogQueryClassClass LogParser = null;
            COMW3CInputContextClassClass W3Clog = null;

            double UsedBW = 0;
            int Unitsprocessed;
            double sizeInBytes;

            string strSQL = null;

            LogParser = new LogQueryClassClass();
            W3Clog = new COMW3CInputContextClassClass();

            try
            {
                //W3C Logparsing SQL. Replace this SQL query with whatever 
                //you want to retrieve. The example below 
                //will sum up all the bandwidth
                //Usage of a specific folder with name 
                //"userID". Download Log Parser 2.2 
                //from Microsoft and see sample queries.

                strSQL = //the query (i changed it during test)

                // run the query against W3C log
                rsLP = LogParser.Execute(strSQL, W3Clog);

                rowLP = rsLP.getRecord();

                Unitsprocessed = rsLP.inputUnitsProcessed;

                if (rowLP.getValue(0).ToString() == "0" ||
                    rowLP.getValue(0).ToString() == "")
                {
                    //Return 0 if an err occured
                    UsedBW = 0;
                    return UsedBW;
                }

                //Bytes to MB Conversion
                double Bytes = Convert.ToDouble(rowLP.getValue(0).ToString());
                UsedBW = Bytes / (1024 * 1024);

лучший запрос, который я нашел, был таким, он ищет внутри реестра (у меня нет исходного запроса, так как я его изменил

ILogRecordset rs = null;
            try
            {
                LogQueryClass qry = new LogQueryClass();
                COMRegistryInputContextClass registryFormat = new COMRegistryInputContextClass();
                string query = //Chnaged it
                rs = qry.Execute(query, registryFormat);
                for (; !rs.atEnd(); rs.moveNext())
                    Console.WriteLine(rs.getRecord().toNativeString(","));
            }
            finally
            {
                rs.close();
            }

также есть вещи, которые, похоже, возвращают данные в SQL не как живой объект: |

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

--Редактировать:

позвольте мне добавить, что мой запрос (с использованием аргумента «log parser.exe») был таким, но для меня так грубо вызывать exe-файл внутри службы.

myProc.StartInfo.Arguments = " \"select * INTO AuditLogParser from \\\\" + Dns.GetHostName() +
                                         "\\security WHERE TimeGenerated >= '" + startDate +
                                         "' and TimeGenerated <'" + endDate +
                                         "' and (eventid=560 or eventid=540)\" -o:SQL -server:\"" +
                                         Dns.GetHostName() +
                                         "\\sqlexpress\"  -database:SecurityLog -driver:\"SQL Server\" -username:TrainAudit -password:Password.110 -createtable:OFF";

person deadManN    schedule 09.05.2012    source источник
comment
комментарий не имеет емкости, и это не позволяет мне публиковать ответ в течение 8 часов: |   -  person deadManN    schedule 09.05.2012
comment
я выполняю редактирование, проверьте основной пост   -  person deadManN    schedule 09.05.2012


Ответы (1)


Следующий пример кода использует LogParser для чтения имени и размера файла из локального каталога с именем C:\Bat.

LogQueryClass logQuery = new LogQueryClassClass();

COMFileSystemInputContextClass inputFormat = new COMFileSystemInputContextClassClass();
inputFormat.recurse = 0;

String strQuery = @"SELECT Name, Size FROM 'C:\Bat\*.*' ORDER BY Name ASC";

ILogRecordset results = logQuery.Execute(strQuery, inputFormat);
while (! results.atEnd())
{
    Console.WriteLine(String.Format("File: {0} Size: {1}", results.getRecord().getValue("Name"), results.getRecord().getValue(1)));
    results.moveNext();
}

Обратите внимание, что я могу получить доступ к столбцу по имени столбца из запроса или по индексу столбца.

person Joshua Drake    schedule 10.05.2012
comment
Кстати, вам не кажется грубым разбирать в файл :| то, что я хочу, это не хранить данные в файле, я хочу что-то вроде моего третьего примера, который начинается с этой строки: ILogRecordset rs = null; но, как ваш пример, с индексированным выводом или выводом экземпляра класса... - person deadManN; 11.05.2012
comment
Хм? Это не анализируется в файл. Приведенный выше код получает набор записей и перебирает его. Что еще вы хотите? - person Joshua Drake; 11.05.2012
comment
ага, извините, он читается из файла :D вау, кстати, этот анализатор логов очень мощный, я вижу, что пользователи используют его везде :-s - person deadManN; 11.05.2012
comment
чувак, кстати, это COMFileSystemInputContextClass, я хочу сделать запрос через таблицы системных событий, которые находятся в безопасности, теперь какой класс мне следует использовать? мой запрос через logparser2.2.exe в качестве аргумента был: \select * INTO AuditLogParser from \\\\ + Dns.GetHostName() +\\security WHERE TimeGenerated ›= '+ startDate +' and TimeGenerated ‹' + endDate +' и (eventid=560 или eventid=540)\ -o:SQL -server:\ +Dns.GetHostName() +\\sqlexpress\ -database:SecurityLog -driver:\SQL Server\ -username:TrainAudit -password:Password. 110 -создается:ВЫКЛ. - person deadManN; 11.05.2012
comment
Я угадаю COMEventLogInputContextClass и COMSYSLOGOutputContextClass соответственно. - person Joshua Drake; 11.05.2012
comment
все они возвращают пару ключ-значение? как предыдущий образец? я имею в виду, что я могу получить к ним доступ только по индексной строке или индексному номеру, верно? Кстати, tnx, за вашу проблему ... я обнаружил новую проблему, из-за которой ОС не позволяет мне получить доступ к журналу безопасности Windows с \\‹DNS Host Name›\Security, поэтому я должен исправить это, прежде чем продолжить - person deadManN; 12.05.2012