1

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 結果の取得に失敗しているようです。これは静かに行われ、例外やエラー メッセージはまだ見つかっていません。

一部のログ ファイル タイプ (少なくともセキュリティは注目に値します)では、「論理」演算子<=<時間に対する演算子が期待どおりに動作しないことを特定したため、両端で包括的 <= を使用して重複する終了時点に対処する必要があります。

上記の失われた結果の問題は、論理演算子が == である時間を含めなかったことが原因ではありません。

4

1 に答える 1

2

同じ問題に遭遇しました (SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor空の結果を返します。wbemtest は 2 つのインスタンスを示します)。

enumOptions.Rewindable = false;異なるスレッドから使​​用される WMI 接続で使用する場合に問題が発生するようです。

削除enumOptions.Rewindable = falseすると問題が解決します。

于 2016-10-15T02:45:14.547 に答える