SCCM no está pensado para realizar este tipo de tareas de auditoria o seguimiento. Le alcanza con saber que todas las actualizaciones necesarias están o no instaladas. Pero en muchas organizaciones el proceso de deploy debe ser controlado rigurosamente, y los conflictos con determinados updates (sobre todo de aplicaciones de terceros) hace necesario tener el detalle de los procesos de deploy.
Lamentablemente, Windows ha ido cambiando su criterio para el registro de la instalación de updates según versión del sistema operativo y arquitectura, lo que hace muy complejo realizar este seguimiento de manera precisa y totalmente acertada. Pero podemos tener una aproximación bastante cercana (y chapucera) utilizando este reporte.
if len(@mes)<2 set @mes='0'+@mes if len(@dia)<2 set @dia='0'+@dia Select distinct sys.Netbios_Name0, sys.User_Domain0, sys.User_Name0, sys.Operating_System_Name_and0, dbo.ConvertirFecha(qfe.InstalledOn0) as InstalledOn, qfe.InstalledBy0, qfe.ServicePackInEffect0, qfe.Caption0, qfe.Description0 FROM v_R_System sys JOIN v_GS_QUICK_FIX_ENGINEERING qfe on sys.ResourceID=qfe.ResourceID WHERE dbo.ConvertirFecha(qfe.InstalledOn0)=@anio + @mes + @dia union Select distinct sys.Netbios_Name0, sys.User_Domain0, sys.User_Name0, sys.Operating_System_Name_and0, dbo.ConvertirFecha(PSE.AgentInstallDate) as InstalledOn, 'NA' as InstalledBy0, 'NA' as ServicePackInEffect0, PSE.ID as Caption0, PSE.Title as Description0 FROM v_R_System sys JOIN v_GS_PatchStatusEx PSE on sys.ResourceID=PSE.ResourceID WHERE dbo.ConvertirFecha(PSE.AgentInstallDate)=@anio + @mes + @diaEn este caso, los prompts no requieren query alguna, pero si quieren pueden armarse una sencilla consulta en SQL que le de al usuario los valores de día mes y año que puede utilizar.
Los que hayan revisado con detenimiento la query, habrán notado que hace uso de una función llamada "ConvertirFecha". Es necesario crear esta función en su servidor SQL y en la base del SCCM para que el reporte funcione.
CREATE FUNCTION [dbo].[ConvertirFecha] (@Hexa as nvarchar(max))
RETURNS nvarchar(50)
AS
BEGIN
DECLARE @Low bigint
Declare @HighHex varchar(20)
Declare @LowHex varchar(20)
DECLARE @High bigint
Declare @Int64 bigint
Declare @Retorno nvarchar(50)
Declare @iSeconds bigint
Declare @Potencia bigint
Declare @Dias int
Declare @Fecha datetime
Declare @Query nvarchar(100)
Declare @Parameters nvarchar(50)
Declare @ReturnValue Int
Declare @Anio varchar(4)
Declare @Mes varchar(2)
Declare @Dia varchar(2)
if len(@Hexa)=16
Begin
set @HighHex = Substring(@Hexa,1,8)
set @High = dbo.ConvertFromBase(@HighHex,16)
set @LowHex = Substring(@Hexa,9,16)
set @Low = dbo.ConvertFromBase(@LowHex,16)
set @Potencia = Power(2.0,32)
set @int64 = @high * @Potencia + @Low
Set @iSeconds = Floor(@int64 / 10000000)
Set @Dias = Floor(@iSeconds/86400)-149019
Set @Fecha = DateAdd(d, @Dias, '2009-01-01')
Set @anio=DatePart(YYYY,@Fecha)
Set @mes=DatePart(mm,@Fecha)
Set @dia=DatePart(dd,@Fecha)
if len(@mes)<2 set @mes='0' + @mes
if len(@dia)<2 set @dia='0' + @dia
Set @Retorno=@Anio + @mes + @dia
End
Else
Begin
if isdate(@Hexa)=1
Begin
Set @Fecha=cast(@Hexa as DateTime)
Set @anio=DatePart(YYYY,@Fecha)
Set @mes=DatePart(mm,@Fecha)
Set @dia=DatePart(dd,@Fecha)
if len(@mes)<2 set @mes='0' + @mes
if len(@dia)<2 set @dia='0' + @dia
Set @Retorno=@Anio + @mes + @dia
End
Else
Set @Retorno=NULL
End
Return (@Retorno)
END
Con esa query crean la función en su base de SCCM.
Además, necesitan una segunda función (utilizada por la anterior) que se denomina ConvertFromBase. Aquí la query para crearla:
CREATE FUNCTION [dbo].[ConvertFromBase] ( @value AS VARCHAR(MAX), @base AS BIGINT ) RETURNS BIGINT AS BEGIN -- just some variables DECLARE @characters CHAR(36), @result BIGINT, @index SMALLINT; -- initialize our charater set, our result, and the index SELECT @characters = '0123456789abcdefghijklmnopqrstuvwxyz', @result = 0, @index = 0; -- make sure we can make the base conversion. there can't -- be a base 1, but you could support greater than base 36 -- if you add characters to the @charater string IF @base < 2 OR @base > 36 RETURN NULL; -- while we have characters to convert, convert them and -- prepend them to the result. we start on the far right -- and move to the left until we run out of digits. the -- conversion is the standard (base ^ index) * digit WHILE @index < LEN(@value) SELECT @result = @result + POWER(@base, @index) * (CHARINDEX (SUBSTRING(@value, LEN(@value) - @index, 1) , @characters) - 1 ), @index = @index + 1; -- return the result RETURN @result; END
La primera página del reporte debería verse más o menos así:
Y el resultado debería ser parecido al siguiente:
No es difícil modificar el reporte para filtrar por servidor, colección o cualquier otro parámetro típico de los reportes de SCCM.
Saludos
Franco
No hay comentarios:
Publicar un comentario