lunes, 16 de abril de 2012

Colección con computadoras que NO tienen un software instalado

Una solicitud común, pero con cierta dificultad de resolver, es la de buscar todos los equipos que NO tengan determinado software instalado. Podemos realizar esta búsqueda a través de un reporte, de una query, o todavía mejor, de una colección dinámica.
La ventaja de usar la colección, es que una de las razones para solicitar el listado de equipos que NO tengan X software instalado, es, justamente, para instalarselo. Y el deploy debemos hacerlo sobre una colección.

La complejidad de la query en este caso reside en dos puntos. El primero es que se trata de una consulta anidada. Para quienes no están muy acostumbrados a los lenguajes de consulta (en este caso WQL), esto puede complicar un poco las cosas. El segundo inconveniente es que tenemos dos "Add/Remove Programs". El de los equipos con sistema operativo de 32 bits y el de los X64. Así que tendremos que buscar en ambas tablas y encontrar a quienes no aparezcan en ninguna de ellas.

Sin más rodeos, he aquí la query para obtener todas las computadoras que no cuenten con determinado software:

select SMS_R_SYSTEM.ResourceID,
SMS_R_SYSTEM.ResourceType,
SMS_R_SYSTEM.Name,
SMS_R_SYSTEM.SMSUniqueIdentifier,
SMS_R_SYSTEM.ResourceDomainORWorkgroup,
SMS_R_SYSTEM.Client
 from SMS_R_System inner join
 SMS_G_System_COMPUTER_SYSTEM
 on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId
 where SMS_G_System_COMPUTER_SYSTEM.Name not in
 (select distinct SMS_G_System_COMPUTER_SYSTEM.Name from  SMS_R_System inner join SMS_G_System_COMPUTER_SYSTEM on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId left join SMS_G_System_ADD_REMOVE_PROGRAMS_64 on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like
 "%NOMBRE DEL SOFTWARE%"
 or SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName like
 "%NOMBRE DEL SOFTWARE%")

Como podrán adivinar, deben reemplazar "NOMBRE DEL SOFTWARE" por el nombre del programa a buscar.

Esta query no puede armarse completamente en el diseñador de querys de SCCM, pero si les resulta más sencillo, pueden usarlo de este modo:

Tipo de criterio: Subselected values.
Donde: Computer System - Name
Operador: Is not in
Subselect: Y aquí pegan toda la subconsulta que aparece entre paréntesis en la consulta original:

select distinct SMS_G_System_COMPUTER_SYSTEM.Name from  SMS_R_System inner join SMS_G_System_COMPUTER_SYSTEM on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId inner join SMS_G_System_ADD_REMOVE_PROGRAMS on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId left join SMS_G_System_ADD_REMOVE_PROGRAMS_64 on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID = SMS_R_System.ResourceId where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName like
 "%NOMBRE DEL SOFTWARE%"
 or SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName like
 "%NOMBRE DEL SOFTWARE%"

El asistente nos dice que hay un error en la subconsulta, pero en realidad es una falla en el análisis, podemos obviar esta advertencia.

No olvidemos, que para que la coleccione funcione correctamente debemos actualizarla periódicamente y permitir el agregado dinámico de recursos:


Saludos
Franco



1 comentario: