使用 VBScript 远程连接到 WMI

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

使用 VBScript 连接到远程系统

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

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

    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