EvtSubscribe 関数の呼び出しタイミングと、イベントログへの書き込みタイミングが重複すると、EvtNext 関数の呼び出し時にイベントログの読み飛ばしが発生する

現象
EvtSubscribe 関数を EvtSubscribeStartAfterBookmark を用いて呼び出したタイミングと同時に、イベントログの書き込みが発生するシナリオを想定します。このシナリオの後に EvtNext 関数を呼び出した場合、該当タイミングのイベントログが取得できず、次に書き込まれたイベント ログ レコードが代わりに取得される現象が発生することがあります。
原因
EvtSubscribe 関数の呼び出しに EvtSubscribeStartAfterBookmark が用いられており、かつ、EvtSubscribe 関数に指定するブックマークが、最新のイベント ログ レコードのものである場合、Windows イベントログ サービス内では管理しているブックマークを開始地点として、その後に書き込まれたイベントのレコードを参照するような設定が行われます。ただ、この処理の途中で、他のスレッドによるイベントログ書き込み要求が行われた場合、競合によりそのイベント ログが新しく書き込まれたものとして検知されない場合があります。その結果、EvtNext 関数を呼び出した際に取得されるレコードは次に書き込まれた検知可能なレコードとなり、競合したイベントログが EvtNext 関数の結果として得られない状況が発生します。

本事象は、EvtSubscribe 関数が利用される Push Subscriptions モデル または Pull Subscriptions モデルのいずれにおいても発生する可能性があります。
回避策
イベント ログが読み飛ばされる現象自体を回避する方法はございません。

現象の発生によって本来 読み飛ばされるレコード自体を取得するためには、EvtSubscribe 関数 の呼び出し時に使用するブックマークを、最新のイベントログレコードより前に設定した上で、EvtNext 関数によりイベントのレコードを取得します。この方法により、余分なレコードが取得されますが、EvtNext 関数を繰り返し呼び出すことで読み飛ばしされたレコードを取得することが可能です。
状況
マイクロソフトでは、この問題を対象製品として記載されるマイクロソフト製品の問題として認識しています。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:3173513 - 最終更新日: 09/29/2016 16:15:00 - リビジョン: 3.0

Windows Vista Enterprise, Windows Server 2008 Standard, Windows 7 Enterprise, Windows Server 2008 R2 Standard, Windows 8, Windows Server 2012 Standard, Windows 8.1, Windows Server 2012 R2 Standard, Windows 10

  • KB3173513
フィードバック