Professional Documents
Culture Documents
por Paulo Jorge Ferraz de Menezes Sacramento Departamento de Engenharia Informtica Universidade de Coimbra 3030 Coimbra, Portugal sacra@student.dei.uc.pt Resumo Explica-se o que a gesto empresarial com recurso a redes(WBEM), o Common Information Model(CIM), e a implementao Microsoft, Windows Management Instrumentation(WMI). So apresentadas algumas definies das noes essenciais para a compreenso do tema. Descrevem-se algumas formas de interagir com os esquemas CIM por forma a criar aplicaes WMI. Esta abordagem pretende ser um ponto de partida para aqueles que pretendam implementar tais aplicaes, com especial nfase nas classes WMI de monitorizao de carga, os Performance Counters. Palavras chave Gesto empresarial, Informtica, Programao, WMI, WBEM, CIM, Performance, Performance Counters, C++, COM, DCOM.
1. Introduo
Hoje em dia, quase todas as empresas tm includo no seu patrimnio uma rede interna de computadores, cujo nmero tem tendncia para ir aumentando medida que o tempo passa. Isto implica que os mecanismos de gesto associados a essa rede, quer em termos de pessoal, quer em termos de software e hardware informtico, sejam cada vez mais um factor importante do sucesso da infraestrutura informtica de uma empresa. Como consequncia directa disto, surgiu no seio das grandes empresas do sector a vontade de criar standards que tornassem mais uniforme o processo de gesto dessas infraestruturas por parte das empresas. Este texto pretende apresentar as noes resultantes desse esforo, descrever uma das implementaes realizadas na sua sequncia, mais propriamente, a implementao Microsoft, WMI, e referir a estrutura que uma aplicao, escrita em C++, que a pretenda usar, deve ter. Grande parte deste trabalho resulta da investigao realizada sobre o WMI Software Development Kit(SDK)[1], documento que se recomenda a quem pretenda obter mais informao sobre este assunto.
iniciativa foi patrocinada por algumas das maiores empresas do mundo na rea, como so os casos da IBM, Compaq/HP, Cisco Systems e Microsoft. Uma das partes mais importantes do WBEM o modelo orientado a objectos(OO) que est includo na sua definio. Esse modelo denominado Common Information Model(CIM) e, como o nome indica, pretende conseguir representar de forma normalizada os mais variados componentes de um sistema informtico atravs de um modelo OO.
Classes descendentes As classes descendentes representam objectos que so especficos de cada tecnologia. Descendem das classes comuns e tipicamente aplicam-se a plataformas como o UNIX ou o Microsoft Windows. exemplo deste tipo de classes a classe Win32_ComputerSystem.
Para tornar mais explcita a relao entre as classes comuns e as classes descendentes, notese o facto de a classe Win32_ComputerSystem ser descendente da classe CIM_UnitaryComputerSystem, sendo que a primeira absolutamente especfica de ambientes Windows e a segunda standard e pode ser encontrada em todas as plataformas aderentes. Um exemplo de uma associao a classe Win32_ComputerSystemProcessor, que associa os objectos da classe Win32_ComputerSystem classe Win32_Processor e que representa nem mais nem menos a noo que todos temos de que, em geral, um computador funcional tem um processador. Outra noo que importante a noo de esquema(schema). Um esquema um conjunto de classes coerente e completo que representa um sistema. CIM e Win32 so dois exemplos de esquemas. As respectivas classes comeam com o prefixo CIM_ e Win32_. Uma implementao em UNIX poderia ter classes do gnero UNX_Processor, sendo o esquema denominado de UNX. De seguida vamos descrever o WMI, que usa estes dois esquemas.
6.2 Criao de uma ligao a um namespace WMI Por definio, o WMI corre como um programa independente, distinto do nosso. Isto torna necessria a existncia de uma ligao entre a nossa aplicao e o WMI. O primeiro passo que deve ser dado para isso criar uma instncia de um objecto do tipo IWbemLocator. Isto feito atravs da funo CoCreateInstance(), com um conjunto apropriado de parmetros, inclundo um ponteiro para um objecto do tipo pretendido(passagem por referncia). De seguida, pode usar-se o objecto para chamar o mtodo ConnectServer() da classe IWbemLocator. este mtodo que estabelece de facto a ligao a um namespace WMI e aqui que se deve especificar se se quer controlar o WMI numa mquina local ou remota. Para alm da definio da localizao a que se pretende ligar, necessrio passar novamente, por referncia, um ponteiro para um objecto da classe IWbemServices. Como habitual no contexto das Remote Procedure Calls(RPCs), mesmo podendo a chamada no ser remota, existe a noo de proxy. O que o mtodo ConnectServer() devolve de facto um proxy para uma interface do tipo IWbemServices. esta interface que nos permite mais frente obter todas as informaes e realizar todas as operaes sobre o WMI. 6.3 Definio de parmetros de segurana na ligao WMI Como seria de esperar, existem cuidados de segurana que tm de ser tidos ao lidar com este proxy. Basta notar que ele nos d acesso a objectos forado-processo. O COM no deixa sequer que um processo aceda a recursos de outro processo se no forem assegurados todos os mecanismos de segurana. Isto pode ser feito atravs da funo CoSetProxyBlanket(), que recebe uma grande quantidade de parmetros, novamente relacionados com autenticao e impersonation. 6.4 Implementao do propsito da nossa aplicao neste ponto que tudo aquilo que se pretende obter e manipular atravs do WMI pode ser feito. Existe uma variedade infindvel de coisas com que podemos interagir no WMI. Seria obviamente impossvel explic-las todas. Para ilustrar uma das funcionalidades existentes, vai ser apresentado um pequeno exemplo, baseado num sub-conjunto de classes denominadas de Performance Counters, que, como o nome diz, servem para obter informao relacionada com a performance das vrias partes de um sistema informtico. Ao longo do exemplo, pSvc representa o ponteiro para IWbemServices. Criao de um ponteiro para um objecto IWbemClassObject(unidade bsica que contm informao sobre uma classe):
IWbemClassObject *pClass = NULL; Definio da classe sobre a qual se vai obter informao. Neste caso foi utilizada a classe que contm Performance Counters relativos memria central: wchar_t *aux = L"Win32_PerfFormattedData_PerfOS_Memory"; BSTR classPath = SysAllocString(aux); Obteno da definio da classe, com vista a perceber que atributos e mtodos a compem: hres = pSvc->GetObject(classPath, 0, NULL, &pClass, NULL); Obteno da lista de atributos(counters) propriamente dita: SAFEARRAY* pProperties = NULL; hres = pClass->GetNames(NULL, WBEM_FLAG_ALWAYS WBEM_FLAG_NONSYSTEM_ONLY, NULL, &pProperties); |
Criao de uma enumeration com todas as instncias da classe que estamos a utilizar(no caso da memria ser s uma): IEnumWbemClassObject* enumPointer; hres = pSvc->CreateInstanceEnum(aux, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY , NULL, &enumPointer); Obteno do valor de um dos counters de que tivmos conhecimento anteriormente(por exemplo, PageFaultsPersec): IWbemClassObject *pClassAux; ULONG ret; VARIANT v; BSTR strClassProp = SysAllocString(L"PageFaultsPersec"); do { VariantInit(&v); enumPointer->Next(WBEM_INFINITE, 1, &pClassAux, &ret); if(ret!=0)
hres = pClassAux->Get(strClassProp, 0, &v, 0, 0); O valor do contador est na varivel v, do tipo VARIANT, que representa uma union, para que possa suportar diferentes tipos de dados(Strings, inteiros, floats,...) VariantClear( &v ); } while(ret!=0); 6.5 Cleanup manual e finalizao Finalmente, existe outro aspecto que muito importante ter em conta, relacionado com o impacto que uma aplicao de monitorizao deve ter no uso de recursos do sistema. O leitor concordar que ele deve ser mnimo. Para que isso seja possvel, necessrio que quando a aplicao estiver pronta a terminar, sejam libertados todos os recursos por ela utilizados. A negligncia deste aspecto causar aquilo que se chamam de Resource Leaks, que representam recursos que apesar de no estarem a ser utilizados para nada, nem por ningum, continuam a ocupar espao que poderia servir para outros que dele necessitassem. Felizmente que este processo no to complicado como importante. H basicamente trs tarefas que devem ser realizadas. Primeiro, libertar todos os ponteiros COM utilizados(chamados de COM Smart Pointers), o que pode ser feito atravs do mtodo Release(). Segundo, libertar o espao alocado para Strings, atravs do mtodo SysFreeString(). Terceiro, finalizar o COM, atravs da chamada ao mtodo CoUninitialize().
7. Concluses
Ao longo deste artigo foram descritos alguns conceitos considerados essenciais como background a quem pretenda iniciar-se na construo de aplicaes WMI. Espera-se que o objectivo tenha sido atinjido. necessrio que fique bem claro que quem pretenda ir mais alm na explorao do mundo do WMI, deve consultar as referncias que se juntam, bem como outras que possam existir.
Agradecimentos
O autor agradece ao Eng. Paulo Pimenta Marques pela motivao que deu realizao de investigao nesta rea. Este trabalho foi realizado, em grande parte, num dos laboratrios do CISUC, no mbito do grupo de sistemas confiveis.
Referncias
1. 2. 3.
Microsoft Platform Software Development Kit, Windows Management Instrumentation, http://msdn.microsoft.com/library/default.asp?url=/library/enus/wmisdk/wmistart_5kth.asp?frame=true , Novembro, 2001 Domingues, P. Tese de Mestrado: Balanceamento de Carga para Aplicaes Paralelas com Distribuio Regular de Dados Executadas em Sistemas Distribudos, Coimbra, Maro 1999, pg. 54-56 Robinson S., et al. Professional C# , Programmer To Programmer, Wrox Press, Ltd., 2001