Entendendo a camada WMI

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (3)  (0)

(Windows Management Instrumentation) e seu uso em Delphi

(baseado em artigo publicado em Agosto de 2003 na revista americana ‘The Delphi Magazine’)

Continuando com nossa série de artigos sobre programação em Delphi, iremos abordar o uso da nossa ferramenta preferida com tecnologias Microsoft. A plataforma Windows possui tecnologias que nós ainda desconhecemos. Por exemplo, já me encontrei às voltas em recuperar informações das mais variadas formas e tipos possíveis em computadores isolados ou em rede, o que havia me levado a escrever algum componente que pudesse recuperar dados de computadores em uma rede, tais como: lista de programas instalados, configuração do computador (CPU, memória, capacidade do HD, se possui modem, se possui placa de som, etc.), lista dos programas, processos e serviços rodando no momento no computador, etc. Algo como criar um software de inventário do parque de computadores instalado.

Até estava começando a implementar algo nesse sentido usando COM/DCOM. Foi quando, durante minhas pesquisas na Internet, me deparei com a WMI (Windows Management Instrumentation) e fiquei impressionado com a simplicidade desta camada, criada pela Microsoft, e que permite recuperar praticamente tudo a respeito de computadores locais ou remotos (em rede). É o que pretendo humildemente abordar neste artigo, ilustrando como funciona a tecnologia e um projeto exemplo em Delphi disponível para download.

Visão Geral da Tecnologia

O Windows Management System, ou simplesmente WMI, é uma das várias tecnologias introduzidas pela Microsoft para suportar o gerenciamento de sistemas corporativos. Ela é fruto de um esforço entre companhias de computação interessadas em desenvolver uma camada de software padronizada para gerenciamento corporativo de sistemas e de dispositivos. Essa iniciativa foi denominada WBEM, sigla para Web Based Enterprise Management (Gerenciamento Corporativo Baseado na Web). O objetivo era desenvolver um único conjunto de padrões para gerenciar qualquer componente de uma rede corporativa. Dessa forma, futuramente as companhias desenvolveriam hardware, software e sistemas que pudessem ser gerenciados da mesma maneira, através da adoção do padrão WBEM. A responsabilidade pela iniciativa WBEM foi assumida pela organização DTMF (Desktop Management Task Force), que é responsável em manter os padrões que irão ajudar a atingir os objetivos da iniciativa WBEM.

Portanto, a camada WMI é uma implementação da iniciativa WBEM para os sistemas operacionais Windows e permite aos desenvolvedores usar um mecanismo simples e consistente para pesquisar informações ou parâmetros de configuração em computadores dentro de uma empresa ou corporação. A quantidade de informação disponível através da interface WMI é imensa – configurações de hardware, informações de performance, configuração de drivers, informações sobre a BIOS, configurações de aplicações, informações de log de eventos, e muito mais. A interface WMI recupera essas informações utilizando vários conjuntos de APIs, mas apresenta essas informações seguindo um modelo de gerenciamento de objetos simples e padronizado. Isto torna desnecessário aos desenvolvedores de aplicação aprender os detalhes de cada API fornecida pelo Windows.

Para entender este poder, considere um desenvolvedor que quer as descrições de quatro grupos de objetos em uma máquina: serviços, impressoras, processos e CPUs. Sem a WMI, um desenvolvedor terá que procurar e aprender diferentes APIs para cumprir cada tipo de enumeração. Com a WMI, isto é muito simples porquê toda classe de objeto é enumerada da mesma maneira. Veja na Listagem 1 como esta tarefa pode ser executada de forma simples com um código VBScript para o WSH. Mais tarde veremos como executar a mesma tarefa desse script usando o Delphi.

Listagem 1. Enumerando Informações do Sistema.

' ENUM.VBS
 set WMI = GetObject("WinMgmts:")
  
 ' Mostra a descrição de todos os serviços
 set objs = WMI.InstancesOf("Win32_Service")
 for each obj in objs
 WScript.Echo obj.Description
 next
  
 ' Mostra a descrição de todas as impressoras
 set objs = WMI.InstancesOf("Win32_Printer")
 for each obj in objs
 WScript.Echo obj.Description
 next
  
 ' Mostra a descrição de todos os processos
 set objs = WMI.InstancesOf("Win32_Process")
 for each obj in objs
 WScript.Echo obj.Description
 next
  
 ' Mostra a descrição de todos os processadores
 set objs = WMI.InstancesOf("Win32_Processor")
 for each obj in objs
 WScript.Echo obj.Description
 next

Você desenvolvedor mais experiente já deve ter percebido o poder que é usar a WMI. Imagine a possibilidade de escrever uma aplicação Web em ASP para, por exemplo, gerenciar os computadores da sua rede, sem precisar decorar funções da API do Windows, ou mesmo construir objetos COM específicos que precisassem ser instalados em cada máquina com o objetivo de obter dados do parque de máquinas instaladas na rede de sua empresa. É exatamente isso que a WMI propõe ao ambiente Windows, mais especificamente Windows 2000, XP e também no Windows Server 2003.

A camada WMI já está presente nas plataformas Windows 2000 e XP. Para as plataformas Windows 9x e NT, ele é um componente adicional que deve ser instalado. A versão mais recente da camada WMI para essas plataformas pode ser obtida procurando-se em http://msdn.microsoft.com.

Voltando ao script anterior, vale ressaltar que o que foi ilustrado acima pode ser executado em um computador remoto em uma rede qualquer. Por exemplo, se você tem um computador na rede da sua empresa chamado MYSERVER, você simplesmente usaria “WinMgmts://MYSERVER” como parâmetro para GetObject() na primeira linha do script. Na verdade, qualquer informação que é exposta ao WMI é automaticamente disponível usando a mesma API a partir de uma máquina local ou remota. Apesar de algumas APIs Win32 fornecerem a habilidade para especificar uma máquina remota, outras somente fornecem acesso à máquina local e deixaram você encalhado se você tentar obter a informação sobre uma máquina remota.

A WMI também torna simples definir informações ou invocar ações nos objetos gerenciados. A mesma sintaxe pode ser usada, por exemplo, para terminar um serviço, finalizar um processo ou efetuar o logoff de usuário em uma máquina remota. O desenvolvedor só precisa saber o nome do objeto e o nome da ação, não havendo a necessidade de aprender uma nova API.

Modelagem das Informações WMI

Para descrever as informações de gerenciamento na camada WMI, o primeiro padrão criado pela iniciativa WBEM é um método para descrever informações de gerenciamento chamado de Common Information Model (CIM). CIM usa uma abordagem orientada a objeto para modelar a informação. Ou seja, as informações de gerenciamento são expressas usando definições de classe, herança, instâncias, propriedades e métodos. As classes CIM são definidas em arquivos texto usando o Managed Object Format (MOF).

Esses padrões são o núcleo da iniciativa WBEM, pois são neutros de plataforma e de implementação. Para tornar o gerenciamento universal uma realidade, fornecedores de hardware e software devem criar sistemas que suportem esses padrões (referindo-se a eles como implementações do WBEM), o que envolve expor a funcionalidade de gerenciamento através de classes derivadas da modelagem CIM. Por isso, como já foi dito anteriormente, a implementação da Microsoft para a iniciativa WBEM para sistemas operacionais Windows chama-se WMI.

A Arquitetura WMI – Uma Breve Introdução

Para entender os componentes da arquitetura WMI, mostrada na Figura 1, isso ajudará a analisar a criação de uma implementação dos padrões WBEM. A primeira tarefa é decidir quais elementos do esquema CIM se aplicam a um computador rodando Windows. O próximo passo é extender o esquema CIM para definir classes que expõem qualquer informação adicional disponível sob o Windows. A convenção usada pela Microsoft é derivar de classes CIM e prefixar o nome da classe com Win32_ (por exemplo, Win32_NetworkAdapter é uma classe derivada de CIM_NetworkAdapter).

Figura 1. A Arquitetura WMI

Isto só é significante para quem irá escrever WMI providers no intuito de disponibilizar informações de objetos para os clientes (as aplicações). Este tópico foi colocado apenas para caráter informativo. Como não faz parte do escopo enfatizar mais profundamente a arquitetura WMI, sugerimos que seja consultada a literatura competente, que é o MSDN Library, ou mesmo a base de conhecimento do MSDN Library na on-line Internet através do site http://msdn.microsoft.com.

Programação Voltada para o WMI

A Microsoft disponibiliza um SDK para os desenvolvedores interessados em escrever soluções de gerenciamento baseados nesta camada COM. No entanto, vamos nos ater a um dos inúmeros tópicos de programação envolvendo esta tecnologia. Como é uma camada COM e é possível obter as informações que a WMI fornece através de uma estrutura de classes, vamos nos focalizar nessas classes e como acessá-las em nossas aplicações Delphi. Tivemos uma breve amostra do que isso é possível com um pequeno de código em VBScript. Vamos usar a mesma filosofia, no entanto, usando os recursos do nosso querido Delphi.

Acessando a WMI com o Delphi

Para que seu projeto Delphi* possa fazer uso dos benefícios da camada WMI, você precisa importar a type library Microsoft WMI Scripting Library, que fornece todas as classes necessárias. Para criar a unit de importação, vá até o menu principal do IDE do Delphi e selecione Project|Import Type Library. Em seguida, localize a opção Microsoft WMI Scripting Vx.x Library (x.x é a versão da type library) e em seguida, clique no botão ‘Create Unit’ para criar a tradução da Type Library em Object Pascal.

Se você seguiu os passos descritos até aqui, você deve ter criado a unit WBemScripting_TLB.pas. Esta unit possui as declarações Object Pascal para as classes descritas na type library importada, possibilitando que nossas aplicações Delphi. E é assim que nosso projeto de exemplo foi escrito e baseado.

NOTA: Esta type library já está presente no Windows 2000 e no Windows XP. Nas demais plataformas Windows, ela é um componente adicional que deve ser baixado do site da Microsoft e instalado no computador. Para maiores informações, dirija-se ao site http://msdn.microsoft.com/downloads.

Ao acessar este endereço, localize a área de busca chamada ‘Search for Developer Downloads’. No combo box intitulado ‘Product / Technology (optional)’, escolha ‘Platform SDK’, e no combo box intitulado ‘Keywords (optional)’ digite ‘WMI’. O site irá direcioná-lo para links relacionados ao WMI, dentre eles os links para baixar o WMICORE.EXE, que é o instalador da type library específico para a plataforma Windows que você desenvolve.

Projeto Exemplo – WMI Information

O nosso projeto trata-se de uma aplicação simples que mostra informações sobre o processador e os discos do computador mencionado no campo de texto (objeto TEdit). O valor ‘.’(ponto) indica que será feita uma busca no computador local. Se você informar o nome de um computador da sua rede local e que tenha instalado nela o suporte para WMI, conforme mencionado no box anterior, você poderá obter informações de computadores da sua rede. Claro que isso irá depender também das permissões dadas ao computador para acessar tais informações. Fica como sugestão ao caríssimo leitor pesquisar mais sobre a WMI e a configuração da infraestrutura no ambiente em que você desenvolve. Como já foi dito, a melhor documentação para a WMI existente está em http://msdn.microsoft.com.

Este exemplo é totalmente funcional e mostra dados referentes ao processador e aos discos do computador. Repare nos botões ‘API Padrão’ e ‘Nova API’. O primeiro botão ilustra como consultar as informações da guia correspondente usando diretamente as classes da type library da WMI. O segundo botão ilustra o uso de classes adicionais que foram escritas para facilitar o uso da WMI em suas aplicações, que estão em uma unit chamada uWMIObjects.pas.

* O projeto de exemplo foi feito usando Delphi 7.

Até a próxima!

Rubem Nascimento da Rocha (djpardalrocha@hotmail.com).

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?