2

Log Parserに関するスレッドをたくさん見つけましたが、どれも私の欲求を満たしていません。

このクエリをログパーサーに適用する必要がありますselect*from security

そして、イベント行を取得してから、どの列にアクセスするかを知って、行ごとにそれらを読み取ります...

助けてください...

ダウンする必要があるもの:1.LogParser.dllを介したWindowsイベントのクエリ(MSUtillライブラリを使用)2。任意のコンテナ内の行を取得して配置します3.行を1つずつ読み取ります4.行の各セルを分離して読み取ることができますアクセスイベントID列、またはメッセージ列のように個別に..。


-質問へ

いくつかありましたが、私はそれらを取得しませんでした。たとえば、人はこれを使用し、単一の行を取りますが、複数の行が必要です。次に何を変換するのか疑問に思います:| どのクラスを使用する必要がありますか

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";
4

1 に答える 1

5

次のサンプルコードは、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();
}

クエリからの列の名前または列インデックスによって列にアクセスできることに注意してください。

于 2012-05-10T20:50:03.593 に答える