3

C# コンソール アプリと C# Windows サービスの両方に次のコードがあります。コンソールアプリで動作します。指定されたイベントをピックアップし、MatchEvent() を正しく呼び出します。C# Windows サービスの同じコードは、指定された同じイベントを取得せず、それを確認することはありませんが、他のイベントを確認します。問題のイベントはアプリケーション ログに書き込まれるため、セキュリティ ログを読み取ろうとしていません。

アカウントのアクセス許可の問題だと思いました (サービスは LocalSystem として実行されていました)。consoleapp を実行していたのと同じアカウントを使用するようにサービスを変更しましたが、それでも同じ動作が見られます。アクセス許可を変更するために GP またはカスタム レジストリで何も行われていないことを確認しました (これは新しくインストールされた OS です)。両方のアプリで使用されるアカウントは localadmin です。

足りないものはありますか?EventLogPermission も調査しましたが、eventLog からイベントを取得しているため、当てはまらないようです。

コード:

private void WatchLogs()
{
    try
    {
        _eventLogs = EventLog.GetEventLogs();

        foreach (EventLog eventLog in _eventLogs)
        {
            if (eventLog.LogDisplayName.Contains("Security"))
            {
                _logger.DebugFormat(string.Format("{0}: not watching", eventLog.LogDisplayName));
            }
            else
            {
                eventLog.EntryWritten += EventLogEntryWritten;
                eventLog.EnableRaisingEvents = true;

                if (_logger.IsInfoEnabled)
                {
                    _logger.InfoFormat("Monitoring: {0} | Raising Events: {1}", eventLog.LogDisplayName,
                                       eventLog.EnableRaisingEvents);
                }
            }
        }
    }
    catch (Win32Exception ee)
    {
        _logger.DebugFormat(string.Format("{0}: not watching({1})", eventLog.LogDisplayName, ee.Message));
    }
    catch (SecurityException securityException)
    {
        _logger.ErrorFormat("Error accessing eventlog: {0} : {1}", eventLog.LogDisplayName, securityException.Message);
    }
}

private void EventLogEntryWritten(object sender, EntryWrittenEventArgs currentEvent)
{
  var log = (EventLog) sender;

  if (_logger.IsDebugEnabled)
    _logger.DebugFormat(
      "Event Raised: |Log:{0}|Source:{1}|EventID:{2}|",log.LogDisplayName,
        currentEvent.Entry.Source,currentEvent.Entry.EventID);

  MatchEvent(currentEvent);
}
4

2 に答える 2

0

はい、ポーリング間隔内にイベントが発生した場合、イベントを見逃すことはありません。WMI (System.Management 経由) を使用して、ポーリング間隔を変更できます。 これは古い記事ですが、これを行うために必要な情報を提供します。管理イベントのセクションを参照してください。

また、別のスレッドで WriteEntry (イベント ログにも書き込む場合) を実行して、イベントの受信をブロックしないようにすることもできます。

于 2009-05-18T06:32:27.917 に答える