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.
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á.
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 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
.
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 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!
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.