Bem-vindo à aula sobre WMI e CIM no PowerShell! Nesta aula, você vai entender dois conceitos fundamentais para administração de sistemas Windows: WMI (Windows Management Instrumentation) e CIM (Common Information Model). Vamos explorar como o PowerShell moderno utiliza o CIM para consultar informações do sistema de forma mais segura e eficiente, e como isso se compara ao WMI legado.

O WMI foi a forma tradicional de acessar informações de gerenciamento no Windows, mas o CIM, baseado em padrões abertos, oferece uma abordagem mais consistente e multiplataforma. O cmdlet Get-CimInstance é a ferramenta principal para trabalhar com CIM no PowerShell. Vamos mergulhar fundo nesse assunto!

Get-CimInstance

O cmdlet Get-CimInstance é usado para consultar instâncias de classes CIM em um sistema local ou remoto. Ele substitui o antigo Get-WmiObject e oferece vantagens como suporte a protocolos padronizados (WS-Management) e melhor integração com o pipeline do PowerShell.

A sintaxe básica é simples: você especifica o nome da classe que deseja consultar, como Win32_Process ou Win32_OperatingSystem. O cmdlet retorna objetos que podem ser manipulados como qualquer outro objeto no PowerShell.

Get-CimInstance -ClassName Win32_Processor

Você também pode usar filtros para refinar a consulta, semelhante a uma consulta SQL, utilizando o parâmetro -Filter. Por exemplo, para obter apenas processos com mais de 100 MB de memória:

Get-CimInstance -ClassName Win32_Process -Filter "WorkingSetSize > 104857600"

Outra funcionalidade importante é a capacidade de consultar computadores remotos usando o parâmetro -ComputerName. Isso permite administrar várias máquinas a partir de um único comando.

Consultando o sistema

Com o Get-CimInstance, você pode obter informações detalhadas sobre hardware, sistema operacional, serviços, processos e muito mais. Vamos ver alguns exemplos práticos de consultas comuns.

Para obter informações sobre o sistema operacional:

Get-CimInstance -ClassName Win32_OperatingSystem

Para listar todos os serviços e seu status:

Get-CimInstance -ClassName Win32_Service | Select-Object Name, State, StartMode

Para obter informações sobre discos rígidos:

Get-CimInstance -ClassName Win32_DiskDrive

Você pode combinar consultas com cmdlets como Where-Object, Sort-Object e Select-Object para filtrar e formatar a saída conforme necessário.

vs WMI legado

O WMI legado, acessado via Get-WmiObject, ainda funciona, mas o CIM é recomendado para novos scripts. As principais diferenças incluem:

  • Protocolo: O WMI usa DCOM, enquanto o CIM usa WS-Management (WSMan), que é mais seguro e funciona melhor em firewalls.
  • Padrão: O CIM segue um padrão aberto da DMTF, permitindo interoperabilidade com outros sistemas.
  • Desempenho: O CIM é geralmente mais rápido e eficiente.
  • Comandos: Get-CimInstance oferece uma sintaxe mais consistente e integração com o pipeline.

Por exemplo, para obter a versão do BIOS, no WMI legado você usaria:

Get-WmiObject -Class Win32_BIOS

No CIM, a sintaxe é semelhante, mas com melhorias:

Get-CimInstance -ClassName Win32_BIOS

Além disso, o CIM permite usar o parâmetro -CimSession para reutilizar conexões, o que é mais eficiente para múltiplas consultas.

Exemplos

Vamos colocar em prática com alguns exemplos completos que você pode usar no seu dia a dia.

Exemplo 1: Informações do processador

Get-CimInstance -ClassName Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors

Exemplo 2: Listar serviços que estão parados

Get-CimInstance -ClassName Win32_Service -Filter "State='Stopped'" | Select-Object Name, DisplayName

Exemplo 3: Uso de memória dos processos

Get-CimInstance -ClassName Win32_Process | Sort-Object WorkingSetSize -Descending | Select-Object -First 10 Name, ProcessId, WorkingSetSize

Exemplo 4: Consulta remota

Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName "Servidor01"

Exemplo 5: Criando uma sessão CIM para múltiplas consultas

$session = New-CimSession -ComputerName "Servidor01"
Get-CimInstance -ClassName Win32_Process -CimSession $session
Get-CimInstance -ClassName Win32_Service -CimSession $session
Remove-CimSession $session

Esses exemplos mostram como o CIM pode ser poderoso e flexível para administração de sistemas.

Boas práticas

  • Prefira Get-CimInstance em vez de Get-WmiObject em novos scripts.
  • Use filtros no parâmetro -Filter para reduzir a quantidade de dados transferidos, especialmente em consultas remotas.
  • Reutilize sessões CIM quando for fazer várias consultas ao mesmo computador.
  • Combine com outros cmdlets para formatar a saída conforme necessário.

Referências

Exercícios

  1. Qual é o cmdlet recomendado para consultar informações de gerenciamento no PowerShell moderno e por quê?
  2. ✓ Resposta: O cmdlet recomendado é Get-CimInstance, porque usa o padrão CIM baseado em WS-Management, que é mais seguro, eficiente e interoperável do que o WMI legado (Get-WmiObject).
  3. Escreva um comando para listar todos os serviços que estão em execução.
  4. ✓ Resposta:
    Get-CimInstance -ClassName Win32_Service -Filter "State='Running'"
  5. Como você faria uma consulta remota a um computador chamado "Servidor01" para obter informações do sistema operacional?
  6. ✓ Resposta:
    Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName "Servidor01"
  7. Qual a principal diferença entre WMI e CIM em termos de protocolo?
  8. ✓ Resposta: O WMI usa DCOM (Distributed Component Object Model), enquanto o CIM usa WS-Management (WSMan), que é um protocolo padrão baseado em SOAP, mais seguro e compatível com firewalls.
  9. Escreva um script que crie uma sessão CIM para um computador remoto e execute duas consultas diferentes usando essa sessão.
  10. ✓ Resposta:
    $session = New-CimSession -ComputerName "Servidor01"
    Get-CimInstance -ClassName Win32_Process -CimSession $session
    Get-CimInstance -ClassName Win32_Service -CimSession $session
    Remove-CimSession $session