Video Screencast Help
Protect Your POS Environment Against Retail Data Breaches. Learn More.

{CWoC} Patch Trending: Adding a Compliance by Computer module

Created: 23 Aug 2013 • Updated: 25 Sep 2013
Language Translations
Ludovic Ferre's picture
+2 2 Votes
Login to vote

References:

[1]  Adding Patch Compliance Trending Capacity to SMP is as Simple as Running a Report Daily :D

[2] Connect downloads: {CWoC} Patch Trending Sitebuilder

Adding compliance by computer trending to your SMP

As you probably have seen here on Connect (if not check [1] and [2] first) we can do pretty graphs for compliance by updates / bulletin by gathering data from a single report [1], and the {CWoC} SiteBuilder [2].

Today we will add similar capabilities to the system, but to trend compliance by computer.

Now this is a very different matter, as we cannot possibly offer the option to list and display compliance by computer. Instead what we'll do is break out the estate by percentage. So we can list the variance on a given percentage value over time, and display the information in an efficient manner, with the current trend and historical max and minimums.

But before we get to the graphs, you'll need to create a SQL report and add the following query to it:

/* 
      COMPLIANCE BY COMPUTER TRENDING
*/
-- PART I: Make sure underlying infrastructure exists and is ready to use
if (exists(select 1 from sys.objects where name = 'PM_TRENDS2_TEMP' and type = 'U'))
begin
	truncate table PM_TRENDS2_TEMP
end
else
begin
CREATE TABLE [dbo].[PM_TRENDS2_TEMP](
	[_ResourceGuid] [uniqueidentifier] NOT NULL,
	[Computer Name] [varchar](250) NOT NULL,
	[Compliance] [numeric](6, 2) NULL,
	[Applicable (Count)] [int] NULL,
	[Installed (Count)] [int] NULL,
	[Not Installed (Count)] [int] NULL,
	[Restart Pending] [varchar](3) NOT NULL,
	[_DistributionStatus] [nvarchar](16) NULL,
	[_OperatingSystem] [nvarchar](128) NULL,
	[_StartDate] [datetime] NULL,
	[_EndDate] [datetime] NULL,
) ON [PRIMARY]
end

if (not exists(select 1 from sys.objects where type = 'U' and name = 'TREND_WindowsCompliance_ByComputer'))
begin
	CREATE TABLE [dbo].[TREND_WindowsCompliance_ByComputer](
		[_Exec_id] [int] NOT NULL,
		[_Exec_time] [datetime] NOT NULL,
		[Percent] int NOT NULL,
		[Computer #] int NOT NULL,
		[% of Total] money NOT NULL,
	) ON [PRIMARY]

	CREATE UNIQUE CLUSTERED INDEX [IX_TREND_WindowsCompliance_ByComputer] ON [dbo].[TREND_WindowsCompliance_ByComputer] 
	(
		[Percent] ASC,
		[_exec_id] ASC
	)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = 
OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

end

-- PART II: Get data into the trending table if no data was captured in the last 23 hours
if (select MAX(_exec_time) from TREND_WindowsCompliance_ByComputer) <  dateadd(hour, -23, getdate()) or (select COUNT(*) from TREND_WindowsCompliance_ByComputer) = 0
begin

-- Get the compliance by update to a "temp" table
insert into PM_TRENDS2_TEMP
exec spPMWindows_ComplianceByComputer
							@OperatingSystem = '%',
							@DistributionStatus = 'active',
							@FilterCollection = '01024956-1000-4cdb-b452-7db0cff541b6',
							@StartDate = '1990-08-21T00:00:00',
							@EndDate = '2020-12-31',
							@pCulture = 'en-gb',
							@TrusteeScope = '{2e1f478a-4986-4223-9d1e-b5920a63ab41}',
							@VendorGuid	= '00000000-0000-0000-0000-000000000000',
							@CategoryGuid = '00000000-0000-0000-0000-000000000000'

declare @id as int
	set @id = (select MAX(_exec_id) from TREND_WindowsCompliance_ByComputer)

declare @total as float
	set @total = (select COUNT(*) from PM_TRENDS2_TEMP)

insert into TREND_WindowsCompliance_ByComputer
select (ISNULL(@id + 1, 1)), GETDATE() as '_Exec_time', CAST(compliance as decimal) as 'Percentile', COUNT(*) as 'Computer #', cast((CAST(count(*) as float) / @total) * 100 as money) as '% of Total'
  from PM_TRENDS2_TEMP
 group by CAST(compliance as decimal)
 order by CAST(compliance as decimal)

end

This is for the data gathering. You will notice that we only collect statistics for 100 entries, so this is even more scalable than the Compliance By Bulletin: it will take 10,000 run for the table to reach 1,000,000 entries.

Now, for the visualisation, a line graph would show the distribution of computers across a selected range, but we can use another Google Chart option: the candlestick.

See for yourself and let us now what you prefer, as the feature will go into version 0.6.8 of the SiteBuilder (out real soon):

Line chart:

 

global_compliance.png

Candlestick chart:

pc-compliance.png

 

Also I have truncated the range to only include data from 75 to 100%, as it contains 94%+ of the estate.

For more on those chart, please see the Google live samples: https://google-developers.appspot.com/chart/interactive/docs/gallery/candlestickchart