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

本文关键字:结果 返回 WMI ManagementObjectCollection 为什么 | 更新日期: 2023-09-27 18:00:03

使用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
}

在实际的代码中,查询每次都会更改以获得不同的时间范围,但不显示不完整的结果。

每次运行此操作时,从searcher.Get()返回的ManagementObjectCollection都会成功枚举列表-不会引发异常,但集合并不总是相同的。

每次可能会对集合进行不同的排序,这是意料之中的事。该集合并不总是在同一时间范围内包含相同计数的事件,这是不可取的。

该集合似乎每几百个查询就无法获得一次完整的WMI结果。它默默地这样做,我还没有发现异常或错误消息。

我们发现,对于某些日志文件类型(至少值得注意的是安全性),"逻辑"运算符<=<相对于时间的行为也不像预期的那样,因此我们已经不得不使用inclusive<=来处理重叠的结束时间点在每一端。

上面丢失结果的问题并不是由于逻辑运算符没有包含==的时间。

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

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

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

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