2011-07-13 69 views
2

我有一些代碼使用WMI來掃描符合特定條件的計算機的Windows域。通過WMI查詢時防止ComExceptions

我得到一個COMException如果我無法與我試圖查詢的計算機通信。在大型域上測試時,可能會導致數千個異常被拋出,這在性能上非常昂貴。

有沒有辦法讓我檢查一個有效的連接,在查詢之前,以便我可以防止這些錯誤發生?

簡單的例子:

foreach(var computer in domain) { 
    var scope = new ManagementScope(computerPath, options), query); 
    try { 
    using (var searcher = new ManagementObjectSearcher(scope)) { 

     if (searcher.Get().Count == 0) { 
     // do stuff 
     } 

    } 
    } catch(ComException e) { 
    // Log and continue 
    } 
} 
+1

這不可能是真正的原因。網絡超時時間比處理異常時間長很多。你無法解決暫停問題。 –

+0

我不擔心時間。我擔心在相對較短的時間內拋出數千個異常的CPU週期和內存開銷。我的「真實」代碼異步運行,並在我的一個測試中每分鐘拋出大約150次例外。 –

回答

0

的代碼在VBScript(VBS)該位將做到這一點通過WMI:初始化WMI連接,並進行錯誤處理身份驗證或連接問題。我想大概需要30秒才能知道「轉錄」到c#的人。 :)

' Verify Computer exists and account used has sufficient rights 
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
If(IsEmpty(objSWbemServices) = True) Then 
    WScript.Echo("OBJECT_NOT_INITIALIZED :: " & strComputer) 
    WScript.Quit(OBJECT_NOT_INITIALIZED) 
End If