ZetCode

VBScript AssociatorsOf 方法

最后修改于 2025 年 4 月 9 日

VBScript 中的 `AssociatorsOf` 方法是 Windows Management Instrumentation (WMI) 基础设施的一部分。它通过 WMI 关联检索与指定源对象相关联的对象。此方法对于探索系统组件之间的关系非常强大。

`AssociatorsOf` 有助于在 WMI 中导航复杂的对象关系。它返回与源对象相关的对象的集合。本教程通过实际示例涵盖 `AssociatorsOf`,以演示其在系统管理和监控中的用法。

AssociatorsOf 方法概述

`AssociatorsOf` 方法查询 WMI 以获取相关对象。它接受多个参数来优化关联搜索。这些参数包括关联类、结果类和角色过滤器。该方法返回一个 SWbemObjectSet 集合。

关键参数包括源对象路径和可选限定符。它可以按关联类型或结果类进行筛选。`AssociatorsOf` 可通过 WMI 脚本中的 SWbemServices 对象获得。理解此方法有助于创建高级系统管理脚本。

基本关联查询

此示例演示了 `AssociatorsOf` 的最简单用法,用于查找相关对象。它展示了如何检索与特定进程相关联的服务。该脚本连接到 WMI 并查询 Notepad.exe 的关联。

basic_associators.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='notepad.exe'")

For Each objProcess in colProcesses
    Set colServices = objProcess.Associators_()
    WScript.Echo "Services associated with Notepad:"
    For Each objService in colServices
        WScript.Echo objService.Name
    Next
Next

该脚本连接到 WMI 并查询 Notepad 进程。然后,它对每个进程调用 `Associators_`(AssociatorsOf 的缩写)。该方法返回相关服务,没有任何过滤器。这展示了 WMI 中的基本关联导航。

按关联类筛选

此示例演示了按类筛选关联。它只检索特定类型的相关对象。该脚本使用 Win32_DiskDriveToDiskPartition 类查找与特定分区相关联的磁盘驱动器。

filter_association_class.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPartitions = objWMIService.ExecQuery("SELECT * FROM Win32_DiskPartition WHERE Index=0")

For Each objPartition in colPartitions
    Set colDrives = objPartition.Associators_("Win32_DiskDriveToDiskPartition")
    WScript.Echo "Disk drives for partition 0:"
    For Each objDrive in colDrives
        WScript.Echo objDrive.Caption & " - " & objDrive.DeviceID
    Next
Next

该脚本查询分区 0,并调用带有特定关联类的 `Associators_`。这将结果筛选为仅通过该关系连接的磁盘驱动器。输出显示了与该分区相关的物理驱动器。

指定结果类

此示例显示如何按返回对象的类筛选结果。它只检索与进程相关联的服务,忽略其他类型。结果类参数确保只返回 Win32_Service 对象。

result_class_filter.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='svchost.exe'")

For Each objProcess in colProcesses
    Set colServices = objProcess.Associators_(, "Win32_Service")
    WScript.Echo "Services hosted by svchost:"
    For Each objService in colServices
        WScript.Echo objService.DisplayName & " (" & objService.Name & ")"
    Next
Next

该脚本查询 svchost 进程,并且只请求 Win32_Service 关联对象。第一个空参数表示没有关联类过滤器。第二个参数指定所需的结果类。这会将结果集中在托管服务上。

使用 Role 参数

此示例演示了 Role 参数用于指定关系方向。它查找使用特定 DLL 文件的进程。Role 参数标识了 DLL 在关联中的作用。

role_parameter.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile WHERE Name='C:\\Windows\\System32\\kernel32.dll'")

For Each objFile in colFiles
    Set colProcesses = objFile.Associators_(, "Win32_Process", "Dependent")
    WScript.Echo "Processes using kernel32.dll:"
    For Each objProcess in colProcesses
        WScript.Echo objProcess.Name & " (PID: " & objProcess.ProcessId & ")"
    Next
Next

该脚本定位 kernel32.dll 并查询依赖的进程。"Dependent" Role 参数指定了 DLL 在关系中的作用。这会返回依赖(使用)该 DLL 的进程,而不是其他关联方向。

完整参数使用

此示例展示了所有主要参数的组合使用。它检索与计算机系统相关联的网络适配器,并带有特定过滤器。该查询演示了对关联导航的全面控制。

full_parameters.vbs
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colSystems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")

For Each objSystem in colSystems
    Set colAdapters = objSystem.Associators_("Win32_SystemDevices", "Win32_NetworkAdapter", "PartComponent")
    WScript.Echo "Network adapters for this computer:"
    For Each objAdapter in colAdapters
        WScript.Echo objAdapter.Name & " - " & objAdapter.MACAddress
    Next
Next

该脚本查询计算机系统并查找相关的网络适配器。它指定了关联类、结果类和角色。此精确查询仅返回通过 Win32_SystemDevices 关系作为组件连接的网络适配器。

来源

AssociatorsOf 文档

在本文中,我们探讨了 VBScript 中的 `AssociatorsOf` 方法,涵盖了其用法和实际应用。从基本关联查询到复杂的筛选关系,这些示例展示了强大的 WMI 导航。通过这些知识,您可以创建高级系统管理脚本。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有多年的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面有八年以上的经验。

列出所有 VBScript 教程