调用 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 值,可以在同步模式下调用名称中的任何 SWbemServices 方法,即名称中的“Async”。

异步模式

调用该方法后,程序或脚本继续运行时,将发生异步模式。 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