я нахожу много тем о 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";