Conexión a WMI en un equipo remoto

WMI se puede usar para administrar y acceder a los datos de WMI en equipos remotos. Las conexiones remotas en WMI se ven afectadas por la configuración de DCOM y Firewall de Windows. El Control de cuentas de usuario (UAC) también puede requerir cambios en algunas configuraciones. Pero una vez que la configuración sea correcta, la llamada a un sistema remoto es muy similar a una llamada a WMI local. Sin embargo, puede optar por hacerlo más complejo mediante credenciales diferentes, protocolos de autenticación alternativos y otras características de seguridad.

Configuración de un equipo para una conexión remota

Para acceder a un sistema remoto con WMI, es posible que tenga que comprobar algunas opciones de seguridad para confirmar que tiene acceso. Concretamente:

  • Windows contiene una serie de características de seguridad que pueden bloquear el acceso a scripts en sistemas remotos. Por lo tanto, es posible que tenga que modificar la configuración de Active Directory y Firewall de Windows del sistema antes de realizar una llamada a WMI. Para más información, consulte Configuración de una conexión WMI remota y Solución de problemas de una conexión WMI remota.

  • La configuración correcta de DCOM debe estar habilitada para que una conexión remota funcione. Cambiar la configuración de DCOM puede permitir que los usuarios con derechos reducidos accedan a un equipo para una conexión remota. Para más información, consulte Protección de una conexión WMI remota.

Además, puede querer ejecutar WMI a través de un puerto fijo en algunas ocasiones. Para ello, también tendrá que cambiar la configuración. Para más información, consulte Configuración de un puerto fijo para WMI.

Connecting to a Remote Computer

Esencialmente, la conexión a un sistema remoto con WMI consiste en asegurarse de que tiene los permisos adecuados para acceder al sistema y de que la conexión está configurada correctamente. Una vez que tenga esos dos elementos, la conexión misma es relativamente sencilla. Por ejemplo, si usa sus credenciales de seguridad predeterminadas, puede acceder a WMI en un sistema remoto mediante el código siguiente:

Conexión a WMI de manera remota con PowerShell

Use el parámetro -ComputerName común a la mayoría de los cmdlets WM, como Get-WmiObject.

$strComputer = "Computer_B"
$colSettings = Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer

Conexión a WMI de manera remota con VBScript

Use un moniker que contenga el nombre del sistema remoto en la llamada a GetObject.

strComputer = "Computer_B"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

Conexión a WMI de manera remota con C#

Para la versión actual de la interfaz administrada de WMI (Microsoft.Management.Infrastructure), use el objeto CimSession para representar una conexión a un host remoto.

using Microsoft.Management.Infrastructure;
...
string Namespace = @"root\cimv2";
string OSQuery = "SELECT * FROM Win32_OperatingSystem";
CimSession mySession = CimSession.Create("Computer_B");
IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", OSQuery);

Conexión a WMI de manera remota con C#

Para la versión v1 de la interfaz administrada de WMI (System.Management), use el objeto ManagementScope para representar una conexión a un host remoto.

using System.Management;
...
ManagementScope scope = new ManagementScope("\\\\Computer_B\\root\\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

Ejemplo: Obtención de datos WMI desde un equipo remoto (C++)

Use el método IWbemLocator::ConnectServer para especificar el nombre del equipo remoto en el parámetro strNetworkResource.

    hres = pLoc->ConnectServer(
        _bstr_t(L"\\\\COMPUTER_B\\root\\cimv2"),
        _bstr_t(useToken?NULL:pszName),    // User name
        _bstr_t(useToken?NULL:pszPwd),     // User password
        NULL,                              // Locale             
        NULL,                              // Security flags
        _bstr_t(useNTLM?NULL:pszAuthority),// Authority        
        NULL,                              // Context object 
        &pSvc                              // IWbemServices proxy
        );

Los ejemplos de código anteriores son posiblemente la conexión remota más básica que se puede realizar con WMI. En concreto, en los ejemplos se asume lo siguiente:

  • Es administrador de la máquina remota. Debido al Control de cuentas de usuario, la cuenta del sistema remoto debe ser una cuenta de dominio en el grupo Administradores. Para más información, consulte Control de cuentas de usuario y WMI.
  • La contraseña de la máquina local actual no está en blanco. Esencialmente, un requisito de seguridad de Windows indica que debe haber iniciado sesión en el sistema con una contraseña.
  • Los equipos locales y remotos están dentro del mismo dominio. Si necesita cruzar los límites de dominio, deberá proporcionar información adicional o usar un modelo de programación ligeramente distinto.
  • Está usando su propia cuenta para acceder a la máquina remota. Si estuviera intentando acceder a una cuenta distinta, tendría que proporcionar credenciales adicionales. (Tenga en cuenta que no se permite intentar acceder a WMI localmente con credenciales diferentes de la cuenta actual).
  • Ambos equipos ejecutan IPv6. WMI admite conexiones a equipos que ejecutan IPv6. Sin embargo, tanto la máquina local como "Computer_B" deben ejecutar IPv6. Cualquier equipo también puede ejecutar IPv4. Para más información, consulte Compatibilidad con IPv6 e IPv4 Support en WMI.
  • El script no necesita delegar, es decir, no necesita acceder a equipos remotos adicionales a través del equipo remoto de destino. Para más información, consulte Delegación con WMI.
  • Está intentando realizar una llamada específica en lugar de crear un proceso remoto. Para más información, consulte Creación de procesos de manera remota mediante WMI.

Teniendo en cuenta esas restricciones, una llamada a WMI remota es muy similar a una llamada a WMI local: la única diferencia es que debe especificar el nombre del sistema remoto. Sin embargo, puede optar por cambiar muchas de esas características: usar credenciales diferentes, o bien enrutar la llamada a través de un equipo de terceros o acceder a otro dominio.