共用方式為


呼叫 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 方法可以在同步模式中安全地呼叫:

任何不含名稱中“Async”一詞的 SWbemServices 方法,都可以透過在 iFlags 參數中設定 wbemFlagReturnWhenComplete 值來以同步模式呼叫。

異步模式

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

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

以 Async 字結尾的方法是用於異步模式的方法。 以下方法為非同步呼叫:

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

半同步模式

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

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

若要解決此問題,您可以使用 iFlags 參數呼叫 方法,並使用 wbemFlagForwardOnlywbemFlagReturnImmediately 旗標,指示 WMI 傳回順向 SWbemObjectSet。 順向 SWbemObjectSet 藉由在列舉對象之後釋放記憶體,排除大型數據集所造成的效能問題。

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

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

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

改善列舉性能

使用 SWbemObject 的腳本

WbemFlagEnum