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

Posted

技术标签:

【中文标题】为啥 WMI 不会在 ManagementObjectCollection 中返回完整的结果集?【英文标题】:Why would WMI not return a full result set in ManagementObjectCollection?为什么 WMI 不会在 ManagementObjectCollection 中返回完整的结果集? 【发布时间】:2011-06-20 22:58:34 【问题描述】:

使用 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 结果。它会默默地这样做,我还没有发现任何异常或错误消息。

我们发现,针对时间的“逻辑”运算符 &lt;=&lt; 对于某些日志文件类型(至少值得注意的是安全性)的行为也不符合预期,因此我们已经不得不处理重叠的结束时间点在每一端使用包含

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

【问题讨论】:

测试此代码,同时在另一个线程中,将事件添加到同一日志中。我敢打赌,您会更频繁地看到丢失的事件。修改枚举选项以寻找解决方案。 我们有一些管理来避免读取事件日志的头部,因为它不稳定。但是,此问题与事件日志的主体有关,否则内容相当稳定。当发生新的写入时,是否存在一些会中途取消读取的问题?我们正在对每秒创建 100 次(或 1000 次)事件的主机进行测试,但该问题并未经常发生。 【参考方案1】:

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

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

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

【讨论】:

以上是关于为啥 WMI 不会在 ManagementObjectCollection 中返回完整的结果集?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个SQL Server DBA学习PowerShell

本机 WMI 提供程序中的 UINT64 不会在某些系统上返回数据

.NET 不会使用命令行参数调用方法?

Windows 8 上的 Wmi 安全性

C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC

使用WMI Filter 实现组策略的筛选!