C# .net を使用して WMI クエリを実行する
クエリが複数回実行されたときに、時間範囲内で常に同じイベントが返されず、例外が発生しない理由についてのアイデアはありますか?
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()
たリストが正常に列挙されます - 例外は発生しませんが、コレクションは常に同じではありません。
コレクションは毎回異なる順序で並べられる場合がありますが、これは予想されることです。コレクションには、同じ時間範囲の同じ数のイベントが含まれているとは限りません。これは予期しないことです。
コレクションは、数百回のクエリごとに 1 回、完全な WMI 結果の取得に失敗しているようです。これは静かに行われ、例外やエラー メッセージはまだ見つかっていません。
一部のログ ファイル タイプ (少なくともセキュリティは注目に値します)では、「論理」演算子<=
と<
時間に対する演算子が期待どおりに動作しないことを特定したため、両端で包括的 <= を使用して重複する終了時点に対処する必要があります。
上記の失われた結果の問題は、論理演算子が == である時間を含めなかったことが原因ではありません。