LA.Net
Reflexões sobre C#, .Net e programação em geral

Há muito tempo atrás, prometi falar acerca da utilização de WMI no Monad. Pois bem, é chegada a altura de cumprir essa promessa

O WMI (Windows  Management Instrumentation) foi lançado no final dos anos 90 e tinha como principal objectivo automatizar as tarefas administrativas efectuadas numa máquina. Até ao seu lançamento, essas tarefas administrativas eram feitas sempre (em última análise) através da win 32 API. Na prática, a WMI não é mais do que uma framework de objectos COM que permite o fácil acesso aos recursos expostos pelo SO.

Vamos começar com um exemplo simples: obter a memória existente num computador. Para tal, temos apenas de executar o seguinte comando:

MSH c:\>get-wmiobject Win32_logicalMemoryConfiguration


Name                 totalvirtualmemory totalphysicalmemory  totalpagefilespace
----                 ------------------ -------------------  ------------------
LogicalMemoryCon...             3568752             1047920             2520832

Aqueles que conhecem o WMI já devem ter reconhecido algo familiar: a classe Win32_LogicalMemoryConfiguration. Uma classe WMI representa um recurso de uma máquina (no exemplo anterior, a classe win32_logicalmemoryconfiguration permite aceder á memória existente na máquina onde o comando é executado). A utilização de WMI necessita (quase) sempre de três passos: em primeiro lugar, é necessário estabelecer a ligação ao serviço WMI no computador desejado; em seguida, é necessário obter um (ou mais) objecto(s)  associado(s) ao recurso que contém a informação pretendida. Finalmente, temos de aceder às propriedades dos objectos retornados pelo passo 2 para obtermos os dados pretendidos. Para melhor apreciarmos o Monad, vamos ver as linhas necessárias para obter a memória através de um script vbs:

set wbemServices = GetObject( “winmgmts:\\nome do computador” )
set wbemobjectset = wbemServices.InstancesOf( “Win32_LogicalMemoryConfiguration”)

foreach wbemobject in wbemobjcset
   wscript.echo wbemObject.TotalPhysicalMemory
next

No Monad não temos de escrever tanto para obter o mesmo resultado (algo que, para alguém preguiçoso como eu, é sempre positivo ).

De volta ao WMI, é importante recordar que as classes que representam os recursos são mantidas no interior de vários namespaces. Como seria de esperar, o cmdlet get-wmiobject permite identificar o namespace através da opção -namespace. Já agora, é importante salientar (especialmente para os que, como eu, não costumam usar o WMI) que a classe usada no exemplo anterior está colocada no interior de um namespace -neste caso, a classe encontra-se no interior do namespace root\cimv2 que é usado por predefinição. Portanto, se quiséssemos ser precisos, poderíamos ter obtido os mesmos resultados através do comando seguinte:

MSH c:\>get-wmiobject Win32_logicalMemoryConfiguration -namespace root\cimv2

O parâmetro -list pode ser usado sempre que for necessário obter uma listagem de todas as classes existentes no interior de um namespace. Portanto, se quisermos ver todas as classes mantidas no interior do namespace, podemos recorrer ao seguinte comando:

MSH c:\>get-wmiobject -list

No seguimento dos conceitos apresentados, não será surpresa se afirmar que o comando anterior apresenta as classes existentes no interior do namespace predefinido (ou seja, as classes mantidas no namespace root\cimv2). Se  estivermos interessados em apresentar as classes existentes noutro namespace, então devemos utilizar o parâmetro -list em conjunto com o parâmetro -namespace.

Este cmdlet apresenta ainda outros parâmetros interessantes, como por exemplo, o parâmetro -cedential. Este parâmetro permite-nos definir as credenciais que serão associadas ao comando. Este parâmetro dá imenso jeito já que permite-nos impersonalizar um utilizador para executar a operação pretendida (algo que dá sempre jeito se estiverem a usar uma conta não administrativa – se não o estão a fazer neste momento, então está na hora de começarem  – ou se precisarem de executar o comando sobre outra máquina). O parâmetro pode receber um objecto do MshCredential que é capaz de guardar o par nome de utilizador/palavra-chave que identificam a conta de um utilizador. A construção deste objecto pode ser feita de várias formas.

A forma mais simples de usar este parâmetro consiste em associá-lo apenas so nome de utilizador. Neste caso, temos apenas de fazer o seguinte:

MSH c:\>get-wmiobject Win32_logicalMemoryConfiguration -namespace root\cimv2 -credential Maquina\utilizador

A execução do comando anterior resulta na apresentação de um diálogo que permite a introdução da palavra-chave associada ao utilizador Maquina\utilizador. Apesar de interessante, esta solução não é adequada quando pretendemos executar várias acções num script. Nestas situações, podemos obter as credenciais de um utilizador e mantê-las numa variável que será usada posteriormente:

MSH c:\>$mycredentials = get-credential

MSH c:\>get-wmiobject Win32_logicalMemoryConfiguration -namespace root\cimv2 -credential $mycredentials

No exemplo anterior, as credenciais introduzidas pelo utilizador são mantidas na variável $mycredentials (como era de esperar, o cmdlet get-credential retorna um objecto do tipo MshCredential). A utilização desta estratégia permite reutilizar as credenciais introduzidas nos comandos executados posteriormente. De volta ao cmdlet get-wmiobject, para referir que a indicação da máquina onde o comando é executado é determinada pelo parâmetro -computer. Assim, se desejarmos obter a memória do computador OMEGA, teríamos de recorrer a uma instrução semelhante à seguinte:

MSH c:\>get-wmiobject Win32_logicalMemoryConfiguration -computer OMEGA

Apesar do exemplo não o indicar, é bem provável que a correcta execução deste comando só seja possível através do envio de credenciais. Para terminar a apresentação deste cmdlet, falta apenas apresentar dois parâmetros: -property e -filter. O parâmetro -property recebe um array de strings que indicam as propriedades que devem ser seleccionadas do objecto retornado pelo comando. Por exemplo, vamos supor que estamos apenas interessados em obter a memória virtual existente na máquina. Nesse caso, podemos executar apenas o seguinte comando:

MSH c:\>get-wmiobject win32_logicalmemoryconfiguration -property totalvirtualmemory

TotalVirtualMemory : 3568752
__GENUS            : 2
__CLASS            : Win32_LogicalMemoryConfiguration
__SUPERCLASS       :
__DYNASTY          :
__RELPATH          :
__PROPERTY_COUNT   : 1
__DERIVATION       : {}
__SERVER           :
__NAMESPACE        :
__PATH             :

O exemplo anterior é duplamente interessante: em primeiro lugar, permite-nos demonstrar os passos necessários à obtenção de algumas propriedades associadas ao objecto retornado pelo wmi. Para além disso, permite-nos ainda perceber que, ao contrário do que poderíamos pensar inicialmente, a propriedade totalvirtualmemory também devolve um objecto (prometo que nos posts futuros vou falar acerca das várias opções de formatação disponibilizadas por esta shell). Para terminar, temos ainda de falar acerca do parâmetro filter. Este parâmetro permite-nos definir um filtro capaz de, como o próprio nome indica, filtrar os dados devolvidos pelo cmdlet get-wmiobject.

Bem, parece-me que por hoje já chega  Apenas dois links para aqueles que queiram obter mais informação em relação ao use do WMI:

http://msdn.microsoft.com/library/en-us/dnclinic/html/scripting06112002.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnclinic/html/scripting08132002.asp

 

Now playing: Moonspell - Abysmo

posted on Thursday, February 16, 2006 9:56 PM
Comments
Title  
Name  
Url
Box Code
Protected by FormShield
Comments