Inicio > Código, Delphi, Ejemplos, WMI > Inventario de software instalado (WMI)

Inventario de software instalado (WMI)

martes, 24 de noviembre de 2009 Dejar un comentario Ir a comentarios
Share Button

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Win32_Product : CIM_Product
{
  uint16   AssignmentType;
  string   Caption;
  string   Description;
  string   IdentifyingNumber;
  string   InstallDate;
  datetime InstallDate2;
  string   InstallLocation;
  sint16   InstallState;
  string   HelpLink;
  string   HelpTelephone;
  string   InstallSource;
  string   Language;
  string   LocalPackage;
  string   Name;
  string   PackageCache;
  string   PackageCode;
  string   PackageName;
  string   ProductID;
  string   RegOwner;
  string   RegCompany;
  string   SKUNumber;
  string   Transforms;
  string   URLInfoAbout;
  string   URLUpdateInfo;
  string   Vendor;
  uint32   WordCount;
  string   Version;
};

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);

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);

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.

Se puede descargar el código de ejemplo desde aquí y el ejecutable compilado desde aquí.

<Ejemplo_sources>

<Ejemplo_Ejecutable>

(*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.

Vota este post
Subscribe
Notify of
guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

6 Comments
Inline Feedbacks
Ver todos los comentarios
Tuxito
Tuxito
8 years ago

Muchas gracias por la info, más una consulta, como puedo usarlo en lazarus.

Alejandro G.
Alejandro G.
3 years ago

Buenas,

Me parece muy bueno como explicas en uso de esa clase. Además he visto los componentes que tienes con otras clases.

Primero que nada tengo que decirte que en los componentes GLibWMI el sitio web a la documentación de MSDN sobre Win32_Product ya no existe mas. Por otro lado quiero ver si conoces alguna otra forma de obtener estos datos ya que en muchos foros dicen que no hay uqe usarla porque es demaciada lenta la obtención de los aplicativos instalados, mas cuando se quieren traer de una máquina remota (este es el caso que yo necesito y además son muchas las que tengo que consultar).

He visto que algunos mensionan «W32Reg_AddRemovePrograms», pero como solo existe en el SCCM de Microsoft y no pertenece al estandar no se puede usar y no tiene documentación.

Saludos

Alejandro G.
Alejandro G.
3 years ago

Esta bueno el ejemplo para traer los datos del software instalado en otra computadora. Igualmente por lo que he leído en varios foros usar Win32_Product no es aconsejable porque es muy lento.

Mi pregunta es si no existe otra forma de traer todos esos datos sin hacer lento. Además he visto en el sitio MSDN que no le dan actualización a esta librería desde 2015, aunque al resto las vienen actualizando y hasta las cambiaron de sitio en un momento (Win32_Product es la única que sigue en el sitio viejo).

6
0
Would love your thoughts, please comment.x
()
x