Conectando-se ao 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 de Firewall e DCOM do Windows. O UAC (Controle de Conta de Usuário) também pode exigir alterações em algumas configurações. No entanto, depois que suas 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.
Configurando um computador para uma conexão remota
Antes de acessar um sistema remoto com o WMI, talvez seja necessário verificar algumas configurações de segurança para confirmar se você tem acesso. Especificamente:
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 Windows do sistema antes de fazer uma chamada WMI. Para obter mais informações, consulte Configurar uma conexão WMI remota e solucionar problemas de uma conexão WMI remota.
As configurações corretas do DCOM devem ser habilitadas para que uma conexão remota funcione. Alterar as configurações de DCOM pode permitir que usuários de direitos baixos acessem um computador para uma conexão remota. Para obter mais informações, consulte Como proteger uma conexão WMI remota.
Além disso, pode haver algumas 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 Configurando uma porta fixa para WMI.
Conectando-se a um computador remoto
Em seu coração, 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:
-
Use o parâmetro -ComputerName comum à maioria dos cmdlets WMI, como Get-WmiObject.
$strComputer = "Computer_B" $colSettings = Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer -
Use um moniker que contenha 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") -
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); -
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); -
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, consulte Controle de Conta de Usuário e WMI.
- A senha no computador local atual não está em branco. Isso é essencialmente um requisito de segurança Windows que você deve ter conectado ao 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 ligeiramente 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 a tentativa de acessar o WMI localmente com credenciais diferentes da sua conta atual não é permitida.)
- Ambos os computadores estão executando IPv6. O WMI dá suporte a conexões com computadores que executam 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 o suporte para 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 Delegação com WMI.
- Você está tentando fazer uma chamada específica, em vez de criar um processo remoto. Para obter mais informações, consulte Criando 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: usando credenciais diferentes ou roteando sua chamada por meio de um computador de terceiros ou acessando um domínio diferente.