O Windows Management Instrumentation (WMI) existe há bastante tempo no Windows. Muitos profissionais de TI utilizam o WMI diretamente ou ferramentas que leem informações do WMI. Você sabia que os cmdlets do PowerShell para WMI são integrados por padrão?
O WMI é o local de referência para obter informações sobre uma máquina Windows e para manipular vários serviços dentro do Windows. Devido à vasta gama de informações do WMI, é possível explorar usando os cmdlets do PowerShell para WMI. A utilização do PowerShell para interrogar o WMI permite automatizar milhares de tarefas em computadores Windows.
Felizmente, um dos primeiros sistemas no Windows para os quais o PowerShell tinha comandos foi o WMI. Como você possui os cmdlets nativos do PowerShell para WMI, isso significa que um administrador de TI pode aproveitar a sintaxe fácil de entender de verbo/substantivo do PowerShell para interagir com o WMI e, como verá, usuários avançados também podem invocar eventos e classes do WMI diretamente usando comandos padrão do PowerShell.
Cmdlets do PowerShell para WMI vs. CIM
Há dois conjuntos de comandos quando se trata de usar o WMI no PowerShell. Algumas pessoas se referem a esses conjuntos como o método “antigo” de interagir com o WMI e os cmdlets CIM. Ao consultar informações do WMI, ambos retornam as mesmas informações, mas abordam de maneira um pouco diferente. O método “antigo” de ler informações do WMI é usando o comando Get-WmiObject
. Outros cmdlets do WMI incluem Invoke-WmiMethod
, Register-WMIEvent
e assim por diante, mas não abordaremos esses em nosso artigo.
O cmdlet PowerShell WMI Get-WmiObject
funciona, mas tem uma séria limitação. Ao consultar computadores remotos, ele depende do DCOM e historicamente o DCOM tem sido um vetor de ataque para pessoas mal-intencionadas. O DCOM geralmente é bloqueado por vários firewalls. Como este é o “modo antigo”, não vamos entrar neste método. Em vez disso, vamos nos concentrar nos cmdlets CIM: principalmente, Get-CimInstance
.

A grande diferença entre Get-WmiObject
e Get-CimInstance
é que, em vez de usar DCOM para acessar computadores remotos, Get-CimInstance
usa o protocolo WSMAN, que é o transporte para o recurso familiar de remoting do PowerShell.
Cmdlets CIM do PowerShell
Vamos dizer que você gostaria de retornar algumas informações sobre a versão do Windows em um computador remoto. Neste caso, gostaria de ver algumas informações de um computador chamado DC. Você pode fazer isso especificando a classe WMI que contém as informações e o nome do computador que gostaria de consultar.
Você pode ver abaixo que, como Get-CimInstance
não exibe, por padrão, todos os atributos dentro da classe, tive que encaminhar a saída para o comando Select-Object
para retornar todas as propriedades.
Não só é possível reunir informações através de propriedades, mas também é possível invocar métodos WMI/CIM em classes também. Um bom exemplo disso é interromper um processo em um computador remoto. Nativamente, não há como fazer isso através do comando Stop-Process
no PowerShell. No entanto, há um caminho via consulta WMI. Para encerrar processos remotos, primeiro precisamos descobrir qual processo gostaríamos de encerrar. Podemos enumerar todos os processos em execução em um computador remoto olhando para a classe Win32_Process
.
Depois de descobrir qual processo encerrar, você pode passar o nome para o método Terminate()
na classe Win32_Process
. Para fazer isso, você precisa capturar uma instância do processo que deseja encerrar.
Observe abaixo que estou usando o parâmetro Filter
para garantir que eu receba apenas o processo ccmexec.exe
. Isso é importante!
Depois de capturar a instância, você pode então invocar o método Terminate()
para encerrar o processo usando o comando Invoke-CimMethod
conforme mostrado abaixo.
Resumo
Se você gostaria de aprender mais sobre o uso do WMI no PowerShell e especialmente sobre o uso do cmdlet do PowerShell WMI Get-WmiObject
que não foi abordado aqui, eu encorajo você a conferir Get-WmiObject: Consultando WMI em Computadores Locais e Remotos onde eu aprofundo o WMI e uso o cmdlet Get-WmiObject
.
Para uma análise completa de todos os cmdlets CIM e como eles funcionam no PowerShell, consulte o artigo Introdução aos Cmdlets CIM no Technet. Lá você verá todos os vários cmdlets CIM e como eles podem ser usados em seus scripts.