Obtendo objetos WMI (Get-WmiObject)

O WMI (instrumentação de gerenciamento do Windows) é uma tecnologia fundamental para a administração de sistemas Windows porque expõe uma grande variedade de informações de uma maneira uniforme. Por causa de tudo o que o WMI pode fazer, o cmdlet do Windows PowerShell para acesso a objetos WMI, Get-WmiObject, é um dos mais úteis cmdlets para o trabalho real. Vamos mostrar como o Get-WmiObject pode ser usado para acessar objetos WMI e como usar objetos WMI para tarefas específicas.

Listando as classes WMI

O primeiro problema que a maioria dos usuários de WMI encontra é tentar descobrir o que pode ser feito com ele. As classes WMI descrevem os recursos que podem ser gerenciados. Existem centenas de classes WMI, algumas delas com dezenas de propriedades.

Get-WmiObject resolve esse problema tornando o WMI detectável. É possível obter uma lista de classes WMI disponíveis no computador local se digitarmos:

PS> Get-WmiObject -List


__SecurityRelatedClass                  __NTLMUser9X
__PARAMETERS                            __SystemSecurity
__NotifyStatus                          __ExtendedStatus
Win32_PrivilegesStatus                  Win32_TSNetworkAdapterSettingError
Win32_TSRemoteControlSettingError       Win32_TSEnvironmentSettingError
...

Você pode recuperar as mesmas informações de um computador remoto usando o parâmetro ComputerName, especificando o nome de um computador ou um endereço IP:

PS> Get-WmiObject -List -ComputerName 192.168.1.29


__SystemClass                           __NAMESPACE
__Provider                              __Win32Provider
__ProviderRegistration                  __ObjectProviderRegistration
...

A lista de classes retornada por computadores remotos pode variar devido ao sistema operacional específico em execução no computador e as extensões WMI em particular adicionadas pelos aplicativos instalados.

Observação:

Quando você utiliza Get-WmiObject para se conectar a um computador remoto, o WMI precisa estar em execução no computador remoto e, sob a configuração padrão, a conta utilizada deve ser membro do grupo de administradores locais do computador remoto. O sistema remoto não precisa ter o Windows PowerShell instalado. Isso permite que você administre sistemas operacionais que não estejam executando o Windows PowerShell mas que tenham o WMI disponível.

Você também pode incluir ComputerName na conexão ao sistema local. Você pode usar o nome do computador local, seu endereço IP (ou o endereço de loopback 127.0.0.1) ou o estilo de WMI '.' como nome do computador. Se o Windows PowerShell estiver em execução em um computador chamado Admin01 com o endereço IP 192.168.1.90, os comandos a seguir retornarão a lista de classes WMI do computador:

Get-WmiObject -List
Get-WmiObject -List -ComputerName .
Get-WmiObject -List -ComputerName Admin01
Get-WmiObject -List -ComputerName 192.168.1.90
Get-WmiObject -List -ComputerName 127.0.0.1
Get-WmiObject -List -ComputerName localhost

Get-WmiObject utiliza o namespace root/cimv2 por padrão. Se você quiser especificar outro namespace WMI, utilize o parâmetro Namespace e especifique o caminho para namespace correspondente:

PS> Get-WmiObject -List -ComputerName 192.168.1.29 -Namespace root


__SystemClass                           __NAMESPACE
__Provider                              __Win32Provider
...

Exibindo detalhes da classe do WMI

Se você já sabe o nome de uma classe do WMI, pode usá-lo para obter informações de forma imediata. Por exemplo, uma das classes WMI mais utilizadas para a recuperação de informações sobre um computador é Win32_OperatingSystem.

PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName .


SystemDirectory : C:\WINDOWS\system32
Organization    : Global Network Solutions
BuildNumber     : 2600
RegisteredUser  : Oliver W. Jones
SerialNumber    : 12345-678-9012345-67890
Version         : 5.1.2600

Embora estejamos mostrando todos os parâmetros, o comando pode ser expresso de uma forma mais sucinta. O parâmetro ComputerName não é necessário na conexão ao sistema local. Nós o exibimos para demonstrar o caso mais geral e lembrá-lo de que ele existe. O padrão de Namespace é root/cimv2 e também pode ser omitido. Finalmente, a maioria dos cmdlets permite que você omita o nome dos parâmetros comuns. Com Get-WmiObject, se nenhum nome for especificado para o primeiro parâmetro, o Windows PowerShell o tratará como o parâmetro Class. Isso significa que o último parâmetro poderia ter sido emitido desta forma:

Get-WmiObject Win32_OperatingSystem

A classe Win32_OperatingSystem possui muito mais propriedades do que as mostradas aqui. Você pode utilizar Get-Member para ver todas elas. As propriedades de uma classe WMI estão automaticamente disponíveis, assim como outras propriedades de objeto:

PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Get-Member -MemberType Property


   TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSyste
m

Name                                      MemberType Definition
----                                      ---------- ----------
__CLASS                                   Property   System.String __CLASS {...
...
BootDevice                                Property   System.String BootDevic...
BuildNumber                               Property   System.String BuildNumb...
...

Exibindo as propriedades que não são padrão com os cmdlets Format

Caso você queira obter informações da classe Win32_OperatingSystem que não sejam mostradas por padrão, poderá exibi-las usando os cmdlets Format. Por exemplo, se desejar exibir os dados sobre a memória disponível, digite:

PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-Table -Property TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles

TotalVirtualMemorySize TotalVisibleMem FreePhysicalMem FreeVirtualMemo FreeSpaceInPagi
                              ory              ry         ngFiles
--------------- --------------- --------------- --------------- ---------------
        2097024          785904          305808         2056724         1558232
Observação:

Os caracteres curinga funcionam com nomes de propriedade em Format-Table; portanto, o elemento final do pipeline pode ser reduzido a Format-Table -Property TotalV*,Free*

Os dados sobre a memória podem ficar mais legíveis se você os formatar como uma lista:

PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-List TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles


TotalVirtualMemorySize : 2097024
TotalVisibleMemorySize : 785904
FreePhysicalMemory     : 301876
FreeVirtualMemory      : 2056724
FreeSpaceInPagingFiles : 1556644




Sumário