Conexão com o WMI em um computador remoto

O WMI pode ser usado para gerenciar e acessar dados WMI em computadores remotos. As conexões remotas no WMI são afetadas pelas configurações do Firewall do Windows e do DCOM. O UAC (Controle de Conta de Usuário) também pode exigir mudanças em algumas configurações. No entanto, depois que as configurações estiverem corretas, a chamada para um sistema remoto será muito semelhante a uma chamada WMI local. No entanto, você pode optar por torná-lo mais complexo usando credenciais diferentes, protocolos de autenticação alternativos e outros recursos de segurança.

Configurar um computador para uma conexão remota

Para acessar um sistema remoto com o WMI, talvez seja necessário verificar algumas configurações de segurança para confirmar que você tem acesso. Especificamente:

  • O Windows contém vários recursos de segurança que podem bloquear o acesso a scripts em sistemas remotos. Dessa forma, talvez seja necessário modificar as configurações do Active Directory e do Firewall do Windows do sistema antes de fazer uma chamada WMI. Para obter mais informações, consulte Configurar uma conexão WMI remota e Solução de problemas de uma conexão WMI remota.

  • As configurações corretas do DCOM devem ser habilitadas para que uma conexão remota funcione. A mudança nas configurações do DCOM pode permitir que usuários com direitos limitados acessem um computador em uma conexão remota. Para obter mais informações, consulte Proteger uma conexão WMI remota.

Além disso, talvez haja circunstâncias em que você pode querer executar o WMI por meio de uma porta fixa. Para fazer isso, você também precisará alterar suas configurações. Para obter mais informações, consulte Configurar uma porta fixa para o WMI.

Conexão com um computador remoto

Em sua essência, conectar-se a um sistema remoto com o WMI consiste em garantir que você tenha as permissões apropriadas para acessar o sistema e que sua conexão esteja configurada corretamente. Depois que você tiver esses dois elementos, a conexão em si será relativamente simples. Por exemplo, se você estiver usando suas credenciais de segurança padrão, poderá acessar o WMI em um sistema remoto usando o seguinte código:

Conexão remota com o WMI usando o PowerShell

Use o parâmetro -ComputerName comum à maioria dos cmdlets WMI, como Get-WmiObject.

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

Conexão remota com o WMI usando o VBScript

Use um moniker que contém o nome do sistema remoto na chamada para GetObject.

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

Conexão remota com o WMI usando C#

Para a versão atual da interface gerenciada do WMI (Microsoft.Management.Infrastructure), use o objeto CimSession para representar uma conexão com um 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);

Conexão remota com o WMI usando C#

Para a versão v1 da interface gerenciada do WMI (System.Management), use o objeto ManagementScope para representar uma conexão com um 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);

Exemplo: obter dados WMI de um computador remoto (C++)

Use o método IWbemLocator::ConnectServer para especificar o nome do computador remoto no 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
        );

Os exemplos de código anteriores são, sem dúvida, a conexão remota mais básica que você pode executar com o WMI. Especificamente, os exemplos pressupõem o seguinte:

  • Você é um administrador no computador remoto. Devido ao Controle de Conta de Usuário, a conta no sistema remoto deve ser uma conta de domínio no grupo Administradores. Para obter mais informações, confira Controle de Conta do Usuário e WMI.
  • A senha no computador local atual não está em branco. Isso é essencialmente um requisito de segurança do Windows que você deve ter feito logon em seu sistema com uma senha.
  • Os computadores locais e remotos estão dentro do mesmo domínio. Se você precisar cruzar limites de domínio, precisará fornecer informações adicionais ou usar um modelo de programação um pouco diferente.
  • Você está usando sua própria conta para acessar o computador remoto. Se você estivesse tentando acessar uma conta diferente, precisaria fornecer credenciais adicionais. (Observe que não é permitido tentar acessar o WMI localmente com credenciais diferentes da sua conta atual.)
  • Ambos os computadores estão executando o IPv6. O WMI dá suporte a conexões com computadores que executam o IPv6. No entanto, o computador local e o "Computer_B" devem estar executando o IPv6. Qualquer computador também pode estar executando IPv4. Para obter mais informações, consulte Suporte a IPv6 e IPv4 no WMI.
  • O script não precisa delegar, ou seja, ele não precisa acessar computadores remotos adicionais por meio do computador remoto de destino. Para obter mais informações, consulte Delegar com o WMI.
  • Você está tentando fazer uma chamada específica, em vez de criar um processo remoto. Para obter mais informações, consulte Criar processos remotamente usando o WMI.

Com essas restrições em mente, uma chamada WMI remota é muito semelhante a uma chamada WMI local – a única diferença é que você deve especificar o nome do sistema remoto. No entanto, você pode optar por alterar muitos desses recursos: usar credenciais diferentes, rotear sua chamada por meio de um computador de terceiros ou acessar um domínio diferente.