La tecnología WMI (Instrumental de administración de Windows) es una herramienta de administración del sistema en Windows proporcionada por Microsoft. A través de esta herramienta, casi toda la información del sistema cliente se puede gestionar localmente o en el sistema cliente. Muchas herramientas profesionales de administración de redes se desarrollan en base a WMI. Esta herramienta es una herramienta estándar en Win2000 y WinNT, y una opción de instalación extendida en Win9X. Este artículo presentará cómo acceder a la programación de objetos WMI a través de la programación VB.
Primero, veamos un ejemplo simple de cómo obtener información del sistema a través de WMI. Este ejemplo obtiene los procesos que se ejecutan en el sistema a través de objetos WMI:
FunciónEnum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PRocess)
Para cadaobjInobjs
Enum1=Enum1 obj.Descripción Chr(13) Chr(10)
Próximo
Función final
En el código anterior, el objeto WMI se obtiene primero a través de GetObject (WinMgmts:). Hay muchos subelementos bajo el objeto WMI. Aquí obtenemos todos los subelementos de la lista de procesos en el sistema a través de WMI.InstancesOf (Win32_Process).
Veamos un ejemplo completo de acceso a objetos WMI. Este ejemplo obtiene información de la computadora.
Cree un nuevo proyecto, agregue un control TextBox y un control CommandButton a Form1 y escriba el siguiente código en el evento Click del CommandButton:
PrivadoSubCommand1_Click()
Atenuaciones, sistema, elemento
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
Para cada elemento en el sistema
'List1.AddItemitem.tipo de CPU
s=Información del equipo&vbCrLf
s=s&******************************&vbCrLf
s=s&nombre de la computadora:&nombre.del.elemento&vbCrLf
s=s&Estado:&item.Estado&vbCrLf
s=s&tipo:&item.SystemType&vbCrLf
s=s&Fabricante:&item.Fabricante&vbCrLf
s=s&modelo:&item.Modelo&vbCrLf
s=s&memoria:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&dominio:&item.dominio&vbCrLf
La opción 's=s&Workgroup&item.Workgroup&vbCrLf' para obtener el grupo de trabajo y el dominio no se puede utilizar al mismo tiempo
s=s&usuario actual:&item.nombre de usuario&vbCrLf
s=s&estado de arranque&item.BootupState&vbCrLf
s=s&Esta computadora pertenece a&item.PrimaryOwnerName&vbCrLf
s=s&tipo de sistema&item.CreationClassName&vbCrLf
s=s&Tipo de computadora&item.Descripción&vbCrLf
Fori=0To1'Aquí se supone que hay dos sistemas instalados
s=s&Chr(5)&Opciones de inicio&i&:&item.SystemStartupOptions(i)_
&vbCrLf
Siguiente
Próximo
Texto1.Texto=s
FinSub
Ejecute el programa, haga clic en Comando1 y la información de la computadora se mostrará en el cuadro de texto.
En el código anterior, el programa obtiene el objeto WMI a través de GetObject (winmgmts:), luego obtiene la siguiente subclave Win32_ComputerSystem y obtiene la información en el sistema accediendo a los subelementos en el objeto Win32_ComputerSystem.
Cabe señalar que no todos los sistemas admiten WMI y, en algunos sistemas, no se puede mostrar información como la del fabricante.
Las computadoras y redes actuales son muy complejas. Por ejemplo, en cuanto al hardware del sistema, hay placas base, discos duros, tarjetas de red…
En términos de software, existen sistemas operativos, software instalado en el sistema, procesos en ejecución, etc. Los aspectos de la red incluyen dominios, grupos de trabajo, etc. Puede utilizar WMI para acceder a toda la información anterior, pero será muy problemático acceder a ella utilizando los mismos elementos que antes. Con este fin, WMI proporciona una declaración de consulta similar a una declaración SQL, a través de la cual se pueden obtener los subelementos del objeto WMI.
Aquí hay un código que recorre las tarjetas de red instaladas en el sistema y devuelve la dirección MAC de la tarjeta de red:
Función PrivadaMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECCIONARDirecciónMACA&_
DESDEWin32_NetworkAdapter&_
DÓNDE&_
((MACADirecciónIsNotNULL)&_
Y(Fabricante<>&_
'Microsoft')))
Para cadaobjInobjs
Dirección MAC=obj.DirecciónMACA
Salir para
Siguienteobj
Función final
El código anterior obtiene el objeto WMI y luego ejecuta ExecQuery para ejecutar una declaración de consulta WMI para obtener la tarjeta de red instalada y devolver la dirección MAC de la tarjeta de red.
WMI también admite el procesamiento de eventos, lo que permite que los programas manejen eventos del sistema, como la ejecución y cierre de programas, la inserción y extracción de unidades extraíbles, etc. A continuación se muestra un programa que puede monitorear los programas que se ejecutan en el sistema.
Primero cree un nuevo proyecto, luego haga clic en el elemento de referencias del proyecto en el menú, seleccione MicrosoftWMIScriptingLibrary en la lista de referencias y agregue la biblioteca de objetos WMI al proyecto. Luego agregue un control ListBox a Form1 y luego agregue el siguiente código a Form1:
OpciónExplícito
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
Eventos SubKill Privados()
EstadoSink.Cancelar
SetStatusSink=Nada
FinSub
PrivadoSubForm_Load()
DimQueryAsString
SetStatusSink=NuevoSWbemSink
SetLocator=CrearObjeto(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
Consulta = SELECCIONAR * DESDE __InstanceCreationEvent
Consulta=Consulta DENTRO de 1
Consulta=Consulta WHERETargetInstanceISA'Win32_Process'
Services.ExecNotificationQueryAsyncStatusSink,Consulta
FinSub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
Dimarr
DimstrQueAsString
DimiAsInteger
Lista1.Borrar
arr=Dividir(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)ToUBound(arr)
Lista1.AddItemarr(i)
Siguiente
FinSub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
PorValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
SiHResult<>wbemErrCallCancelledThen
'Manejo de errores
Fin si
FinSub
En el programa anterior, se define un objeto SWbemSink StatusSink, luego se crea un objeto SWbemServices Server y StatusSink se conecta al objeto Server. De esta forma, se puede controlar la ejecución del programa a través de StatusSink.
Ejecute el programa y luego ejecute cualquier programa, y la información del programa en ejecución se puede enumerar en el ListBox de Form1.
El aspecto más poderoso de la aplicación WMI es que puede realizar administración remota a través de una página WEB. A continuación, creemos una página HTML, que puede monitorear dinámicamente los programas que se ejecutan en el sistema como el programa VB anterior. El código HTML para el programa que se ejecuta en el sistema de monitoreo es el siguiente:
<html>
<cabeza>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></objeto>
</cabeza>
<guión>
ventana de función.onload()
{
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=localizador.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery =DENTRO de1;
szQuery =WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</guión>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</guión>
<cuerpo>
<spanID=info></span>
</cuerpo>
</html>
Guarde el archivo de la página con el código como sufijo Htm. Haga doble clic para abrir la página web y luego ejecute un programa. Los nombres de archivos de los programas en ejecución se pueden enumerar en la página web.
Lo anterior presenta brevemente la aplicación de WMI. De hecho, la operación de los objetos WMI es muy compleja y las funciones también son muy poderosas. Por ejemplo, puede usar WMI para monitorear las computadoras en toda la LAN en el servidor e instalar software. lotes a las computadoras en la LAN (como software antivirus). Acceder al servidor de forma remota a través de la página, controlar el servidor para ejecutar programas, agregar usuarios, etc. Para obtener más aplicaciones WMI, los lectores pueden visitar la página de inicio de desarrollo de WMI en MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
Obtenga más información.
->