2011-06-20 18 views
1

运行使用C#.NET为什么WMI不能在ManagementObjectCollection中返回完整的结果集?

为什么这不会总是返回时,运行查询多次,这样做的时候也不会产生异常的时间范围内的所有相同事件的任何想法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失败结果一次几百查询。它静静地做,没有我找到的异常或错误信息。

我们确定的是“逻辑”运营商<=<与时间上不能按预期的行为无论是对一些日志文件类型(显着的至少是安全性),所以我们已经有了对付使用含<重叠的结束时间点=在每一端。上述

失去了结果的问题不是由于逻辑运算未能包括时间是==。

+0

测试此代码的同时,在另一个线程中将事件添加到同一个日志。我敢打赌你会更频繁地看到失踪事件。修补程序与枚举选项来寻找解决方案。 –

+0

我们有一些管理,以避免读取事件日志的头部,因为它是不稳定的。然而,这个问题与事件日志的内容相关,否则内容相当稳定。发生新写入时,是否有一些问题会取消中途读取?我们正在对每秒钟创建100个(或1000个)事件的主机进行测试,但没有看到经常发生的问题。 –

回答

2

我遇到了同样的问题(SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor返回空结果。WBEMTEST节目2个intances)。

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

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

相关问题