Get-WmiObject: Consultar o WMI para Informações do Computador

Sempre que precisamos descobrir qualquer informação sobre um computador com Windows e seus componentes, podemos fazer isso com Get-WmiObject.

Não apenas lendo, mas também utilizando os métodos WMI, Get-WmiObject também pode executar ações em sistemas locais ou remotos. Este cmdlet é um dos poucos no PowerShell que pode trabalhar com o repositório WMI para facilitar bastante a gestão de muitos sistemas.

Descobrindo Classes com Get-WmiObject

Na sua forma mais básica, este cmdlet pode consultar informações de um computador local. Tudo o que você precisa saber é o namespace (provavelmente root\cimv2, que é o padrão) e a classe WMI onde a informação que você procura está localizada.

Há milhares de classes, e você provavelmente não sabe qual classe gostaria de usar ainda. Usando Get-WmiObject, podemos consultar todas as classes disponíveis em um namespace. Ao usar Get-WmiObject -List, você poderá ver todas as classes no namespace root\cimv2. Se precisar verificar classes em outro namespace, você sempre pode usar o parâmetro Namespace juntamente com isso.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

Name				Methods	Properties
CIM_Indication		{}		{CorrelatedIndications, IndicationFilterName, IndicationIde...
CIM_ClassIndication	{}    	{ClassDefinition, CorrelatedIndications, IndicationFilterNa........

Obtendo Propriedades WMI

Depois de obter a classe, é hora de investigar e ver quais propriedades estão nela. Talvez eu queira ver qual sistema operacional um computador está executando. Eu posso estar criando um relatório e gostaria de ver o que uma máquina remota está executando. Get-WmiObject possui um parâmetro ComputerName onde você pode especificar um ou mais computadores remotos em vez de localmente.

Meu computador remoto é um controlador de domínio chamado DC. Vou dar uma olhada na classe Win32_OperatingSystem para ver quais propriedades estão lá.

PS> Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem

SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 9600
RegisteredUser  : Windows User
SerialNumber    : 00252-00108-14656-AA864
Version         : 6.3.9600

Essa é uma informação útil, mas não vejo o nome do sistema operacional. Semelhante a muitas outras saídas do PowerShell, você não vê todas as propriedades. Para isso, teremos que usar Select-Object para retornar todas as propriedades.

Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *

I can now see a property called Caption that lets me know the version of Windows.

PS> (Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *).Caption Microsoft Windows Server 2012 R2 Standard

Encontrando Propriedades WMI

E se você não estiver procurando por uma propriedade específica, mas sim por uma propriedade que corresponda a um valor específico? Por exemplo, podemos consultar todas as instâncias na classe CIM_DataFile, mas isso retornaria todos os arquivos no sistema! Em vez disso, podemos filtrar as instâncias por valor usando o parâmetro Filter ou Query. Vamos ver ambos.

Usando CIM_DataFile como exemplo, talvez eu queira encontrar apenas instâncias que representem arquivos compactados. Como a propriedade Compressed é uma propriedade em cada instância e é um valor booleano, posso usar o parâmetro Filter para enviar o filtro diretamente ao provedor WMI, retornando apenas instâncias que tenham a propriedade Compressed como True.

Get-WmiObject -Class CIM_DataFile -Filter "Compressed = 'True'"

Se você conhece WQL, também pode selecionar a classe e especificar o “filtro” por conta própria, criando sua própria consulta WQL também.

Get-WmiObject -Query "SELECT * FROM CIM_DataFile WHERE Compressed = 'True'"

Invocando Métodos WMI

Get-WmiObject não apenas pode ler informações do WMI, mas também pode facilitar a invocação de métodos do WMI. Um método comum do WMI que é invocado é o método Create na classe Win32_Process. Existem algumas maneiras diferentes de invocar métodos do WMI, como o uso do Invoke-WmiMethod, mas isso também pode ser feito com o Get-WmiObject. Apenas precisamos capturar uma instância do WMI e, em seguida, chamar o método nesse objeto.

Aqui está um exemplo de iniciar o notepad.exe remotamente em um computador remoto. Como bônus, estamos usando credenciais alternativas para fazer isso também!

$cred = get-credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -namespace "root\cimv2" -computername 'FOO' -credential $cred $process.Create( "notepad.exe" )

WMI, DCOM e PowerShell Remoting

Uma última coisa a ser observada é que o sucessor deste cmdlet é: Get-CimInstance. Embora o Get-CimInstance forneça algumas vantagens ao usar PowerShell Remoting como protocolo padrão de conectividade remota, o Get-WmiObject às vezes é mais fácil de usar.

Get-WmiObject usa DCOM para se comunicar com computadores remotos e geralmente está disponível. Caso contrário, será necessário habilitar o PowerShell Remoting nos pontos de extremidade remotos ao desejar usar o Get-CimInstance via WSMAN.

Para uma análise completa, consulte a documentação da Microsoft.

Source:
https://adamtheautomator.com/get-wmiobject/