调用 WMI 方法
WMI 在 COM API 和脚本 API 中提供方法用于获取信息或操作企业系统中的对象。 例如,WMI 脚本方法 SWbemServices.ExecQuery 可查询数据。 提供程序在它们注册的类中也有定义的方法。 例如,Win32 提供程序提供的 Win32_LogicalDisk 方法 Chkdsk 和 ScheduleAutoChk。
本主题包括以下部分:
WMI 方法与提供程序方法的比较
通过将 WMI 方法调用与提供程序方法调用结合使用,可以检索和操作有关企业的信息。 有关详细信息,请参阅调用 WMI 方法和调用提供程序方法。
WMI 脚本对象 SWbemObject 的方法具有特殊状态,因为它们可以应用于任何 WMI 数据类。 有关详细信息,请参阅使用 SWbemObject 编写脚本。
以下代码示例同时调用 WMI 方法和提供程序方法。
以下 WMI 方法和提供程序方法位于适用于 WMI 的脚本 API 中:
- objWMIService.ExecQuery 调用 WMI 脚本方法 SWbemServices.ExecQuery
- objService.StopService() 调用提供程序方法 Win32_Service.StopService
可以在 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 = "Alerter"'
foreach ($objService in $colServices)
{
$objService.StopService()
}
WMI 中的方法调用模式
半同步调用模式通常在安全性和性能之间提供最佳平衡。
有关每种可能模式的详细信息,请参阅以下主题:
同步模式
当程序或脚本暂停到方法调用返回 SWbemObjectSet 集合对象时,就会发生同步模式。 在将集合对象返回给调用程序或脚本之前,WMI 会在内存中生成此集合。
同步模式可能对运行程序或脚本的计算机上的程序或脚本性能产生不利影响。 例如,以同步方式从事件日志检索数千个事件可能要花费很长时间并占用大量内存,因为 WMI 从每个事件创建一个对象,然后在将集合传递给方法之前将这些对象放入集合中。
在同步模式下,应该仅调用不会返回大型数据集的方法。 在同步模式下可以安全调用以下 SWbemServices 方法:
通过在 iFlags 参数中设置 wbemFlagReturnWhenComplete值,可以在同步模式下调用名称中不包含单词“Async”的任何 SWbemServices 方法。
异步模式
当程序或脚本在调用方法后继续运行时,就会发生异步模式。 在创建每个对象时,WMI 会将方法中的所有对象返回到 SWbemSink 对象。 调用程序或脚本必须有一个 SWbemSink 对象和一个 SWbemSink.OnObjectReady 事件处理程序才能处理返回的对象。 有关为异步模式创建事件处理程序的详细信息,请参阅接收 WMI 事件。
虽然异步模式不像同步模式那样存在性能和资源方面的弊端,但它会造成严重的安全风险,因为存储在 SWbemSink 对象中的结果可能不是来自调用程序或脚本。 在方法成功之前,WMI 会降低 SWbemSink 对象的身份验证级别。 有关如何缓解这些安全风险的详细信息,请参阅设置异步调用的安全性。
追加了单词“Async”的方法是异步模式方法。 以下方法是异步调用:
- SWbemServices.AssociatorsOfAsync
- SWbemServices.DeleteAsync
- SWbemServices.ExecMethodAsync
- SWbemServices.ExecNotificationQueryAsync
- SWbemServices.ExecQueryAsync
- SWbemServices.InstancesOfAsync
- SWbemServices.ReferencesToAsync
- SWbemServices.SubclassesOfAsync
有关异步模式的详细信息,请参阅:
半同步模式
半同步模式与异步模式的类似之处在于,程序或脚本在调用方法后都会继续运行。 在半同步模式下,当脚本或程序继续运行时,WMI 会在后台检索对象。 WMI 在创建对象后立即将每个对象返回给调用方法。
由于 WMI 会管理对象,半同步模式比异步模式更安全。 但是,如果对超过 1,000 个实例使用半同步模式,实例检索可能会独占可用资源,从而降低程序或脚本以及使用该程序或脚本的计算机的性能。 每个对象会一直占用所需的资源,直到内存被释放。
若要解决此问题,可以结合设置了 wbemFlagForwardOnly 和 wbemFlagReturnImmediately 标志的 iFlags 参数调用方法,以指示 WMI 返回只进 SWbemObjectSet。 只进 SWbemObjectSet 通过在枚举对象后释放内存,来消除大型数据集导致的性能问题。
无法在同步或异步模式下调用的任何 SWbemServices 方法都将在半同步模式下调用。
在半同步模式下调用以下方法:
- SWbemServices.AssociatorsOf
- SWbemServices.Delete
- SWbemServices.ExecMethod
- SWbemServices.ExecNotificationQuery
- SWbemServices.ExecQuery
- SWbemServices.Get
- SWbemServices.InstancesOf
- SWbemServices.ReferencesTo
- SWbemServices.SubclassesOf
- SWbemServices.Put
有关半同步模式的详细信息,请参阅使用 C++ 进行半同步调用和使用 VBScript 进行半同步调用。
相关主题