Estos días he dedicado un poco de tiempo a revisar esta librería de componentes GLibWMI para trabajar con WMI que ya hace unos años diseñé. Ya he comentado otras veces que por el tipo de código que contiene (en su día la diseñé con Delphi 6) debe compilar sin mayores problemas en versiones posteriores, salvo algunos Warnings (por conversión de tipos de datos) y algún Hint, que no afectan al funcionamiento de los componentes.
He compilado el paquete de componentes con la versión 10.2 Tokyo y he icluído algunas directivas de compilación.
La librería se ha actualizado a la versión 2.2b y he recompilado los ejemplos y demos que la acompañan.
He mantenido las descargas anteriores por si alguien necesita descargarlas.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Como he hecho en otras ocasiones coincidiendo con el lanzamiento de las nuevas versiones de Delphi, en este caso también he realizado la compilación de la librería para la versión XE7 de Delphi.
En esta versión, aprovechando, he añadido alguna mínima corrección y algún cambio sugerido por los usuarios.
Además de alguna demo nueva para el componente de consultas WMI.
Tenéis una descripción más amplia de la librería y algunas capturas de pantalla junto con el listado de todos los componentes que incluye, en la sección dedicada a ella.
Los componentes también se pueden descargar desde Sourceforge.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Ya he hablado otras veces en el blog de la WMI (Windows Management Instrumentation), con ejemplos y artículos; Además también podéis encontrar en la sección de componentes la librería GLibWMI que utiliza esta característica de windows para acceder a diferente información de un sistema que corra el susodicho S.O. de Microsoft.
En este caso quiero compartir con vosotros una sencilla aplicación que permite “monitorizar” a través de PING el estado de un ordenador remoto.
Esta pequeña aplicación la he creado a partir de la necesidad de conocer el tiempo de respuesta de un equipo a lo largo de una jornada. Necesitaba saber si a lo largo de unas horas se producían cortes o bajadas en el tiempo de respuesta.
Para ello he realizado un ping periódico y almacenando los resultados, para poder analizar a posteriori si la respuesta ha sido homogénea.
Podemos realizar un PING desde Delphi utilizando las librerías Indy, mediante el componente TIdIcmpClient y otra opción es utilizar la librería ICMP.DLL de Windows y Winsock.
En este caso, lo he realizado utilizando una tercera opción que es, mediante WMI.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Acabo de empaquetar la versión 1.3 (beta) de la librería de componentes GLibWMI, basados en la WMI de Windows.
Básicamente he añadido nuevos componentes y he corregido algunos errores que incluía la demo general. Además he testado la librería en Delphi 2009 sin ningun problema a la hora de compilar. Doy por supesto que en todas las intermedias entre D7 y D2009 fucionará sin problemas.
Los componentes nuevos son:
CProcessInfo: Información acerca de los procesos que hay ejecutándose en el sistema..
CServiceInfo: Información detalleda de los servicios que hay instalados en el sistema..
CDesktopMonitorInfo: Información detallada sobre el monitor o dispositivo de visualización que hay en el sistema.
CComputerSystemInfo: Información acerca del sistema en General.
CStartupCommandInfo: Información acerca de los procesos que se ejecutan automáticamente cuando el usuario hace el Login en el sistema.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
GLibWMI es una librería/biblioteca de componentes enfocados a la Administración de Sistemas Windows.
Están basados en la WMI de Windows (Windows Management Instrumentation). Podéis conocer algo más sobre WMI en la entrada del blog titulada «WMI – Introducción«.
ACTUALIZACIÓN 01/02/2024.
Actualmente se ha liberado la versión 3.2 estable (compatible con Delphi 12 Athens).
El código se ha subido en GitHub y en el blog se mantienen las versiones antiguas. NOTA IMPORTANTE: Debido a problemas con la autentificación de Github la ubicación antigua del proyecto queda obsoleta (https://github.com/NeftaliDelphi/GLibWMI), las nuevas actualizaciones se harán en este repositorio: https://github.com/germanestevez/GLibWMI
La librería de componentes se ha actualizado a la versión 3.0 considerada como estable (hasta ahoira estaba en fase beta). Se han añadido además nuevas demos y se han actualizado las existentes.
La versión 3.0 cuenta con nuevos componentes y compila sin problemas desde Delphi 6 hasta la versión Delphi 10.3 (por ahora no se ha probado en 10.4, pero debería compilar sin ningun problema).
ACTUALIZACIÓN 03/04/2019.
Actualizada la librería la versión 2.2b. Compatible con Delphi 10.2 (Tokyo) y anteriores.
Eliminados Hints y Warnings en los de componentes.
Eliminados Hints y Warning en los ejemplos .
Se añaden Units a los uses necesarias para versiones nuevas.
Se añade fichero incluyendo directivas de compilación.
Se generan packages para las nuevas versiones de delphi.
Nuevos componentes añadidos (BootConfigurationInfo, DesktopInfo CodecsInfo, RegistryInfo, TimeZoneInfo) y corrección de algunos bugs.
Compilado para las nuevas versiones de Delphi, incluídas XE4 y XE5.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Siguiendo con los ejempos y ahondando en las posibilidades de WMI (Windows Management Instrumentation), a raiz de este hilo en los foros del ClubDelphi, referente al software instalado en nuestro ordenador, he probado a obtener la lista de programas instalados utilizando la WMI.
Para ello podemos utilizar la clase Win32_Product.
Si accedemos a su descripción en MSDN, obtenemos la siguiente descripción de la clase:
Podemos disponer así de toda la información, referente a cada uno de los programas/aplicaciones instalados en nuestro equipo (*NOTA*).
Para ello, lo primero que debemos hacer es Importar a Delphi la librería “Microsoft WMI Scripting v1.X Library (Version 1.X)“, si no lo hemos hecho ya.
En la Introducción sobre WMI, se explica un poco más detalladamente.
Una vez importada, lo siguiente (dentro de nuestro ejemplo) es conectar con nuestro proveedor (en este caso nuestra máquina local):
1
2
3
4
5
6
// Create the Location object
Locator := CoSWbemLocator.Create();// Connect to the WMI service, with the root\cimv2 namespace
aServices := Locator.ConnectServer(STR_EMPTY,{Server}
STR_CIM2_ROOT,{user}STR_EMPTY,{password}STR_EMPTY,
STR_EMPTY,STR_EMPTY,0,nil);
// Create the Location object
Locator := CoSWbemLocator.Create();
// Connect to the WMI service, with the root\cimv2 namespace
aServices := Locator.ConnectServer(STR_EMPTY, {Server}
STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY,STR_EMPTY, 0, nil);
A continuación, si la conexión ha sido correcta, realizamos la consulta sobre la clase Win32_Product, que nos dará la información que necesitamos.
1
2
3
// realizar la consulta
ObjSet := Services.ExecQuery('SELECT * FROM Win32_Product','WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly ,nil);
// realizar la consulta
ObjSet := Services.ExecQuery('SELECT * FROM Win32_Product',
'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
A partir de ahí basta con recorrer los elementos obtenidos y e nuestro caso formatear algunas propiedades para mostrarlas (Caption, InstallDate, Vendor y Version), aunque todas las demás están igualmente a disponsición del programador.
Recordad de colocar en el USES las dos units comentadas antes.
(*NOTA*): Recordemos (link), que una de las características de WMI es que permite «Administración remota», con lo que si tenemos los suficientes permisos, este código también puede servir para inventariar otras máquinas.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
No hace mucho me cruce con esta “palabrota” este concepto: WMI.
A priori parece sólo eso, una “palabrota” más, de las muchas que nos encontramos en nuestro día a día “informático”. Pero rascando, rascando ha aparecido una perla oculta bajo una capa de polvo.
WMI son las iniciales de “Windows Management Instrumentation”. Se me hace complicado explicar en pocas palabras qué es, pero si tuviera que hacerlo, diría que es algo así como “Una puerta de acceso a la Administración de Sistemas Windows” ( ;-D Windows Management Instrumentation).
Junto a WMI aparecen dos “palabrotas” dos conceptos más que nos ayudan a saber de dónde viene.
WBEM (Web-Based Enterprise Management )
CMI (Common Model Information).
Si las juntamos todas nos queda que, WMI es una implementación que Microsoft ha hecho para Windows, de un estandard llamado WBEM que sirve para la administración de sistemas vía web y que está basado en CIM, que vienen a ser unas clases que nos dan acceso a diferente información del un equipo.
(Traducción al idioma Terrícola):
“A través de WMI yo puedo administrar un equipo basado en Windows, local o remoto, independientemente de la versión del sistema, utilizando las clases que me provee CIM.”
Y esto visto desde el punto de vista de un programador tiene muy buena pinta.
Este podría ser un gráfico sencillo de su estructura.
Dicho esto, yo me pregunto, ¿Qué tiene de bueno WMI y qué puede hacer por mi? (en el terreno más práctico)
Utilizando WMI podemos consultar información sobre nuestro equipo. Desde las aplicaciones instaladas, a la información de la BIOS, discos duros instalados, particiones creadas, Antivirus instalado si lo hay, nivel de carga de la batería (si conviene), procesos ejecutándose, acceso a los servicios instalados, acceso a las tareas programadas, y la lista sigue y sigue…
Cuando hablamos de administración significa que no sólo podemos consultar estos parámetros, sino también modificarlos en muchos casos.
Administración remota. Significa que lo dicho anteriormente se aplica también a administración remota. Es decir, no sólo podemos hacerlo en nuestro equipo, sino en el resto de equipos de la red. WMI está presente en sistemas Windows 2000 con SP2 en adelante. Para los anteriores (95, 98 y NT 4.0) se puede descargar un SDK para instalarlo (link).
Es extensible. Microsoft añade nuevas clases a cada versión de Windows. Además se pueden crear nuevos proveedores de WMI que amplíen funcionalidades.
Acceso desde la línea de comandos. Existe una herramienta para trabajar desde la línea de comandos con WMI (link).
Utilizándola podemos por ejemplo obtener los procesos ejecutándose si desde una ventana de MS-DOS escribimos:
1
2
3
4
WMIC PROCESS
WMIC PROCESS LIST BRIEF (mejora la visualización)
WMIC /output:”c:\procesos.txt” PROCESS LIST BRIEF
(para obtener salida a un fichero)
WMIC PROCESS
WMIC PROCESS LIST BRIEF (mejora la visualización)
WMIC /output:”c:\procesos.txt” PROCESS LIST BRIEF
(para obtener salida a un fichero)
Lenguaje de consulta similar a SQL llamado WQL (WMI Query Language). Utilizándolo podemos desde una ventana MS-DOS ejecutar comandos como estos:
1
2
3
4
5
WMIC PRINTER WHERE Default=”TRUE”
(obtener info sobre la impresora predeterminada)
WMIC PRINTER WHERE Default=”TRUE” LIST FULL
WMIC PRINTER WHERE default="TRUE" GET DriverName,PortName,PrintProcessor
(para obtener determinados datos de la impresora predeterminada)
WMIC PRINTER WHERE Default=”TRUE”
(obtener info sobre la impresora predeterminada)
WMIC PRINTER WHERE Default=”TRUE” LIST FULL
WMIC PRINTER WHERE default="TRUE" GET DriverName,PortName,PrintProcessor
(para obtener determinados datos de la impresora predeterminada)
Aquí se pueden ver unos cuantos ejemplos más a parte de la extensa documentación existente en las páginas de Microsoft.
Una vez hecha esta introducción (muy genérica) sobre WMI, me gustaría centrarme en las aplicaciones que pueden acceder a ella. Microsoft proporciona las API de WMI para scripts, aplicaciones Visual Basic, aplicaciones C++ y .NET Framework. Eso no quiere decir que no se pueda acceder desde casi cualquier lenguaje. En mi caso me voy a centrar en el acceso a ella desde Delphi.
Para acceder desde Delphi a WMI lo primero que necesitamos en Importar la librería desde el menú de Project/Import Type Library (pasos aquí):
Una vez importada la librería tendremos la unit WbemScripting_TLB.pas generada y lista para utilizar. En nuestros programas deberemos incluir en la clausula USES, esta unit junto con la de ActiveX.
Antes de acabar esta entrada (espero poder publicar más, ya que el tema me parece muy interesante) podemos ver cómo utilizar la WMI para acceder a los datos del disco duro. En este caso, para simplificar vamos a acceder a los datos del primer disco (DiskDrive) existente en el sistema. Para ello se utiliza la clase: Win32_DiskDrive
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…