C#.netを使用したWMIクエリの実行WMIがManagementObjectCollectionで完全な結果セットを返さないのはなぜですか?
クエリが複数回実行されたときに同じイベントが常に返されるとは限りません。
ConnectionOptions opts = new ConnectionOptions();
if (EncryptConnections)
{
opts.Authentication = AuthenticationLevel.PacketPrivacy;
}
opts.Username = eventSource.user;
opts.SecurePassword = eventSource.password;
opts.Impersonation = ImpersonationLevel.Impersonate;
string location = string.Format("\\\\{0}\\root\\cimv2", eventSource.machine);
ManagementScope scope = new ManagementScope(location, opts);
scope.Connect();
EnumerationOptions enumOptions = new EnumerationOptions();
enumOptions.DirectRead = false;
enumOptions.EnumerateDeep = false;
enumOptions.ReturnImmediately = true;
enumOptions.Rewindable = false;
enumOptions.Timeout = TimeSpan.MaxValue;
enumOptions.BlockSize = 10;
WqlObjectQuery query = new WqlObjectQuery("Select * from Win32_NTLogEvent Where Logfile = 'Security' AND TimeWritten >= '20110614025212.000000+000' AND TimeWritten <= '20110614030712.000000+000'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, enumOptions);
foreach (ManagementBaseObject mbo in searcher.Get()) {
// do Stuff
}
実際のコードでは、クエリが異なる時間範囲を取得するたびに変更されますが、不完全な結果が表示されます。
ManagementObjectCollection
が返されるたびに、searcher.Get()
から返されたリストには、例外は発生しませんが、コレクションは必ずしも同じではありません。
コレクションは毎回違う順序で並べられますが、これは予想されます。 コレクションに同じ時間範囲のイベントが常に含まれているとは限りません。これは予期しないものです。
コレクションは、数百のクエリのたびに完全なWMI結果を得ることができないようです。それは静かに、私はまだ発見した例外やエラーメッセージはありません。
は、我々は予想通り「ロジック」演算子<=
と時間に対する<
は、いずれかのいくつかのログファイルの種類について(注目すべきは、少なくともセキュリティた)行動しないことが確認私たちは、すでに包括的な<を使用して終了時点の重複に対処する必要があります=各端で。
上記の失われた結果の問題は、論理演算子が==を含む時間に失敗したためではありません。
このコードをテストすると同時に、別のスレッドで同じログにイベントを追加します。行方不明のイベントがもっと頻繁に出るのが分かります。解決策を探すための列挙オプションを備えたTinker。 –
イベントログの先頭が不安定になるのを避けるための管理があります。しかし、この問題は、コンテンツ内でかなり安定しているイベントログの本体にあります。新しい書き込みが発生したときに途中で読み込みをキャンセルする問題がありますか?私たちは100秒(または1000秒)のイベントを1秒間に作成したホストでテストしていますが、それが頻繁に起こるのを見ていません。 –