Conexión a WMI de forma remota con VBScript

Puede crear una conexión remota a WMI con VBScript mediante la creación de un objeto de conexión. Este objeto contiene el nombre del equipo, el espacio de nombres de WMI al que desea conectarse, así como las credenciales pertinentes y los niveles de autenticación.

Para conectarse a un sistema remoto mediante VBScript

  1. Especifique la información de conexión, como el nombre del equipo remoto, las credenciales y el nivel de autenticación de la conexión.

    Si se conecta a un equipo remoto con las mismas credenciales (dominio y nombre de usuario) con las que ha iniciado sesión, puede especificar la información de conexión en un monikerGetObject, como se describe en el ejemplo de código siguiente.

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

    Por lo general, debe especificar el espacio de nombres de WMI al que conectarse en el equipo remoto. Esto se debe a que es posible que el espacio de nombres predeterminado no sea el mismo en equipos diferentes. Especificar el espacio de nombres garantiza que se conecte al mismo espacio de nombres en todos los equipos.

    Para más información sobre las constantes de VBScript y las cadenas de scripting para usar la conexión de moniker, consulte Establecimiento del nivel de seguridad de proceso predeterminado mediante VBScript.

  2. Si se conecta a un equipo remoto en un dominio diferente o usa un nombre de usuario y una contraseña diferentes, debe usar el método SWbemLocator.ConnectServer.

    Al igual que con un moniker, puede usar ConnectServer para especificar las credenciales, el nivel de autenticación y el espacio de nombres de la conexión remota. En el ejemplo de código siguiente se describe el uso de ConnectServer para acceder a un equipo remoto mediante una cuenta de administrador y una contraseña.

    strComputer = "Computer_B"
    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                         "Root\CIMv2", _
                                                         "fabrikam\administrator", _
                                                         "password")
    
  3. Al usar la función ConnectServer para conexiones remotas, establezca la suplantación y la autenticación en el objeto de seguridad obtenido mediante una llamada a SWbemServices.Security. Puede usar la enumeración WbemImpersonationLevelEnum para especificar el nivel de suplantación.

    En el ejemplo de código siguiente se establece el nivel de suplantación para el ejemplo de código de VBScript anterior.

    objSWbemServices.Security_.ImpersonationLevel = 3
    

    Tenga en cuenta que algunas conexiones requieren un nivel de autenticación específico. Para más información, consulte Configurar la seguridad del proceso de aplicación cliente y Protección de clientes de scripting.

    En concreto, debe establecer el nivel de autenticación en RPC_C_AUTHN_LEVEL_PKT_PRIVACY o en 6 si el espacio de nombres al que se conecta en el equipo remoto requiere una conexión cifrada antes de que devuelva datos. También puede usar este nivel de autenticación, incluso si el espacio de nombres no lo requiere. Esto garantiza que los datos se cifren a medida que cruzan la red. Si intenta establecer un nivel de autenticación inferior al permitido, se devolverá un mensaje de acceso denegado. Para más información, consulte Exigencia de una conexión cifrada a un espacio de nombres.

Una vez que haya realizado la conexión, puede seguir accediendo a los datos de WMI. Para más información, consulte Tareas de WMI para scripts y aplicaciones.

Ejemplos

Para obtener un ejemplo de VBScript más grande, consulte la sección Ejemplos de la página de referencia de SWbemLocator.ConnectServer.

El siguiente ejemplo de código de VBScript se conecta a un grupo de equipos remotos del mismo dominio mediante la creación de una matriz de nombres de equipos remotos y, a continuación, se muestran los nombres de los dispositivos Plug and Play (instancias de Win32_PnPEntity) en cada equipo. Para ejecutar el script siguiente, debe ser administrador en los equipos remotos. Tenga en cuenta que el script debe agregar las "\\" necesarias antes de agregar el nombre del equipo remoto durante la configuración del nivel de suplantación. Para más información sobre rutas de acceso de WMI, consulte Descripción de la ubicación de un objeto 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

El siguiente ejemplo de código de VBScript le permite conectarse a un equipo remoto mediante credenciales diferentes. Por ejemplo, un equipo remoto en un dominio diferente o conectarse a un equipo remoto que requiera un nombre de usuario y una contraseña diferentes. En este caso, use la conexión 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

Conexión a WMI en un equipo remoto