2011-06-20 44 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爲我解決了問題。

相關問題