使用 VBScript 连接到 WMI

WMI 脚本可以压缩 C++ 程序中所需的许多步骤。 它们不仅可以通过 SWbemLocator 对象,而且还可以通过名字对象“winmgmts:”连接到 WMI。 名字对象是用于在 WMI 中定位命名空间、类或实例的短名称。 名称“winmgmts:”是告知 Windows 脚本宿主使用 WMI 对象、连接到默认命名空间并获取 SWbemServices 对象的 WMI 名字对象。 其他连接信息(例如模拟级别或特定的类或实例)显示在名字对象名称后面的字符串中。 可以在创建或获取 WMI 对象的调用中使用名字对象。 有关详细信息,请参阅构造名字对象字符串

以下过程说明如何使用 SWbemLocator 连接到 WMI。

使用 SWbemLocator 连接到 WMI

  1. 通过调用 CreateObject 检索定位符对象。

    Set Locator = CreateObject("WbemScripting.SWbemLocator")
    
  2. 通过调用 ConnectServer 方法登录到命名空间。

    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objService = objLocator.ConnectServer(".", "root\cimv2")
    

    如果在 ConnectServer 调用中未指定计算机,则 WMI 会连接到本地计算机。 如果未指定命名空间,则 WMI 会连接到注册表项中指定的命名空间。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Namespace

    默认命名空间为 \root\cimv2。 有关命名空间的详细信息,请参阅在 WMI 中创建层次结构

  3. 通过调用 SWbemServices.Security_ 方法设置模拟级别。

    objService.Security_.ImpersonationLevel = 3 
    

    有关详细信息,请参阅 使用 VBScript 设置默认进程安全级别

  4. 实现脚本的用途。

    WMI 公开多种脚本对象用于访问和操作网络中的数据。 有关详细信息,请参阅操作类和实例信息适用于 WMI 的脚本 API

    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objService = objLocator.ConnectServer(".", "root\cimv2")
    objService.Security_.ImpersonationLevel = 3
    Set Jobs = objService.ExecQuery("SELECT * FROM Win32_ScheduledJob")
    i=0
    For each Job in Jobs
        i = i+1   
        WScript.Echo Job.JobId & "  " & Job.Command & VBNewLine
    Next
    If i = 0 Then
        WScript.Echo "No Jobs Scheduled with the AT command were found"
    End If
    

以下过程说明如何连接到 WMI 并使用名字对象检索对象。

连接到 WMI 并使用名字对象检索对象

  1. 在输入参数中使用名字对象调用 GetObject

    'the simple version
    Set MyObject = GetObject("winMgmts::Win32_scheduledJob")
    
    'Or the more complex version
    strComputer = "."
    Set MyObject = GetObject("winMgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\Root\CIMv2:Win32_ScheduledJob")
    

    名字对象包含许多可用于连接到 WMI 的元素:

    • “winmgmts:”告知 WSH 使用脚本 API 对象。 在此特定示例中,WSH 知道它应该返回一个描述系统上第一个 Win32_scheduledJob 的 SWbemObject。 其他可能要返回的对象是 SWbemCollection 或 SWbemServices 对象,具体取决于名字对象描述的内容。

    • 可以选择性地设置连接的安全级别。 但请注意,不能在名字对象中设置姓名和密码信息。 有关详细信息,请参阅保护脚本客户端

    • 可以选择性地定义 WMI 对象的路径。 这包括本地或远程计算机、命名空间以及类的名称。 有关在 WMI 脚本中使用 VBScript GetObject 的详细信息,请参阅创建实例检索 WMI 实例

  2. 你还可以选择检索 SWbemServices 对象(如以上示例中所述),而不是检索单个项或集合。 然后,可以对返回的对象调用其他查询。

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob")
    For Each objJob in colScheduledJobs
        Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine
    Next
    

    在以上示例中,impersonate 或 impersonationLevel=3 是默认的进程安全级别。 在以下示例中,除非需要将进程安全级别更改为 delegate,否则没有必要指定此进程安全级别。 有关详细信息,请参阅 使用 VBScript 设置默认进程安全级别

WMI 中的脚本