SWbemServices 对象
可以使用 SWbemServices 对象的方法对本地主机或远程主机上的命名空间执行操作。 此对象不能由 VBScript CreateObject 调用创建。
成员
SWbemServices 对象具有以下类型的成员:
方法
SWbemServices 对象具有以下方法。
方法 | 说明 |
---|---|
AssociatorsOf | 通过一个或多个关联类检索与指定资源关联的托管资源的实例。 提供原始终结点的对象路径,AssociatorsOf 返回相反终结点处的托管资源。 AssociatorsOf 方法执行的函数与 ASSOCIATORS OF WQL 查询执行的函数相同。 |
AssociatorsOfAsync | 异步返回与指定对象关联的对象(类或实例)的集合。 |
Delete | 从 CIM 存储库中删除托管资源的实例(或类定义)。 |
DeleteAsync | 异步删除对象路径中指定的类或实例。 |
ExecMethod | 提供一种备用方式来执行由托管资源类定义定义的方法。 主要用于脚本语言不支持 out 参数的情况。 例如,JScript 不支持 out 参数。 |
ExecMethodAsync | 以异步方式执行由方法提供程序导出的方法。 |
ExecNotificationQuery | 执行事件订阅查询以接收事件。 事件订阅查询是一个查询,用于定义对要监视的托管环境的更改。 发生更改时,WMI 基础结构会将描述更改的事件传递给调用脚本。 |
ExecNotificationQueryAsync | 异步执行查询以接收事件。 |
ExecQuery | 执行查询以检索 WMI 托管资源(或类定义)的实例集合。
ExecQuery 可用于检索与你在传递给 ExecQuery 的查询中定义的条件相匹配的实例的筛选集合。 |
ExecQueryAsync | 异步执行查询以检索对象。 |
Get | 基于对象路径检索托管资源(或类定义)的单个实例。 |
GetAsync | 根据作为类定义或实例的对象的路径来异步检索对象。 |
InstancesOf | 基于类名检索托管资源的所有实例。 默认情况下,InstancesOf 执行深度检索。 也就是说,InstancesOf 检索由传递给方法的类名标识的资源的实例,并检索作为目标类的子类(在下面定义)的所有资源的所有实例。 |
InstancesOfAsync | 根据用户指定的选择标准,异步返回指定类的实例。 |
ReferencesTo | 返回引用指定资源的所有关联。 了解 ReferencesTo 的最佳方法是将其与 AssociatorsOf 方法进行比较。 AssociatorsOf 返回位于关联另一端的动态资源。 ReferencesTo 返回关联本身。 ReferencesTo 方法执行的函数与“REFERENCES OF”WQL 查询执行的函数相同。 |
ReferencesToAsync | 异步返回引用特定类/实例的所有关联类/实例的集合。 |
SubclassesOf | 从 CIM 存储库检索指定类的所有子类。 |
SubclassesOfAsync | 异步返回指定类的子类的集合。 |
属性
SWbemServices 对象具有以下属性。
属性 | 访问类型 | 说明 |
---|---|---|
Security_ |
只读 |
用于获取或设置 SWbemServices 对象的安全设置。 |
备注
可以在同步模式、异步模式或半同步模式下调用方法。 有关详细信息,请参阅调用方法。
概述
SWbemServices 提供两个主要角色。 首先,SWbemServices 对象表示与目标计算机上的 WMI 命名空间的经过身份验证的连接。 其次,SWbemServices 是用于检索 WMI 托管资源的自动化对象。 可以通过以下两种方式之一获取对 SWbemServices 对象的引用:
如目前提供的大多数 WMI 脚本所示,可以将 VBScript GetObject 函数与 WMI 名字对象“winmgmts”结合使用。 以下示例是 WMI 连接的最简单形式。 此示例连接到本地计算机上的默认命名空间(通常为“Root\CIMv2”):
Set objSWbemServices = GetObject("winmgmts:")
还可以使用 SWbemLocator 对象 ConnectServer 方法获取对 SWbemServices 对象的引用。
获取对 SWbemServices 对象的引用后,可以使用对象引用调用使用 SWbemServices 提供的 18 种方法之一。 SWbemServices 可以返回三个不同的 WMI 脚本库对象之一(SWbemObjectSet、SWbemObject 或 SWbemEventSource),具体取决于调用的方法。 了解每个方法返回的对象类型将有助于确定脚本必须执行的下一步。 例如,如果取回 SWbemObjectSet,则必须枚举该集合才能访问集合中的每个 SWbemObject。 如果取回 SWbemObject,则可以立即访问对象方法和属性,而无需先枚举集合。
操作模式
SWbemServices 支持三种操作模式:同步、异步和半同步。
Synchronous。 在同步模式下,脚本会阻止(暂停),直到 SWbemServices 方法完成。 脚本不仅会等待,而且在 WMI 检索托管资源的实例的情况下,WMI 在将数据的第一个字节返回到调用脚本之前,在内存中生成整个 SWbemObjectSet。 这会对脚本性能和运行脚本的计算机产生不利影响。 例如,从 Windows 事件日志中同步检索数千个事件可能需要很长时间,并且会占用大量内存。 出于这些原因,建议不要执行同步操作,但默认同步的三种方法除外(即 Delete、ExecMethod 和 Get)。 这些方法不返回大型数据集,因此不需要半同步操作。
异步。 在异步模式下,脚本调用九个异步方法之一并立即返回。 也就是说,一旦调用异步方法,脚本就会继续运行下一行代码。 要使用异步方法,脚本必须首先创建一个 SWbemSink 对象和一个名为事件处理程序的特殊子例程。 WMI 执行异步操作,并在操作完成时通过调用事件处理程序子例程来通知脚本。
半同步。 半同步模式是同步和异步之间的妥协。 半同步操作的性能优于同步操作,但它们不需要处理异步操作所需的额外知识和脚本步骤。 这是大多数 WMI 查询的默认操作类型。
在半同步模式下,脚本会调用六种数据检索方法之一并立即返回。 当脚本继续运行时,WMI 在后台检索托管资源。 检索资源时,资源会立即通过 SWbemObjectSet 返回到脚本。 可以开始访问托管资源,而无需等待整个集合的组装。
在使用具有多个实例的托管资源时,需要注意的是半同步操作,这些资源具有许多实例(“许多”表示超过 1000 个),例如 CIM_DataFile 和 Win32_NTLogEvent。 请注意,WMI 如何处理托管资源的实例。 对于托管资源的每个实例,WMI 都会创建并缓存 SWbemObject 对象。 当托管资源存在大量实例时,实例检索可能会独占可用资源,从而降低脚本和计算机的性能。
要解决此问题,可以使用 wbemFlagForwardOnly 标志优化半同步方法调用。 wbemFlagForwardOnly 标志与 wbemFlagReturnImmediately 标志(默认半同步标志),告知 WMI 返回仅向前的 SWbemObjectSet,从而消除大型数据集性能问题。 但是,使用 wbemFlagForwardOnly 标志需要付出代价。 仅向前的 SWbemObjectSet 只能枚举一次。 访问仅向前 SWbemObjectSet 中的每个 SWbemObject 后,将释放分配给实例的内存。
除 Delete、ExecMethod、Get 和 9 个异步方法外,半同步是默认的推荐操作模式。
常用方法
系统管理脚本中最常用的方法是 InstancesOf、ExecQuery、Get 和 ExecNotificationQuery。 虽然经常使用,但 InstancesOf 不一定是检索信息的推荐方法(虽然说是最简单的方法)。
要求
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows Vista |
最低受支持的服务器 |
Windows Server 2008 |
标头 |
|
类型库 |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |