A tecnologia WMI (Windows Management Instrumentation) é uma ferramenta de gerenciamento de sistema no Windows fornecida pela Microsoft. Através desta ferramenta, quase todas as informações do sistema cliente podem ser gerenciadas localmente ou no sistema cliente. Muitas ferramentas profissionais de gerenciamento de rede são desenvolvidas com base no WMI. Esta ferramenta é uma ferramenta padrão no Win2000 e WinNT e uma opção de instalação estendida no Win9X. Este artigo apresentará como acessar a programação de objetos WMI por meio da programação VB.
Primeiro, vejamos um exemplo simples de obtenção de informações do sistema por meio do WMI. Este exemplo obtém os processos em execução no sistema por meio de objetos WMI:
FunçãoEnum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PRocess)
ForEachobjInobjs
Enum1=Enum1 obj.Descrição Chr(13) Chr(10)
Próximo
Função Final
No código acima, o objeto WMI é obtido primeiro por meio de GetObject (WinMgmts:). Existem muitos subitens no objeto WMI. Aqui obtemos todos os subitens da lista de processos no sistema por meio de WMI.InstancesOf (Win32_Process).
Vejamos um exemplo completo de acesso a objetos WMI. Este exemplo obtém informações do computador.
Crie um novo projeto, adicione um controle TextBox e um controle CommandButton ao Form1 e escreva o seguinte código no evento Click do CommandButton:
PrivateSubCommand1_Click()
Escurece, Sistema, item
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
ForEachitemInSystem
'List1.AddItemitem.cputype
s=Informações do Computador&vbCrLf
s=s&****************************&vbCrLf
s=s&nome do computador:&item.name&vbCrLf
s=s&Status:&item.Status&vbCrLf
s=s&type:&item.SystemType&vbCrLf
s=s&Fabricante:&item.Fabricante&vbCrLf
s=s&model:&item.Model&vbCrLf
s=s&memória:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&domínio:&item.domínio&vbCrLf
A opção 's=s&Workgroup&item.Workgroup&vbCrLf' para obter grupo de trabalho e domínio não pode ser usada ao mesmo tempo
s=s&usuário atual:&item.username&vbCrLf
s=s&estado de inicialização&item.BootupState&vbCrLf
s=s&Este computador pertence a&item.PrimaryOwnerName&vbCrLf
s=s&tipo de sistema&item.CreationClassName&vbCrLf
s=s&Tipo de computador&item.Descrição&vbCrLf
Fori=0To1'Aqui assume-se que dois sistemas estão instalados
s=s&Chr(5)&Opções de inicialização&i&:&item.SystemStartupOptions(i)_
&vbCrLf
Próximo
Próximo
Texto1.Text=s
Fim Sub
Execute o programa, clique em Command1 e as informações do computador serão exibidas na caixa de texto.
No código acima, o programa obtém o objeto WMI por meio de GetObject(winmgmts:), a seguir obtém a seguinte subchave Win32_ComputerSystem e obtém as informações no sistema acessando os subitens no objeto Win32_ComputerSystem.
Deve-se observar que nem todos os sistemas suportam WMI e, em alguns sistemas, informações como o fabricante não podem ser exibidas.
Os computadores e redes de hoje são muito complexos. Por exemplo, em termos de hardware do sistema, existem placas-mãe, discos rígidos, placas de rede...
Em termos de software, existem sistemas operacionais, softwares instalados no sistema, processos em execução, etc. Os aspectos da rede incluem domínios, grupos de trabalho, etc. Você pode usar o WMI para acessar todas as informações acima, mas será muito difícil acessá-las usando os mesmos itens acima. Para esse fim, o WMI fornece uma instrução de consulta semelhante a uma instrução SQL, por meio da qual os subitens do objeto WMI podem ser obtidos.
Aqui está um código que percorre as placas de rede instaladas no sistema e retorna o endereço MAC da placa de rede:
PrivateFunctionMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECIONEEndereço MAC&_
A PARTIR DEWin32_NetworkAdapter&_
ONDE&_
((MACAddressIsNotNULL)&_
E(Fabricante<>&_
'Microsoft')))
ForEachobjInobjs
Endereço MAC = obj.Endereço MAC
Sair para
Próximoobj
Função Final
O código acima obtém o objeto WMI e, em seguida, executa ExecQuery para executar uma instrução de consulta WMI para obter a placa de rede instalada e retornar o endereço MAC da placa de rede.
O WMI também oferece suporte ao processamento de eventos, permitindo que os programas manipulem eventos do sistema, como execução e fechamento de programas, inserção e remoção de unidades removíveis, etc. Abaixo está um programa que pode monitorar os programas em execução no sistema.
Primeiro crie um novo projeto, clique no item de referências do projeto no menu, selecione MicrosoftWMIScriptingLibrary na lista de referências e adicione a biblioteca de objetos WMI ao projeto. Em seguida, adicione um controle ListBox ao Form1 e adicione o seguinte código ao Form1:
OpçãoExplícita
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
PrivateSubKillEvents()
StatusSink.Cancel
SetStatusSink=Nada
Fim Sub
PrivateSubForm_Load()
DimQueryAsString
SetStatusSink=NewSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
Consulta=SELECT*FROM__InstanceCreationEvent
Consulta = Consulta DENTRO de 1
Consulta = Consulta WHERETargetInstanceISA'Win32_Process'
Services.ExecNotificationQueryAsyncStatusSink,Consulta
Fim Sub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
Dimarr
DimstrQueAsString
DimiAsInteger
Lista1.Limpar
arr=Dividir(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)ToUBound(arr)
Lista1.AddItemarr(i)
Próximo
Fim Sub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
ByValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<>wbemErrCallCancelledThen
'Tratamento de erros
FimSe
Fim Sub
No programa acima, um objeto SWbemSink StatusSink é definido, então um objeto SWbemServices Server é criado e StatusSink é conectado ao objeto Server. Desta forma, o funcionamento do programa pode ser monitorado através do StatusSink.
Execute o programa e, em seguida, execute qualquer programa, e as informações do programa em execução podem ser listadas no ListBox do Form1.
O aspecto mais poderoso do aplicativo WMI é que ele pode realizar gerenciamento remoto por meio de uma página WEB. A seguir, vamos criar uma página HTML, que pode monitorar dinamicamente os programas em execução no sistema, como o programa VB acima. O código HTML do programa em execução no sistema de monitoramento é o seguinte:
<html>
<cabeça>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></objeto>
</cabeça>
<ROteiro>
funçãojanela.onload()
{
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery =DENTRO1;
szQuery =WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</SCRIPT>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</roteiro>
<corpo>
<spanID=info></span>
</corpo>
</html>
Salve o arquivo de paginação com código como sufixo Htm. Clique duas vezes para abrir a página da web e, em seguida, execute um programa. Os nomes dos arquivos dos programas em execução podem ser listados na página da web.
O texto acima apresenta brevemente a aplicação do WMI. Na verdade, a operação dos objetos WMI é muito complexa e as funções também são muito poderosas. Por exemplo, você pode usar o WMI para monitorar os computadores em toda a LAN no servidor e instalar software. lotes para os computadores na LAN (como software antivírus). Acesse o servidor remotamente através da página, controle o servidor para executar programas, adicionar usuários, etc. Para mais aplicações WMI, os leitores podem visitar a página inicial de desenvolvimento WMI no MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
Obtenha mais informações.
->