O documento discute o uso da linguagem VBScript com WMI (Windows Management Instrumentation) para gerenciamento e acesso a dados em sistemas Windows. Ele apresenta VBScript, WMI e três estudos de caso resolvidos usando VBScript e WMI.
Introdução a Simulação de redes Sensores sem fio com Castalia
Gerenciando Windows com VBScript e WMI
1. Como Utilizar Windows Management Instrumentation com a
Linguagem VBScript
Lucas Vinícius dos Santos Assis1
, Patrick Vieira Brito e Silva1
1
Departamento de Tecnologia (DTEC) – Universidade Estadual de Feira de Santana (UEFS)
Feira de Santana – BA – Brazil
{lukas.ecomp, patrickecomp}@gmail.com
Abstract. This article discusses the WMI (Windows Management Instrumenta-
tion), a tool that allows software written in scripting languages, such as VBS-
cript, perform management and access to data from computer, servers or any
component element of a Windows network, whether local or remote, through a
standardized common format and simple. In the following sections will be pre-
sented the VBScript language, WMI and case study using standard WMI and
VBScript.
Resumo. O presente artigo aborda o WMI (Windows Management Instrumen-
tation), uma ferramenta que possibilita que softwares escritos em linguagens de
script, como o VBScript, realizem o gerenciamento e acesso a dados de com-
putadores, servidores ou qualquer elemento componente de uma rede Windows,
seja ele local ou remoto, através de um modelo comum padronizado e simples.
Nas seções seguintes serão apresentadas a linguagem VBScript, o padrão WMI
e estudo de casos utilizando WMI e VBScript.
1. Introdução
O sistema operacional (S.O) Windows é amplamente utilizado em todo o mundo, tanto
em computadores pessoais quanto em servidores empresariais. Devido a essa demanda,
a criação de software em ambiente Windows é muito requisitada mundialmente. Para
facilitar a execução de tarefas automatizadas com auxílio de scripts, o sistema operacional
Windows dispõe de uma linguagem interpretativa bastante popular, o VBScript.
A função da linguagem VBScript é resolver problemas específicos que demandam
ações de linguagem de script. Antes da existência dessa linguagem, a Microsoft utilizava
arquivos batch do DOS para resolver tais problemas. Com objetivo de melhorar a robustez
dos sistemas, a Microsoft substituiu arquivos batch do DOS por VBScript [COSTA 2007].
Além disso, a linguagem disponibiliza um conjunto de bibliotecas (Windows Ma-
nagement Instrumentations - WMI) de monitoramento e configuração de parte do sistema
Windows. Entre exemplos de recursos que podem ser manipulados estão: informações de
performance, configuração de drivers, informações sobre a BIOS, aplicativos instalados e
em processamento, logs de eventos, recursos de hardware, entre outros [COSTA 2007].
Dessa forma, softwares implementados através de VBScript utilizando WMI po-
dem resolver problemas que incluam obtenção de informações do S.O ou alteração de
parâmetros de componentes do sistema, como, por exemplo, uma aplicação que gerencia
arquivos verificando o espaço em disco do computador.
2. Este artigo é dividido nas seguintes seções: 2 - Linguagem VBScript: seção que
apresenta um breve resumo sobre a linguagem interpretativa VBScript; 3 - Padrão WMI
(Windows Management Instrumentations): seção onde o padrão WMI é detalhado e sua
interação com a linguagem VBScript é explicitada com auxílio de três estudos de caso
presentes na subseção 3.1 - Estudos de Caso Utilizando WMI e VBScript; 4 - Conclusão:
seção que apresenta as considerações finais do trabalho.
2. Linguagem VBScript
O VBScript é uma linguagem que se caracteriza como uma versão simplificada da lingua-
gem Visual Basic criada para ambientes Windows e destaca-se por sua simplicidade na
programação, apresentando assim grande popularidade.
A execução de scripts dessa linguagem pode ser realizada com o auxílio de diver-
sos interpretadores. Entre eles, na estação Windows, o wscript.exe e o cscript.exe são os
interpretadores para a execução pelo modo gráfico e linha de comando respectivamente.
Para executar o script, basta apenas acioná-lo como um programa executável comum do
Windows. Após isso, o Windows irá reconhecer a extensão do script ".vbs"e utilizar o
wscript para interpretar o script[COSTA 2007].
A figura 1 apresenta a execução de um script básica em VBScript. Esse script con-
tém apenas uma linha: wscript.echo "Oi Mundo!", que realiza a operação de impressão
na tela do texto contido entre aspas duplas
Figura 1. Exemplo básico de script.
A lista a seguir apresenta resumidamente algumas características técnicas presen-
tes na linguagem VBScript baseado em [COSTA 2007]. A linguagem:
• Permite a utiliza do símbolo especial, aspas simples (’), para demarcação de um
comentário de linha em seus scripts;
• Permite tipagem dinâmica, ou seja, variáveis nessa linguagem podem ser declara-
das sem determinação prévia de seu tipo;
• Possui estruturas condicionais do tipo: if - else e select case;
• Possui também: estruturas de repetição dos tipos: While, Do...Loop e for;
• Permite manipulação de arquivos através de objeto do tipo
FSO(FileSystemObjetc). Através desses objetos é possível a leitura, cria-
ção, alteração de diretório e exclusão de arquivos;
• Possui inúmeras funções próprias predefinidas que auxiliam o desenvolvedor, evi-
tando que este necessite recorrer a bibliotecas externas para programar;
• Permite programação orientada a objetos.
3. 3. Padrão WMI (Windows Management Instrumentations)
O padrão WMI, do inglês Windows Management Instrumentation ou Instrumentação de
Gerenciamento do Windows, possibilita que linguagens de scripts, como o VBScript, ge-
renciem computadores, servidores e quaisquer elementos de uma rede Windows de forma
local e remota. Isso é possível graças ao WMI ser uma implementação da Microsoft, em
sistemas Windows, dos padrões Web-Based Enterprise Management (WBEM) e Com-
mon Information Model (CIM) da Distributed Management Task Force (DMTF) que es-
tabelecem um conjunto de especificações para o gerenciamento de informações em redes
empresariais [ROCHA 2003].
Com o WMI é estabelecido um modelo padronizado e simples de gerenciamento
de ambiente Windows que permite que outros softwares tenham acesso a qualquer dado
proveniente de qualquer fonte (placa de rede, HDs, outros programas, dentre outros) atra-
vés de um meio comum [ROCHA 2003]. Assim, os desenvolvedores não precisam mais
ter conhecimento de cada API (Application Programming Interface) fornecida pelo Win-
dows caso necessite de dados de diferentes componentes do sistema. Característica que
facilita o desenvolvimento de novos programas.
Diversos componentes e propriedades de sistemas Windows podem ser controla-
dos com auxílio do WMI, como por exemplo: recursos e configurações de hardware, in-
formações sobre desempenho e BIOS, impressoras, informações de log de eventos, dentre
outros [COSTA 2007].
O estudo da arquitetura do padrão WMI é necessário para o entendimento da in-
teração de componentes de uma rede Windows através dos scripts que possuem interna-
mente objetos que implementem esse padrão. Assim, na figura 2, onde é definida a árvore
dos elementos que compõem as camadas do WMI bem como a relação dessas camadas
com o Windows, nota-se que há uma interação entre o gerenciador de objetos WMI (WMI
Object Manager) e as classes da gestão de sistema (System Management) realizada para
que o primeiro possa enviar e receber dados para o repositório WMI, assim como para os
objetos dinâmicos suportados pelos provedores WMI (WMI providers) [MICROSOFT c].
Os provedores WMI permitem que sejam definidos dados de gestão bem como quais ope-
rações podem ser realizadas com esses dados, sendo que qualquer componente da rede
que necessite de gestão, como hardware, discos rígidos, conexões de rede e impresso-
ras podem possuir provedores específicos desenvolvidos [MICROSOFT d]. Os métodos,
propriedades, construtores, e outros membros da gestão de sistema são usados por formu-
lários Web e outras aplicações de gerenciamento. Algumas das aplicações "cliente"que
acessam dados através do WMI são formulários Windows, formulários Web, provedores
originais do WMI, dentre outros [MICROSOFT c].
Linguagens de scripts, como VBScript, podem ser utilizadas com auxílio de WMI
em sistemas Windows. Assim, estudos de caso envolvendo problemas com servidores
Windows são abordados na próxima seção deste artigo. Porém, um trecho de código
VBScript desse ser definido primeiro, pois este demonstra o comando necessário para ob-
tenção de acesso aos recursos do computador utilizado. A função getObject () retorna uma
instância de um objeto do pacote WMI, esse objeto é a base para obtenção de qualquer
outra informação do sistema analisado assim como o primeiro passo para a construção de
scripts em VBScript em associação com WMI.
4. Figura 2. Exemplo da arquitetura WMI
1 s e t wmiObject = getObject ( " winmgmts : " )
3.1. Estudos de Caso Utilizando WMI e VBScript
Abaixo são definidos três estudos que caso demonstrando como o uso de WMI em associ-
ação com scripts VBScript pode solucionar problemas reais em computadores domésticos
e servidores com Windows. Os estudos de caso seguem seguinte estrutura: apresentação
do problema a ser resolvido; apresentação de uma possível solução para o problema; de-
monstração do código fonte da solução; explicação das principais linhas componentes do
código fonte da solução.
Uma importante característica, recorrente em mais de um dos códigos de solução
dos estudos de caso abaixo, é a presença do caractere especial sublinhado "_"ao final
de algumas das linha dos scripts. A linguagem VBScriptt não suporta quebra de linha
automática, assim, torna-se necessário explicitar cada quebra de linha realizada com o
auxílio desse caractere.
3.1.1. Estudo de caso 1
Um analista de TI (Tecnologia da Informação) recebeu uma denúncia anônima de que
alguns logins de administrador e suas respectivas senhas foram roubadas do banco de
dados do servidor de pequeno porte da empresa em que trabalha antes da implantação
de criptografia nos dados da máquina. Para descobrir se essa denúncia era verdadeira,
todos os usuários administradores do sistema foram alertados para não estarem logados
no servidor analisado em determinados horários do dia, mais propensos ao ataque dos
"hackers", para verificação dos possíveis intrusos no sistema.
5. 1 Option E x p l i c i t
2 Dim objWMIService , objComputer , colComputer , strComputer
3
4 strComputer = " . "
5
6 Set objWMIService = GetObject ( " winmgmts : " _
7 & " { impersonationLevel = impersonate } ! " _
8 & strComputer & " r o o t cimv2 " )
9
10 Set colComputer = objWMIService . ExecQuery _
11 ( " S e l e c t ∗ from Win32_ComputerSystem " )
12
13 For Each objComputer in colComputer
14 Wscript . Echo objComputer . UserName _
15 & " e s t a logado no sistema do t i p o : " _
16 & objComputer . SystemType
17 Next
A solução do problema é executada de maneira simples. O script em questão
realiza uma solicitação ao WMI de todos os usuários logados no sistema analisado no
momento em que este for executado. Após essa etapa, são exibidos, um por vez, o nome
de cada máquina analisada seguido do nome dos usuários nela logados e da arquitetura
do sistema. Assim, caso apareça algum usuário logado que não seja o analista de TI, uma
das possíveis contas roubadas será identificada.
O código fonte desse estudo de caso é baseado em uma solução apresentada em
[THOMAS 2010]. Na linha 1, a declaração explícita de todas as variáveis no script é
exigida [MICROSOFT a]. Essa declaração explícita ocorre na linha 2.
O comando Set objWMIService = GetObject("winmgmts:"& strComputer &
"rootcimv2") , presente das linhas 6 até 8 do script, é utilizado para obtenção de acesso
a todos os objetos WMI e suas propriedades e, com o acréscimo da linha da linha &
"{impersonationLevel=impersonate}! "_ , é adicionada permissão de segurança para
que o script possa verificar usuários logados em outras máquinas da rede.
Para obtenção de uma resposta rápida, o strComputer foi configurado para ".", ou
seja, máquina local. Caso seja necessária a consulta em máquina diferentes da rede, o
valor dessa variável deve ser alterado para o nome da máquina desejada.
O comando padrão do WMI para que o script VBScript execute um processo, pre-
sentes nas linhas 10 e 11, é: Set colComputer = objWMIService.ExecQuery _. O processo
iniciado nesse comando é uma busca em banco de dados de sistemas computacionais pre-
sentes da rede através da seleção realizada em Win32_ComputerSystem.
De cada sistema computacional extraído da consulta de banco de dados exempli-
ficada anteriormente, é impresso na tela o nome, o usuário logado e o tipo de sistema da
máquina analisada.
6. 3.1.2. Estudo de caso 2
Um problema recorrente no servidor de uma determinada empresa fictícia está na falta de
monitoramento da quantidade de processos em execução, um fator que pode ser impor-
tante em servidores com baixa capacidade de processamento e memória. Em especifico,
o usuário administrador do servidor tem um interesse em ser notificado ao atingir mais de
200 processos em execução para fins particulares.
1
2 do
3 s e t WMI = GetObject ( "WinMgmts : " )
4 s e t objs = WMI. I n s t a n c e s O f ( " Win32_Process " ) ]
5
6 contador = 0
7 for each obj in objs
8
9 contador = contador + 1
10 next
11
12 i f contador >= Then
13 Wscript . Echo "O Usuario excedeu o l i m i t e "
14 end i f
15
16 w s c r i p t . Sleep 7000
17 loop
O código acima representa uma solução viável para o problema caso 2. O script
faz uma solicitação ao WMI de todos os processos em execução. Depois, analisa as
seguintes condições: caso o número de processos em execução for menor que 200, o pro-
cesso aguarda 7 segundos para fazer outra verificação. Caso contrário, o processo notifica
ao usuário que a servidor excedeu o limite de processos e também aguarda para outra nova
verificação. Na linha 3 e 4, ocorre a criação do objeto set WMI=GetObject("WinMgmts:")
que permite manusear dados do S.O e com este mesmo objeto obter um vetor dos proces-
sos em execução com o método .InstancesOf("Win32_Process").
3.1.3. Estudo de caso 3
Por último, um estudo de caso apresentado no livro [COSTA 2007], e com script de so-
lução levemente adaptado neste artigo, exemplifica perfeitamente o uso de tarefas em
VBScript utilizando contadores e a aplicação de WMI para extração de informações do
uso do processador do computador, segue a explicação do caso de uso:
Suspeita-se da presença de um vírus de computador em uma máquina Windows. O
principal "sintoma"que indica a presença do vírus é o gasto excessivo de processamento,
pois o vírus realiza um processo de quebra de senhas em outros computadores, o que
demanda alto uso do processador, na faixa de mais de 85% de seu poder de processamento
total. O script deve ser criado para indicar se o computador está ou não infectado com o
vírus em questão.
1
2 s e t objWMIService = getObject ( " winmgmts : " )
7. 3
4 s e t o b j R e f r e s h e r = createObject ( " WbemScripting . Swbemrefresher " )
5
6 s e t o b j P r o c e s s o r = o b j R e f r e s h e r . AddEnum ( objWMIService , _
7 " Win32_PerfFormattedData_PerfOS_Processor " ) . o b j e c t S e t
8
9 o b j R e f r e s h e r . Refresh
10
11 v i o l a c o e s = 0
12
13 do
14 for each obj in o b j P r o c e s s o r
15 i f obj . PercentProcessorTime > 85 then
16 v i o l a c o e s = v i o l a c o e s + 1
17 e l s e
18 v i o l a c o e s = 0
19 end i f
20
21 i f v i o l a c o e s = 6 Then
22 Wscript . Echo " V e r i f i c a r o c o r r e n c i a de v i r u s " _
23 & vbnewLine _
24 & " Processo s u s p e i t o : " & obj . Name
25 v i o l a c o e s = 0
26 end i f
27 next
28
29 o b j R e f r e s h e r . Refresh
30 w s c r i p t . Sleep 5000
31
32 loop
A solução do problema envolve a utilização de objetos WMI para monitoramento do uso
do processador. Outro ponto a ser considerado é se o processo que o script acusará é
de fato o vírus procurado ou algum processo executado normalmente pelo computador.
Para isso serão realizadas verificações periódicas, espaçadas de 5 em 5 segundos, que
irão monitorar se um determinado processo "viola"o limite de 85% de uso do processador
(estabelecido anteriormente como resultante da execução do vírus) durante 30 segundos.
Caso essas condições sejam cumpridas, o processo, que terá seu nome acusado para o
usuário, é o vírus procurado.
Na linha 2, inicializa-se o objeto objWMIService para ser usado na obtenção dos
dados dos processos. Na linha 4, é criado o objeto que serve para atualizar os dados
obtidos dos processos a cada laço. A linha 6 é atribuído ao objeto responsável por atualizar
os dados a informação de que os dados que devem ser atualizados são os dos processos
[MICROSOFT b].
O laço iniciado na linha 14 é utilizado para percorrer os objetos WMI. A verifica-
ção se o uso do processador está acima dos 85% é feita na linha 15, chamando o atributo
PercentProcessorTime do objeto que representa o processo. Na linha 21, se o número de
vezes que o uso do processador passou 85% for igual a 6, uma notificação é enviada ao
usuário com o nome do processo suspeito.
Na linha 30, o método sleep "congela"o processamento do script por 5 segundos
8. (5000 milisegundos).
Nas linhas 9 e 29, o metódo Refresh é chamado pelo objeto objRefresher para
atualizar os dados dos processos.
4. Conclusão
O trabalho mostrou-se muito importante para demonstrar as diversas utilidades do padrão
WMI em sistemas Windows.
A característica mais marcante do padrão WMI é permitir ao desenvolvedor o
acesso a diversos dados e informações do sistema sem necessitar ter o conhecimento de
todas as APIs fornecidas pelo sistema operacional Windows, agilizando o processo de de-
senvolvimento e manutenção de códigos fonte, bem como a realização de portabilidade de
programas de outras plataformas, pois o padrão WMI é proveniente da iniciativa WBEM,
aplicada em diversos outros ambientes de desenvolvimento e sistemas operacionais.
Para trabalhos futuros de mesmo escopo, o acréscimo de mais estudos de caso
pode possibilitar a exemplificação de outras características importantes que demonstrem
diferentes usos de WMI com scripts VBScripts.
Referências
COSTA, D. (2007). Administração de redes com scripts : Bash Script, Python e VBScript.
Brasport, 1st edition.
MICROSOFT. Option explicit statement. https://msdn.microsoft.com/
en-us/library/bw9t3484(v=vs.84).aspx. Acesso em: 6 maio, 2016.
MICROSOFT. Refreshing wmi data in scripts. https://msdn.microsoft.com/
en-us/library/aa393026(v=vs.85).aspx. Acesso em: 7 maio, 2016.
MICROSOFT. Windows management instrumentation. https://msdn.
microsoft.com/en-us/library/aa394582(v=vs.85).aspx. Acesso
em: 6 maio, 2016.
MICROSOFT. Wmi providers. https://msdn.microsoft.com/en-us/
library/aa394570(v=vs.85).aspx. Acesso em: 6 maio, 2016.
ROCHA, N. R. (2003). Entendendo a camada wmi. http://www.devmedia.com.
br/entendendo-a-camada-wmi/651. Acesso em: 6 maio, 2016.
THOMAS, G. (2010). Wmi tutorial: Who is logged on at that compu-
ter? http://www.computerperformance.co.uk/vbscript/wmi_who_
logon.htm. Acesso em: 6 maio, 2016.