Librería de componentes GLibWMI 3.2
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
Proyecto en GitHub.
_________________________________________________________
ACTUALIZACIÓN 16/09/2021.
Actualizada la librería de componentes para que funcione con la versión 11 de delphi.
_________________________________________________________
ACTUALIZACIÓN 01/07/2020.
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.
<DESCARGAR LIBRERÍA COMPLETA versión 2.2b>
<DESCARGAR SOURCE DEMOS versión 2.2b>
<DESCARGAR EXE DEMOS versión 2.2b>
_________________________________________________________
ACTUALIZACIÓN: 1o/09/2014.
Liberada la Versión 2.1b.
Nuevas propiedades en los componentes y algunos errores corregidos.
Además la librería se ha compilado con Delphi XE7 sin problemas.
<DESCARGAR LIBRERÍA COMPLETA versión 2.1b>
<DESCARGAR SOURCE DEMOS versión 2.1b>
<DESCARGAR EXE DEMOS versión 2.1b>
_________________________________________________________
ACTUALIZACIÓN: 01/08/2013.
Liberada la Versión 2.0b.
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.
<DESCARGAR LIBRERÍA COMPLETA versión 2.0b>
<DESCARGAR SOURCE DEMOS versión 2.0b>
<DESCARGAR EXE DEMOS versión 2.0b>
_________________________________________________________
ACTUALIZACIÓN: 23/02/2010.
Liberada la Versión 1.8b.
Nuevos componentes añadidos y corrección de algunos bugs; Correción en la recuperación de propiedades y algunas pérdidas de memoria.
Actualizadas las demos con los nuevos componentes.
Como la anterior verión, los últimos cambios están subidos en Sourceforge (GLibWMI).
<Descargar librería completa; Sources+Bin versión 1.8b>
<Descargar demos; Sources+Bin versión 1.8b>
<Descargar demos; Bin versión 1.8b>
_________________________________________________________
ACTUALIZACIÓN: 22/01/2010.
Versión 1.6b.
He subido el proyecto a Sourceforge (GLibWMI). La ultima versión estará disponible allí para su descarga.
Se distribuye con licencia GNU y todos los ficheros (incluídos los fuentes se pueden descargar).
Descargar ficheros:
<GLibWMI completa 1.6b>
<GLibWMI demos 1.6b>
<GLibWMI EXE demos 1.6b>
_________________________________________________________
La librería está en fase beta y se puede usar de forma libre y gratuíta.
Las versiones actuales están disponibles (ficheros compilados) para D6, D7 y D2009.
Se pueden descargar diferentes paquetes:
<GLibWMI>
<GLibWMI para Delphi 6>
<GLibWMI para Delphi 7>
<GLibWMI para Delphi 2009>
<Demos compiladas>>
Funciona sin problemas en sistemas basados en Windows 2000 y posteriores.
Para más información consultar:
«Operating System Availability of WMI Components»
Como bien he dicho, están en fase beta, así que se aditen sugerencias, errores, comentarios,…
Un saludo.
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,…
@Raynel Rodríguez
Hola Raynel.
Tendrías que ponerme algo más de código o enviarme un ejemplo, porque con ese que has puesto, no soy capaz de entender el problema que tienes.
Un saludo.
Hola Neftalí,
Enhorabuena, te felicito. Es de agradecer esta librería.
¿El serial number de la propiedad SerialNumber del componente DiskDriveInfo de la GLibWMI que se muestra en los distintos discos es el número de serie del Fabricante, o es el que se asigna al formatear?
Saludos y gracias por tu tiempo.
@Jaume
Hola Jaume.
El serial es realmente el número de serie del fabricante (que no cambia cuando formateas el disco).
El algunos sistemas antiguos (Windows XP) te devolverá un valor vacío porque no estaba implementado todavía en WMI. A partir de esa versión ya obtienes el valor correcto.
Hola Neftalí.
Excelentes componentes te mando una felicitación.
Tengo una duda espero me puedas ayudar, con tus componentes podria desde una pc remota basado en una ip o nombre del equipo en red saber el hardware y software instalado en el equipo remoto?
En caso de que si se pueda me podrias ayudar diciendome como poder hacerlo o cual componente usar con un pequeño ejemplo?
De antemano muchas gracias.
Saludos.
@Antonio
Hola Antonio.
Gracias por la felicitación.
En prinicpio WMI permite sin problemas conectarse tanto a un equipo local, como a otros equipos de una red, siempre que tengas permisos de acceso (y poseas usuario y contraseña).
En mi caso esta librería inicialmente se pensó para una conexión local, así que en su día no publiqué las propiedades de usuario y contraseña, pero sí están presentes en el método de conexión, así que podrías modificar con muy poco esfuerzo el código para publicar esas propiedades.
Si buscas en la unit CWMIBase (que usan todos lo componentes) verás que hay un método para realizar la conexión:
//: Conectar al proveedor.
procedure TWMIBase.ConnectWMI();
Que posee la siguiente llamada:
// Connect to the WMI service, with the root\cimv2 namespace
aServices := Locator.ConnectServer(
Self.FHost, // Host
GetWMIRoot(), // root
{user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY, STR_EMPTY, 0, nil);
El Host, el usuario y el password se inicializan con: ‘.’ y 2 cadenas vacías. Eso corresponde a un equipo local (al mismo equipo donde se ejecuta), pero si cambias esos parámetros por el nombre/IP de otro equipo, un usuario y una contraseña válida, deberías poder acceder sin problemas a otros equipos de la red.
Pruébalo y dime qué tal te ha ido.
Un saludo.
Hola Neftalí,
Gracias por este aporte, me ha sido de gran ayuda durante mucho tiempo.
Estoy usando delphi 7, y utilizo el componente para obtener el número de serie del disco duro.
He usado tambien el componente TDiskinfo.
Me están surgiendo problemas con discos duros sólidos. TDiskInfo no me devuelve ningun valor, y con GLib me devuelve una cadena que no tiene nada que ver.
El numero de serie real del disco es: H21995***2069, es un disco sólido.
TDiskInfo no me devuelve nada
GLib me devuelve:324839313539304a********2039202020202020
El código con el que obtengo con Glib es:
if (DDInfo.ObjectsCount 0) then
begin
memo1.Clear;
for i := 0 to (DDInfo.ObjectsCount – 1) do
begin
DDInfo.ObjectIndex := i+1;
memo1.Lines.Add(DDInfo.DiskDriveProperties.SerialNumber);
end;
end;
Espero que puedas ayudarme.
Gracias por todo.
@Jose
Hola Jose.
La verdad es que no he tenido la oportunidad de comprobar el componente con un disco sólido.
GLibWMI se basa en WMI, así que habría que saber qué devuelve Windows para ese disco duro.
Para ello y siguiewndo las intrucciones de esta entrada (http://neftali.clubdelphi.com/wmi-%e2%80%93-introduccion/) puedes ver la información que Windows tiene del disco.
1) Abre una pantalla de MSDOS (CMD)
2) Escribe lo siguiente:
C:\Windows\System32>wmic diskdrive get Caption, Description, DeviceID, Manufacturer, SerialNumber, Size
Eso te dará la información que el sistema tiene, a través de WMI, de los discos instalados. A ver qué sale ahí. Eso mismo es lo que puede ofrecerte GLibWMI, porque es la información que consulta. Debería ser lo mismo que te devuelve el componente; Si no es así es que hay algún problema en GLibWMI.
Un saludo.
Buenas tardes,
hoy he podido probarlo en un equipo.
Aparece el numero de serie 324839313539304a********2039202020202020.
El caso es que hay aplicaciones que dan información de disco duro que si me lo da bien.
que crees que podrías hacer?, se te ocurre algo? Gracias por todo
He estado mirando por internet y he visto que este comando si lo muestra:
wmic path win32_physicalmedia get SerialNumber
Si lo devuelve, no se si podría generarme algun problema al cambiar a esta propiedad.
Saludos.
@Jose
Hola Jose.
En ese componente no puedes cambiar la propiedad pues la clase es diferente, el componente ataca a la clase Win32_DiskDrive y la opción que comentas ataca a la clase Win32_PhysicalMedia.
De todas formas no te hace falta. Dentro del paquete hay un componente llamado TWMISQL que permite realizar consultas contra las clases que no solucionan el resto de componentes:
Si lo utilizas, puedes usar como SQL: «Select * from Win32_physicalmedia» y con eso podrás obtener ese valor.
Hay un ejemplo en las demos sobre este componente.
Un saludo.
@Germán Estévez
Modifiqué uno de los componentes cambiando la consulta, y obteniendo únicamente el numero de serie y funciona perfectamente.
Gracias por todo.
@Jose
Perfecto Jose.
Un saludo.
I would like to suggest to you publish it on Github.
Additionally, if it could compile on FreePascal / Lazarus would be great.
Thanks for your work.
regards,
Marcos Douglas
@mdbs99
Thanks Marcos for the comments.
I have get your recommendation and have upoload the code to GitHub (updates the component page).
Muy buen aporte el tuyo, nos ahorras mucho trabajo…
Gracias por todo
Your friend;
Startkill
Lima-Perú
Buenas,
Muy bueno los componentes. He estado mirando el código que está en GitHub y me llamó la atención que los mensjes (Strings) los pusieras como CONST y no como RESOURCESTRING. Ya se que para el caso es lo mismo pero a que se debe estó.
Además he visto que en todos los componentes donde existe la propiedad Availability llegas hasta el enumerado 17 cuando Microsoft llega hasta el 21. Esto puede que sea porque las clases que usaste no lo tenían en su momento?. Igual no es nada grabe porque se los puedo agregar y listo.
Mas allá de esto, quería saber con que programa realizar los iconos, ya que tengo que hacer algunos para unos componentes propios y no se con que haceerlos.
Saludos
Buenas,
Muy buenos los componentes. Esto lo conocía pero nunca me puse a investigarlo y ahora se dio. He visto los fuentes de GitHub y me preguntaba porque los strings que muestras los tienes como CONST y no como RESOUSESTRING (aunque para este caso es lo mismo uno que otro).
Por otro lado, he visto que hay un par de métodos que los tienes como published junto con las propiedades que hacen uso de estos. No sería mejor tenerlos como privados y que solo queden publicadas las propiedades?. A lo mejor lo pensaste así por alguna razón que desconosco.
Saludos
@Alejandro G
Hola Alejandro, gracias por los comentarios. Intento responderte a todas las preguntas.
1) En cuanto a los resourcestrings, si te refieres a los que se definen dentro de los componentes (CBiosInfo, por ejemplo) es debido a que los dejé como originalmente los devuelve WMI. Se podrían pasar a resourcestring y así poder traducirlos, pero me pareció adecuado que el valor fuera como el original para poder «cuadrarlo» con la documentación. Aunque no habría problema en cambiarlo.
2) En cuanto a la propiedad Availability es exactamente por lo que comentas. En su momento los valores disponibles llegaban hasta el 17. Ahora hay nuevos así que habría que actualizar el código. Es posible que pase con otras propiedades, incluso que haya aparecido alguna propiedad nueva que no existe. Lo apunto para revisarlos.
3) Como programa de iconos suelo utilizar IcoFX que tiene versiones gratuitas (anyFX) o Greenfish Icon Editor muy parecido.
4) En cuanto a los métodos, tal vez se me ha escapado alguno como public/pulished y tal vez no sea necesario. Si es así se pueden pasar a privados. Si me comentas cueles son, me lo apunto para la próxima actualización.
Gracias por los comentarios.
@Germán Estévez
Mil gracias por las respuestas.
Saludos
Hola Germán, desde hace dos años, vengo utilizando en un programa tu componente DiskDriveInfo del paquete GlibWMI, para leer datos de un pendrive que se usa como mochila.
Hasta ahora, todo funcionó correctamente pero de buenas a primeras, sin saber porqué, ha empezado a dar un problema. Al compilar el programa, (puesto que he de hacerlo para cada persona que me lo compra, con datos del pendrive diferentes), da el siguiente error: Project Programa.exe raised exception class EOleException with message ‘OLE error E06D7363’. Process stopped. Use step or run to continue.
No es un error de compilación sino que este se produce al arrancar el programa después de la compilación, puesto que lo primero que hace el programa al arrancar, es leer los datos del pendrive. El programa queda compilado correctamente y funciona sin problemas, leyendo la llave correctamente, pero es muy fastidioso no poder probar las modificaciones directamente desde el IDE de Delphi, más teniendo en cuenta que nunca pasó eso. Pensé que podría haber instalado incorrectamente Delphi o el paquete de componentes, pues tuve que reinstalarlo recientemente (en el mismo ordenador) y no recuerdo si había vuelto a compilar ese programa después, pero volví a reinstalar delphi y el paquete de sin resultado positivo. También pensé que, como al reinstalar delphi, aproveché para descargar la versión más reciente del paquete, igual era esa última versión la que daba el problema, pero he ido instalando las versiones anteriores una por una (no recuerdo la que usaba antes) sin conseguir resolver el problema. Por supuesto cada vez he desintalado la versión instalada y sustituido los paths en Library path y Browsing path.
Por supuesto, también pensé que podría haber pasado algo en el código del programa, a pesar de no haber tocado nada del código recientemente, pero para salir de dudas, hice un pequeño programa que solo incluía el componente, un botón y un Tlabel donde se leía el modelo del pendrive al pulsar el botón y el problema surge igualmente trabajando desde el IDE de Delphi y de la misma forma que mi programa, cuando se arranca el programa fuera de Delphi, funciona perfectamente.
El paquete lo tengo instalado en Delphi 7 y lo utilizo en Windows 10.
Me gustaría preguntarte si tienes alguna idea de donde podría venir ese error. Solo soy aficionado a la programación, no soy profesional (el programa, aunque lo vendo, solo es para colegas de mi afición, el Belenismo, ya que es para controlar Belenes) y el problema me trae loco.
Te agradecería una orientación. Muchas gracias de antemano, y felicitaciones por estos componentes.
Se me olvidó indicarte donde se interrumpe la ejecución. Ésta se produce en las líneas marcadas del procedimiento que transcribo, de la unit CWMIBase.
procedure TWMIBase.ConnectWMI();
var
Locator: ISWbemLocator;
begin
try
// Create the Location object
Locator := CoSWbemLocator.Create();
// Connect to the WMI service, with the root\cimv2 namespace
EN LA LÍNEA SIGUIENTE ES DONDE SE INTERRUMPE LA EJECUCIÓN. SI SE PULSA RUN DE NUEVO, SE VUELVE A INTERRUMPIR EN LA SIGUIENTE MARCADA
aServices := Locator.ConnectServer(
Self.FHost, // Host
GetWMIRoot(), // root
{user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY, STR_EMPTY, 0, nil);
Self.FConnected := True;
//-MessageDlg(‘Conectado’, mtInformation, [mbOK], 0);
except
Self.FConnected := False;
//-MessageDlg(‘No Conectado’, mtInformation, [mbOK], 0);
//+G EXCEPCION PRPIA
ESTA ES LA SIGUIENTE
raise Exception.Create(GetLastErrorAsString());
end;
end;
@Fran
Hola Fran.
Hace tiempo que no modifico los fuentes, sólo los voy recompilando para asegurarme de que funcionan en las últimas versiones. Si me dices que tú tampoco has cambiado el tuyo, es posible que sea algo relacionado con Windows o con tu versión de Delphi.
Yo probaría (si está en tus posibilidades) compilarlo con una versión más nueva de delphi.
Otra cosa que puedo hacer es que me envíes el programita (a german_ral@hotmail.com) que has hecho de ejemplo, lo pruebo y te digo. Tengo varias versiones de Delphi (enttre ellas D7) y te digo si a mi me pasa.
Un saludo.
Gracias por tu respuesta. Respecto a compilar el programa con una versión más reciente de Delphi, lo intenté hace poco, antes de tener el problema que te he comentado, con el objeto de modernizar el aspecto del programa y estar más actualizado, pero desgraciadamente no fué posible instalar en la versión más reciente de delphi dos componentes de terceros que solo los he podido encontrar para Delphi 7 o anteriores y que son insustituibles.
Lo de mandarte el programita lo puedo hacer, pero tendría que mandarte el codigo fuente para que vieras el problema, porque como te digo el programa compilado funciona perfectamente fuera de Delphi. El error solo se produce durante la ejecución desde el entorno de Delphi.
Yo he pensado que eso de que el problema surgiera de buenas a primeras es muy raro. Recuerdo ahora que una versión nueva que estaba preparando con algunas mejoras, la compilé hace unos días sin problema. Lo único que ha cambiado desde entonces es que Windows 10 se ha actualizado dos veces. ¿Podría venir el error por esto, es decir, que debido a la actualización de Windows, el componente haya dejado de ser compatible?.
Te mandaré el código fuente en estos días. Muchas gracias de nuevo por prestarnos tu tiempo y espero que esta consulta te sirva a ti también para las revisiones que haces de tus conponentes. ¡Un saludo!
@Fran
Hola Fran.
Cuando decías que me enviaras un programa me refería a un pequeño ejemplo donde consigas que se reproduzca el problema, no estaba pensando en el código del tuyo. Intentaré así reproducir el problema en mi máquina (diferente a la tuya) y con versiones distintas.
De todas formas por lo que comentas me inclino más por lo último que dices. Algun cambio en el «entorno».
* Actualización de Windows.
* Cambios en el IDE (si hubieras instalado algo en el D7; Expertos o similares)
Si no has hecho lo segundo, lo más lógico es lo primero.
Un saludo
Si, entendí que te referías al programita de prueba pero hice un «pensamiento en voz alta» nada mas. Ya te lo mandé y a ver si entran las capturas de pantalla, porque de primera no entraban.
Boa tarde. Existe um modo de validar pelo Delphi se o WMI está sendo executado no computador do cliente? Tive um problema de não obter os dados mas era referente ao WMI que estava com erro.
@Abraão
Hola.
WMI se ejecuta como servicio. Deberías revisar si el servicio está en marcha y corriendo.
Buenas tardes Neftalí,
He estado usando tus componentes pero no he visto forma de obtener la IP de uno de los adaptadores de red así como poder asignar una nueva IP, dns…
Por lo demás, menudo pedazo de componentes, muy muy útiles,…
Saludos y gracias,
Buenos días Germán,
Hay alguna forma de obtener la IP de una Interface, así como asignar nueva IP, máscara, puerta de enlace y DNS, con estos componentes.
Saludos,
Buenas,
Estoy teniendo problemas con el método ‘ConnectServer’ de la interfaz ‘ISWbemLocator’. Precisamente lo que pasa es que si la máquina no tiene levantado el servicio este se cuelga y hace que se cuelgue toda la aplicación.
He visto en la documentación de Microsoft que esto debería devolver un código de error, pero como te comente se cuelga y no devuelve nada. Mirando tus componentes veo que tú tampoco tienes atrapado el error como corresponde.
El muchos foros como por ejemplo ‘Stack Overflow’ hablan de esto pero todas las soluciones que proponen ninguna funciona. La única que se me ocurre es antes de hacer la conexión verificar si el servicio está levantado y ahí atrapar el error.
Si sabes de alguna otra forma sería bueno que lo comentes, ya que los otros métodos que se usan para levantar los datos de lo que se quiere también tienen el mismo problema de dejar colgada la aplicación si por alguna razón no está activo el servicio de WMI.
@Makineta
Pedonad por no responder a estos comentarios.
Habitualmente siempre lo hago, pero se me habían quedado «enterrados» en cientos de comentarios SPAM.
Los componentes GibWMI poseen acceso a la clase de WMI Win32_NetworkAdapter (https://learn.microsoft.com/es-es/windows/win32/cimwin32prov/win32-networkadapter). La información que tú necesitas es accesible mediante la clase Win32_NetworkAdapterConfiguration (https://learn.microsoft.com/es-es/windows/win32/cimwin32prov/win32-networkadapterconfiguration).
En este caso para esos valores tendrás que hacer una consulta específica, no puedes usar los componentes.
Un saludo.
@Alejandro G.
Hola Alejendro.
Me lo apunto.
Lo que se me ocurre es que antes de realizar las consultas, intentes la conexión en un Thread independiente. No se si funcionará, pero es la idea que se me ocurre para intentar.
Un saludo.