0

ファイルのアクセス、読み取り、書き込み、削除を監視するアプリケーションを構築しています。

Windows 7 Pro で組み込みの監査システムを使用しています。gpedit.msc で有効にし、監視するファイルの監査フラグを設定すると、セキュリティ ログにエントリが記録されます。

私がやりたいことは、セキュリティ ログをリアルタイムで監視することです。これは次のように行います。

static EventLog securityLog = new EventLog("Security", System.Environment.MachineName);

securityLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
securityLog.EnableRaisingEvents = true;

これは機能し、私のOnEntryWritten-Function を呼び出します。

public static void OnEntryWritten(object source, EntryWrittenEventArgs entry)

entry.Entry追加情報が含まれているEntryWrittenEventArgs.Entryため、必要なエントリの XML プロパティにアクセスできないようです。

後で実行しようとしているのは、別の を介してイベント ログにクエリを実行するEventLogReaderことです。entry.Entry.IndexeventInstance.RecordIdEventLogReader

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">">*[System[(EventRecordID=181616)]]</Select>
  </Query>
</QueryList>

イベント ログで直接 XPath クエリとして機能し、エントリを 1 つだけ返します。

string query = "*[System[(EventRecordID=" + entry.Entry.Index + ")]]";

// Create Event Log Query and Reader
EventLogQuery eventsQuery = new EventLogQuery("Security",
                                              PathType.LogName,
                                              query);

EventLogReader logReader = new EventLogReader(eventsQuery);

// For each event returned from the query
for (EventRecord eventInstance = logReader.ReadEvent(); eventInstance != null; eventInstance = logReader.ReadEvent())
            {
                if (eventInstance.RecordId == entry.Entry.Index)  //RecordId and Index are the same thing: the identifier of the record/entry. 
                {
                    XDocument xml;
                    try
                    {
                        xml = XDocument.Parse(logReader.ReadEvent().ToXml());
                    }

                    catch (Exception e)
                    {
                        //logger.Write(e.Message.ToString());
                        break;      //We seem to have a newline character in the logReader.ReadEvent() sometimes, but nothing else, so we can safely break here or completely ignore it.
                    }

xml を取得しようとすると失敗します。なぜですか?

「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されます。ですSystem.NullReferenceException。このエラーが実際にどのように発生するかはわかりません。

このようにログを照会すると

EventLogQuery eventsQuery = new EventLogQuery("Security",
                                              PathType.LogName,
                                              "*[EventData[Data[@Name='ObjectType'] and (Data='File')]] ");

問題なく動作します。

とにかく、これを行う最善の方法は何ですか?

4

3 に答える 3