为什么WMI不会在ManagementObjectCollection中返回完整的结果集?

时间:2011-06-20 22:58:35

标签: c# wmi dcom

使用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()都会成功枚举列表 - 没有引发异常,但集合并不总是相同。

每次都可以按不同的方式订购该系列,这是预期的。 该集合并不总是包含相同时间范围内的相同事件计数,这是未预料到的。

每隔几百次查询,该集合似乎无法获得完整的WMI结果。它是静默地,没有异常或我发现的错误消息。

我们发现'逻辑'运算符<=<对于某些日志文件类型(至少是安全性)的行为不符合预期,因此我们必须处理使用包含&lt; =两端的重叠结束时间点。

上述丢失结果的问题不是由于逻辑运算符未能包含==的时间。

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题(SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor返回空结果.wbemtest显示2个内容。)

在使用不同线程的WMI连接上使用enumOptions.Rewindable = false;时,似乎出现问题。

删除enumOptions.Rewindable = false解决了我的问题。