呼叫 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