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.
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á.
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.
I can now see a property called Caption
that lets me know the version of Windows.
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
.
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.
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!
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.