使用 VBScript 远程连接到 WMI

可以通过创建连接对象,使用 VBScript 创建与 WMI 的远程连接。 此对象包含计算机的名称、要连接到的 WMI 命名空间,以及任何相关的凭据和身份验证级别。

使用 VBScript 连接到远程系统

  1. 指定连接信息,例如远程计算机名称、凭据和连接的身份验证级别。

    如果使用与登录时相同的凭据(域和用户名)连接到远程计算机,则可以在 GetObject名字对象中指定连接信息,如以下代码示例所述。

    strComputer = "Computer_B"
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strComputer & "\Root\CIMv2")
    

    通常,应指定要在远程计算机上连接到的 WMI 命名空间。 这是因为不同计算机上的默认命名空间可能不同。 指定命名空间可确保连接到所有计算机上的同一命名空间。

    有关使用名字对象连接的 VBScript 常量和脚本字符串的详细信息,请参阅使用 VBScript 设置默认进程安全级别

  2. 如果连接到不同域中的远程计算机,或者使用不同的用户名和密码,则必须使用 SWbemLocator.ConnectServer 方法。

    与名字对象一样,使用 ConnectServer 指定远程连接的凭据、身份验证级别和命名空间。 以下代码示例介绍如何使用 ConnectServer 通过管理员帐户和密码访问远程计算机。

    strComputer = "Computer_B"
    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                         "Root\CIMv2", _
                                                         "fabrikam\administrator", _
                                                         "password")
    
  3. 使用 ConnectServer 函数进行远程连接时,请对通过调用 SWbemServices.Security 获取的安全对象设置模拟和身份验证。 可以使用枚举 WbemImpersonationLevelEnum 来指定模拟级别。

    下面的代码示例设置上一个 VBScript 代码示例的模拟级别。

    objSWbemServices.Security_.ImpersonationLevel = 3
    

    请注意,某些连接需要特定的身份验证级别。 有关详细信息,请参阅设置客户端应用程序进程安全性保护脚本客户端

    具体而言,如果要连接到远程计算机上的命名空间需要加密连接,则应该将身份验证级别设置为 RPC_C_AUTHN_LEVEL_PKT_PRIVACY 或 6,然后才能返回数据。 还可以使用此身份验证级别,即使命名空间不需要。 这可以确保数据在通过网络传输时经过加密。 如果尝试设置低于允许的身份验证级别,将返回拒绝访问消息。 有关详细信息,请参阅要求与命名空间建立加密连接

建立连接后,可以继续访问 WMI 数据。 有关详细信息,请参阅脚本和应用程序的 WMI 任务

示例

有关更大的 VBScript 示例,请参阅 SWbemLocator.ConnectServer 参考页中的“示例”部分。

下面的 VBScript 代码示例通过创建远程计算机名称数组,然后在每台计算机上显示即插即用设备的名称(Win32_PnPEntity 的实例)连接到同一域中的一组远程计算机。 必须是远程计算机上的管理员才能运行以下脚本。 请注意,脚本在模拟级别设置之后添加远程计算机名称之前需要“\\”。 有关 WMI 路径的详细信息,请参阅描述 WMI 对象的位置

On Error Resume Next 
arrComputers = Array("Computer1","Computer2","Computer3")
For Each strComputer In arrComputers
    WScript.Echo
    WScript.Echo "===================================="
    WScript.Echo "Computer: "& strComputer
    WScript.Echo "===================================="

    Set objWMIService = GetObject("winmgmts:\\" & strComputer& "\Root\CIMv2") 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PnPEntity",,48) 
    For Each objItem in colItems 
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Win32_PnPEntity instance"
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Name: "& objItem.Name
        Wscript.Echo "Status: "& objItem.Status
    Next
Next

以下 VBScript 代码示例使你能够使用不同的凭据连接到远程计算机。 例如,不同域中的远程计算机或连接到需要不同用户名和密码的远程计算机。 在这种情况下,使用 SWbemServices.ConnectServer 连接。

' Full Computer Name
' can be found by right-clicking My Computer,
' then click Properties, then click the Computer Name tab)
' or use the computer's IP address
strComputer = "FullComputerName" 
strDomain = "DOMAIN" 
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine 
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()
 
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                     "Root\CIMv2", _
                                                     strUser, _
                                                     strPassword, _
                                                     "MS_409", _
                                                     "ntlmdomain:" + strDomain)
Set colSwbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess in colSWbemObjectSet
    Wscript.Echo "Process Name: " & objProcess.Name 
Next

连接到远程计算机上的 WMI