0

これでウィンドウのイベントログから情報を取得しています:

private void button1_Click(object sender, EventArgs e)
{
  EventLog eventLog;
  eventLog = new EventLog();
  eventLog.Log = "Security";;
  eventLog.Source = "Security-Auditing";
  eventLog.MachineName = "SERVER";

  var count = 0;
  foreach (EventLogEntry log in eventLog.Entries.Cast<EventLogEntry>().Where(log => log.InstanceId == 4625))
  {
    Console.Write("eventLogEntry.Index: {0}{1}", log.Index, Environment.NewLine);
    SaveRecord(log);
    count++;
  }
}

サーバーへの無効なログインをすべてキャプチャし、x回の無効な試行の後にエントリを追加しようとしています。

イベントログをループして問題なく情報を取得していますが、最後に読み取りを停止したレコードを確認するにはどうすればよいですか?ログがより多くの情報を取得したら、読み取りを再開する必要がありますが、開始点が必要です。

EventLogEntryのインデックスを使用できると思っていましたが、情報が見つかりません。私が自分のマシンに持っているものは6桁の数字です。

それはどれくらい信頼できますか?私は何か他のことをするべきですか?代わりにログを読んだ後、そのログをクリアする必要がありますか?

ご入力いただきありがとうございます。

=======私がしたこと========

Apokalの助けを借りて、これが私がしたことです:

/// <summary>
/// Returns all events in the windows event log that match the passed in criteria.
/// If nothing is passed in then it will return all events where the a user attemtped
/// to log into the the machine and gave an invalid username or password.
/// </summary>
/// <param name="eventLogMachineName">The machine where the event log is at.</param>
/// <param name="cutoffdatetime">Date and time of the cut off for the list.</param>
/// <param name="eventLogName">'Log Name' in the event log. This is the folder that the events reside in.</param>
/// <param name="eventLogSource">Event log 'Source'.</param>
/// <param name="instanceId">Filters to a specific 'Event Id' in the event log.</param>
/// <returns></returns>
public static IEnumerable<EventLogEntry> GetEventLogs(string eventLogMachineName,
                                                      DateTime cutoffdatetime,
                                                      string eventLogName = "Security",
                                                      string eventLogSource = "Security-Auditing",
                                                      int instanceId = 4625)
{
  var eventLog = new EventLog {Log = eventLogName, Source = eventLogSource, MachineName = eventLogMachineName};
  return from EventLogEntry log in eventLog.Entries
         where log.InstanceId == instanceId &&
               log.TimeGenerated > cutoffdatetime
         select log;
}

そして私はそれをこのように呼びます:

private void button1_Click(object sender, EventArgs e)
{
  var lastcheckdatetime = Properties.Settings.Default.LastCheckDate;
  if (lastcheckdatetime < (DateTime.Now.AddDays(-30)))
  {
    lastcheckdatetime = DateTime.Now.AddDays(-7);
  }
  var log = EventLogClass.GetEventLogs("TGSERVER", lastcheckdatetime);
  Properties.Settings.Default.LastCheckDate = DateTime.Now;
  Properties.Settings.Default.Save();

  var count = 0;
  foreach (EventLogEntry l in log)
  {
    Console.WriteLine("---------------------");
    Console.Write("eventLogEntry.Index: {0}{1}", l.Index, Environment.NewLine);
    Console.Write("eventLogEntry.TimeGenerated: {0}{1}", l.TimeGenerated, Environment.NewLine);
    count++;
  }
}
4

1 に答える 1

1

私の経験と小さな研究Index財産から、イベントログの作成から始まって書かれたイベントのインデックスが示されています。

しかし、あなたが見逃したことがいくつかあります。

まず、イベントログのサイズには制限があることを覚えておく必要があります。たとえば、「セキュリティ」ログが保持できるエントリは1000個のみであると想像してください(eventvwr.mscを見ると、eventlogプロパティに表示される実際のサイズ(mb))。したがって、イベントログがいっぱいになると、次の3つの方法があります。

  1. 古いイベントの上に新しいイベントを書きます。この場合、最後に読み取られたイベントインデックスを覚えておくことは適切ではありません。そのインデックスが指すイベントは単純に上書きされる可能性があるためです。
  2. アーカイブを作成します。この場合、記憶されたインデックスは、イベントログの現在の.evtxファイルではなく、アーカイブにあるイベントを指すことができるようになりました。
  3. 新しいイベントを書き込まないでください。手動でイベントログをクリアしてください。自動化されたツールが必要なので、これは面白くないと思います。

したがって、イベントログをアーカイブするように設定し、イベントの最後のインデックスを記憶することができます。次に、イベントログを再度読み取るときに、最初に現在のイベントログファイルの最も古い記録を取得します。

EventLog log = new System.Diagnostics.EventLog("Security");
int oldestIndex = log.Entries[(int)eli.OldestRecordNumber].Index;

次にoldestIndex、自分のアーカイブと比較し、最初にアーカイブを読み取る必要がある場合は、現在のイベントログファイルのみを読み取りますlastReadedIndexlastReadedIndex < oldestIndex

すべてのアーカイブは、デフォルトで、現在のイベントログファイルが存在する同じディレクトリ(.evtx)に保存されます。EventLogReaderクラスを使用すると、アーカイブを簡単に読み取ることができます。EventRecordとそのプロパティを見てみてください。これは、クラスのプロパティとRecordId同じだと思います(現時点では確認できません)。IndexEventLogEntry

Indexもう1つのアプローチは、イベントが作成された時刻を記憶し、それが役に立たない場合に備えて、新しいイベントを検索するための開始点として使用することRecordIdです。

幸運を!

于 2013-01-30T09:13:50.083 に答える