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

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

Não apenas lendo, ao aproveitar 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 muito a administração de muitos sistemas.

Descobrindo Classes com Get-WmiObject

Em seu estado mais básico, 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 as informações que você está procurando estão localizadas.

Existem 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. Usando 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 junto com isso também.

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

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

Obtendo Propriedades WMI

Uma vez que você tem a classe, é hora de investigar e ver quais propriedades estão nessa classe. Talvez você queira ver qual sistema operacional um computador está executando. Você pode 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 olhar a 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 do sistema! Em vez disso, podemos filtrar as instâncias por valor usando o parâmetro Filter ou o parâmetro Query. Vamos ver ambos.

Usando CIM_DataFile como exemplo, talvez eu queira apenas encontrar 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 para o provedor WMI, retornando apenas instâncias que têm uma propriedade Compressed igual a 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 só 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 usar Invoke-WmiMethod, mas isso também pode ser feito com Get-WmiObject. Apenas precisamos capturar uma instância do WMI e então chamar o método nesse objeto.

Aqui está um exemplo de iniciar remotamente o notepad.exe em um computador remoto. Como bônus, estamos usando uma credencial alternativa 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 destacada é que o sucessor deste cmdlet é: Get-CimInstance. Embora Get-CimInstance forneça algumas vantagens ao usar PowerShell Remoting como seu protocolo de conectividade remota padrã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 também. Caso contrário, você precisará habilitar o PowerShell Remoting nos pontos de extremidade remotos ao querer usar Get-CimInstance via WSMAN.

Para uma explicação completa, confira a documentação da Microsoft.

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