呼叫 WMI 方法

WMI 提供 COM API腳本 API 中的方法,以取得資訊或操作企業系統中的物件。 例如,WMI 腳本方法 SWbemServices.ExecQuery 會查詢資料。 提供者也會在註冊的類別中定義方法。 範例包括Win32 提供者所提供的Win32_LogicalDisk方法ChkdskScheduleAutoChk

本主題將討論下列各節:

與提供者方法相較之下的 WMI 方法

藉由使用結合提供者方法呼叫的WMI 方法呼叫,您可以擷取及操作企業的相關資訊。 如需詳細資訊,請參閱呼叫 WMI 方法和呼叫提供者方法

WMI 腳本物件 SWbemObject 的方法具有特殊狀態,因為它們可以套用至任何 WMI 資料類別。 如需詳細資訊,請參閱 使用 SWbemObject 編寫腳本

下列程式碼範例會呼叫 WMI 和提供者方法。

下列 WMI 和提供者方法位於 WMI 的腳本 API中:

您可以在 [傳回碼] 區段中查閱Win32_Service可能會出現在 [傳回] 中的程式碼。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
    Return = objService.StopService()
    If Return <> 0 Then
        Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return 
    Else
       WScript.Echo "Succeeded"
    End If
Next

$colServices= Get-WmiObject -Class Win32_Service -Filter 'Name = &quot;Alerter&quot;'
foreach ($objService in $colServices)
{
    $objService.StopService()
}

WMI 中的Method-Calling模式

半同步呼叫模式通常會在安全性和效能之間提供最佳平衡。

如需每個可能模式的詳細資訊,請參閱下列各項:

同步模式

當程式或腳本暫停直到方法呼叫傳回 SWbemObjectSet 集合物件為止,就會發生同步模式。 WMI 會在記憶體中建置此集合,再將集合物件傳回呼叫程式或腳本。

同步模式在執行程式或腳本的電腦上,可能會對程式或腳本效能造成負面影響。 例如,從事件記錄檔同步擷取數千個事件可能需要很長的時間,並使用大量的記憶體,因為 WMI 會從每個事件建立物件,然後將這些物件放入集合中,然後再將集合傳遞至 方法。

您應該只呼叫不會以同步模式傳回大型資料集的方法。 下列 SWbemServices 方法可以在同步模式中安全地呼叫:

iFlags參數中設定wbemFlagReturnWhenComplete值,即可以同步模式呼叫名稱中沒有 「Async」 這個字的任何SWbemServices方法。

非同步模式

當程式或腳本在呼叫 方法之後繼續執行時,就會發生非同步模式。 WMI 會在建立每個物件時,將 方法中的所有物件傳回 SWbemSink 物件。 呼叫的程式或腳本必須有 SWbemSink 物件和 SWbemSink.OnObjectReady 事件處理常式,才能處理傳回的物件。 如需建立異步模式事件處理常式的詳細資訊,請參閱 接收 WMI 事件

雖然此模式沒有同步模式的效能和資源懲罰,但非同步模式可能會產生嚴重的安全性風險,因為儲存在 SWbemSink 物件中的結果可能不是來自呼叫程式或腳本。 WMI 會降低 SWbemSink 物件上的驗證層級,直到方法成功為止。 如需如何降低這些安全性風險的詳細資訊,請參閱 在非同步呼叫上設定安全性

附加至 Async 這個字的方法是非同步模式的方法。 下列方法是非同步呼叫:

如需非同步模式的詳細資訊,請參閱:

半同步模式

半同步模式類似于非同步模式,在呼叫 方法之後,程式或腳本會繼續執行。 在半同步模式中,WMI 會在腳本或程式繼續執行時,擷取背景中的物件。 WMI 會在建立 物件之後,傳回給呼叫方法的每個物件。

因為 WMI 會管理物件,所以半同步模式比非同步模式更安全。 不過,如果您使用具有超過 1,000 個實例的半同步模式,實例擷取可能會獨佔可用的資源,這可能會降低程式或腳本的效能,以及使用程式或腳本的電腦。 每個物件都會佔用必要的資源,直到釋放記憶體為止。

若要解決此問題,您可以使用wbemFlagForwardOnlywbemFlagReturnImmediately旗標來呼叫iFlags參數設定的 方法,以指示 WMI 傳回順向SWbemObjectSet。 順向 SWbemObjectSet 可消除大型資料集所造成的效能問題,方法是在列舉物件之後釋放記憶體。

任何無法在同步模式或非同步模式中呼叫的 SWbemServices 方法,都會以半同步模式呼叫。

以半同步模式呼叫下列方法:

如需半同步模式的詳細資訊,請參閱 使用 C++ 進行半同步呼叫 和使用 VBScript 進行半同步呼叫

改善列舉效能

使用 SWbemObject 編寫腳本

WbemFlagEnum