diff --git a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql
new file mode 100644
index 00000000..cdda9126
--- /dev/null
+++ b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql
@@ -0,0 +1,803 @@
+/*
+SQLCMD script to generate the required objects to support a centralized Policy-Based Management solution.
+This is the first script to run.
+Set the variables to define the server and database which stores the policy results.
+*/
+:SETVAR ServerName "WIN2012"
+:SETVAR ManagementDatabase "MDW"
+GO
+:CONNECT $(ServerName)
+GO
+
+--Create the specified database if it does not exist
+IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = '$(ManagementDatabase)')
+CREATE DATABASE $(ManagementDatabase)
+GO
+
+--Create a schema to support the EPM framework objects.
+USE $(ManagementDatabase)
+GO
+IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'policy')
+EXEC sys.sp_executesql N'CREATE SCHEMA [policy] AUTHORIZATION [dbo]'
+
+--Start create tables and indexes
+
+--Create the table to store the results from the PowerShell evaluation.
+IF NOT EXISTS(SELECT * FROM sys.objects WHERE type = N'U' AND name = N'PolicyHistory')
+BEGIN
+ CREATE TABLE [policy].[PolicyHistory](
+ [PolicyHistoryID] [int] IDENTITY NOT NULL ,
+ [EvaluatedServer] [nvarchar](50) NULL,
+ [EvaluationDateTime] [datetime] NULL,
+ [EvaluatedPolicy] [nvarchar](128) NULL,
+ [EvaluationResults] [xml] NOT NULL,
+ CONSTRAINT PK_PolicyHistory PRIMARY KEY CLUSTERED (PolicyHistoryID)
+ )
+
+ ALTER TABLE [policy].[PolicyHistory] ADD CONSTRAINT [DF_PolicyHistory_EvaluationDateTime] DEFAULT (GETDATE()) FOR [EvaluationDateTime]
+END
+GO
+IF EXISTS(SELECT * FROM sys.columns WHERE object_id = object_id('policy.policyhistory') AND name = 'PolicyResult')
+ BEGIN
+ ALTER TABLE policy.PolicyHistory
+ DROP COLUMN PolicyResult
+ END
+GO
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluationResults')
+DROP INDEX IX_EvaluationResults ON policy.PolicyHistory
+GO
+CREATE PRIMARY XML INDEX IX_EvaluationResults ON policy.PolicyHistory (EvaluationResults)
+GO
+
+CREATE XML INDEX IX_EvaluationResults_PROPERTY ON policy.PolicyHistory (EvaluationResults)
+USING XML INDEX IX_EvaluationResults
+FOR PROPERTY
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedPolicy')
+DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistory
+GO
+CREATE INDEX IX_EvaluatedPolicy ON policy.PolicyHistory(EvaluatedPolicy)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedServer')
+DROP INDEX IX_EvaluatedServer ON policy.PolicyHistory
+GO
+CREATE INDEX IX_EvaluatedServer ON [policy].[PolicyHistory] ([EvaluatedServer])
+INCLUDE ([PolicyHistoryID],[EvaluationDateTime],[EvaluatedPolicy])
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluationDateTime')
+DROP INDEX IX_EvaluationDateTime ON policy.PolicyHistory
+GO
+CREATE INDEX IX_EvaluationDateTime ON policy.PolicyHistory (EvaluationDateTime)
+GO
+
+--Create the table to store the error information from the failed PowerShell executions.
+IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = N'U' AND name = N'EvaluationErrorHistory')
+BEGIN
+ CREATE TABLE [policy].[EvaluationErrorHistory](
+ [ErrorHistoryID] [int] IDENTITY(1,1) NOT NULL,
+ [EvaluatedServer] [nvarchar](50) NULL,
+ [EvaluationDateTime] [datetime] NULL,
+ [EvaluatedPolicy] [nvarchar](128) NULL,
+ [EvaluationResults] [nvarchar](max) NOT NULL,
+ CONSTRAINT PK_EvaluationErrorHistory PRIMARY KEY CLUSTERED ([ErrorHistoryID] ASC)
+ )
+
+ ALTER TABLE [policy].[EvaluationErrorHistory] ADD CONSTRAINT [DF_EvaluationErrorHistory_EvaluationDateTime] DEFAULT (getdate()) FOR [EvaluationDateTime]
+END
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = N'IX_EvaluationErrorHistoryView')
+DROP INDEX IX_EvaluationErrorHistoryView ON policy.EvaluationErrorHistory
+GO
+CREATE INDEX [IX_EvaluationErrorHistoryView] ON policy.EvaluationErrorHistory ([EvaluatedPolicy] ASC, [EvaluatedServer] ASC, [EvaluationDateTime] DESC)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = N'IX_EvaluationErrorHistoryPurge')
+DROP INDEX IX_EvaluationErrorHistoryPurge ON policy.EvaluationErrorHistory
+GO
+CREATE INDEX [IX_EvaluationErrorHistoryPurge] ON policy.EvaluationErrorHistory ([EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer] ON [policy].[EvaluationErrorHistory]([EvaluatedPolicy], [ErrorHistoryID], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+--Create the table to store the policy result details.
+--This table is loaded with the procedure policy.epm_LoadPolicyHistoryDetail or through the SQL Server SSIS policy package.
+IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND type in (N'U'))
+BEGIN
+ CREATE TABLE [policy].[PolicyHistoryDetail](
+ [PolicyHistoryDetailID] [int] IDENTITY NOT NULL,
+ [PolicyHistoryID] [int] NULL,
+ [EvaluatedServer] [nvarchar](128) NULL,
+ [EvaluationDateTime] [datetime] NULL,
+ [MonthYear] [nvarchar](14) NULL,
+ [EvaluatedPolicy] [nvarchar](128) NULL,
+ [policy_id] [int] NULL,
+ [CategoryName] [nvarchar](128) NULL,
+ [EvaluatedObject] [nvarchar](256) NULL,
+ [PolicyResult] [nvarchar](5) NOT NULL,
+ [ExceptionMessage] [nvarchar](max) NULL,
+ [ResultDetail] [xml] NULL,
+ [PolicyHistorySource] [nvarchar](50) NOT NULL,
+ CONSTRAINT PK_PolicyHistoryDetail PRIMARY KEY CLUSTERED ([PolicyHistoryDetailID])
+ )
+END
+GO
+
+ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT
+ FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY
+ (PolicyHistoryID) REFERENCES policy.PolicyHistory
+ (PolicyHistoryID)
+ ON UPDATE CASCADE
+ ON DELETE CASCADE
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'FK_PolicyHistoryID')
+DROP INDEX FK_PolicyHistoryID ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX FK_PolicyHistoryID ON [policy].[PolicyHistoryDetail] (PolicyHistoryID)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy')
+DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy])
+INCLUDE ([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [MonthYear], [policy_id], [CategoryName], [EvaluatedObject], [PolicyResult])
+GO
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView')
+DROP INDEX IX_PolicyHistoryView ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX [IX_PolicyHistoryView] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy] ASC, [EvaluatedServer] ASC, [EvaluatedObject] ASC, [EvaluationDateTime] DESC, [PolicyResult] ASC, [policy_id] ASC, CategoryName, MonthYear)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView_2')
+DROP INDEX IX_PolicyHistoryView_2 ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX [IX_PolicyHistoryView_2] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy] ASC ,[EvaluatedServer] ASC ,[EvaluationDateTime] ASC)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime')
+DROP INDEX IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX [IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer] ASC, [EvaluatedPolicy] ASC, [EvaluatedObject] ASC, [EvaluationDateTime] ASC)
+INCLUDE ([PolicyResult])
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_MonthYear')
+DROP INDEX IX_EvaluatedPolicy_MonthYear ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX IX_EvaluatedPolicy_MonthYear ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[MonthYear])
+INCLUDE (EvaluationDateTime)
+GO
+
+--CREATE INDEX IX_CategoryName_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([CategoryName],[EvaluatedPolicy])
+--GO
+
+--CREATE INDEX IX_EvaluatedPolicy_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[CategoryName])
+--GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_EvalDateTime_CategoryName')
+DROP INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[EvaluationDateTime],[CategoryName])
+INCLUDE ([PolicyHistoryDetailID],[MonthYear],[PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy]
+GO
+CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer')
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedServer' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_PolicyResult_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([PolicyResult], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_PolicyResult_CategoryName')
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_PolicyResult_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_PolicyResult_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [PolicyResult], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime], [PolicyResult], [PolicyHistoryID], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_PolicyResult]
+GO
+CREATE STATISTICS Stat_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([CategoryName], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy]
+GO
+CREATE STATISTICS Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [PolicyHistoryDetailID], [EvaluatedPolicy])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime]
+GO
+CREATE STATISTICS Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [CategoryName], [PolicyResult], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult]
+GO
+CREATE STATISTICS Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyHistoryDetailID], [CategoryName], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID]
+GO
+CREATE STATISTICS Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [CategoryName], [PolicyResult], [EvaluatedPolicy], [EvaluationDateTime], [PolicyHistoryDetailID])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([CategoryName], [EvaluatedPolicy], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult]
+GO
+CREATE STATISTICS [Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluatedObject], [EvaluationDateTime], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult]
+GO
+CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyHistoryDetailID], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer] ON [policy].[PolicyHistoryDetail]([PolicyResult], [EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([PolicyHistoryDetailID], [PolicyHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID]
+GO
+CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id], [CategoryName], [PolicyHistoryID])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyResult], [EvaluatedServer], [EvaluationDateTime], [PolicyHistoryDetailID], [policy_id], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyResult], [EvaluationDateTime], [PolicyHistoryDetailID], [PolicyHistoryID], [policy_id], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult]
+GO
+CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [CategoryName])
+GO
+
+--Create the function to support server selection.
+--The following function will support nested CMS folders for the EPM Framework.
+--The function must be created in a database ON the CMS server.
+--This database will also store the policy history.
+
+USE $(ManagementDatabase)
+GO
+IF EXISTS(SELECT * FROM sys.objects WHERE name = 'pfn_ServerGroupInstances' AND type = 'TF')
+ DROP FUNCTION policy.pfn_ServerGroupInstances
+GO
+CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128))
+RETURNS TABLE
+AS
+RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS
+ (
+ SELECT parent_id, server_group_id, name
+ FROM msdb.dbo.sysmanagement_shared_server_groups tg
+ WHERE is_system_object = 0
+ AND (tg.name = @server_group_name OR @server_group_name = '')
+ UNION ALL
+ SELECT cg.parent_id, cg.server_group_id, cg.name
+ FROM msdb.dbo.sysmanagement_shared_server_groups cg
+ INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id
+ )
+ SELECT s.server_name, sg.name AS GroupName
+ FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s
+ INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id
+)
+GO
+/*
+CREATE FUNCTION policy.pfn_ServerGroupInstances (@server_group_name NVARCHAR(128))
+RETURNS @ServerGroups TABLE (server_name nvarchar(128), GroupName nvarchar(128))
+AS
+BEGIN
+IF @server_group_name = ''
+ BEGIN
+ INSERT @ServerGroups
+ SELECT s.server_name, ssg.name AS GroupName
+ FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s
+ INNER JOIN msdb.dbo.sysmanagement_shared_server_groups ssg
+ ON s.server_group_id = ssg.server_group_id
+ END
+ ELSE
+ WITH ServerGroups(parent_id, server_group_id, name) AS
+ (
+ SELECT parent_id, server_group_id, name
+ FROM msdb.dbo.sysmanagement_shared_server_groups tg
+ WHERE is_system_object = 0
+ AND (tg.name = @server_group_name OR @server_group_name = '')
+ UNION ALL
+ SELECT cg.parent_id, cg.server_group_id, cg.name
+ FROM msdb.dbo.sysmanagement_shared_server_groups cg
+ INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id
+ )
+ INSERT @ServerGroups
+ SELECT s.server_name, sg.name AS GroupName
+ FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s
+ INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id
+ RETURN
+END
+GO
+*/
+
+--Create the views which are used in the policy reports
+
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]'))
+DROP VIEW [policy].[v_ServerGroups]
+GO
+CREATE VIEW policy.v_ServerGroups AS
+WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue)
+AS
+(SELECT parent_id
+ , server_group_id
+ , CAST('ALL' AS varchar(500))
+ , 1 AS GroupLevel
+ , CAST('ALL' AS varchar(500)) AS Sort
+ , CAST('' AS varchar(255)) AS GroupValue
+FROM msdb.dbo.sysmanagement_shared_server_groups tg
+WHERE server_type = 0 AND parent_id IS NULL
+UNION ALL
+SELECT cg.parent_id
+ , cg.server_group_id
+ , CAST(REPLICATE(' ', GroupLevel) + cg.name AS varchar(500))
+ , GroupLevel + 1
+ , CAST(Sort + ' | ' + cg.name AS varchar(500)) AS Sort
+ , CAST(name AS varchar(255)) AS GroupValue
+FROM msdb.dbo.sysmanagement_shared_server_groups cg
+INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id)
+
+SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue
+FROM ServerGroups
+GO
+
+
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]'))
+DROP VIEW [policy].[v_PolicyHistory]
+GO
+CREATE VIEW [policy].[v_PolicyHistory]
+AS
+--The policy.v_PolicyHistory view will return all results
+--and identify the policy evaluation result AS PASS, FAIL, or
+--ERROR. The ERROR result indicates that the policy was not able
+--to evaluate against an object.
+SELECT PH.PolicyHistoryID
+ , PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , PH.PolicyResult
+ , PH.ExceptionMessage
+ , PH.ResultDetail
+ , PH.EvaluatedObject
+ , PH.policy_id
+ , PH.CategoryName
+ , PH.MonthYear
+FROM policy.PolicyHistoryDetail PH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+--INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+AND PH.EvaluatedPolicy NOT IN (SELECT spp.name
+ FROM msdb.dbo.syspolicy_policies spp
+ INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id
+ WHERE spc.name = 'Disabled')
+GO
+
+
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]'))
+DROP VIEW policy.v_PolicyHistory_Rank
+GO
+CREATE VIEW policy.v_PolicyHistory_Rank
+AS
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ResultDetail
+ , ExceptionMessage
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , DENSE_RANK() OVER (
+ PARTITION BY EvaluatedPolicy, EvaluatedServer, EvaluatedObject
+ ORDER BY EvaluationDateTime DESC) AS EvaluationOrderDesc
+FROM policy.v_PolicyHistory VPH
+GO
+
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]'))
+DROP VIEW policy.v_PolicyHistory_LastEvaluation
+GO
+CREATE VIEW policy.v_PolicyHistory_LastEvaluation
+AS
+--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object.
+--This view requires the v_PolicyHistory view exist.
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ResultDetail
+ , ExceptionMessage
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , EvaluationOrderDesc
+FROM policy.v_PolicyHistory_Rank VPH
+WHERE EvaluationOrderDesc = 1
+AND NOT EXISTS(
+ SELECT *
+ FROM policy.PolicyHistoryDetail PH
+ WHERE PH.EvaluatedPolicy = VPH.EvaluatedPolicy
+ AND PH.EvaluatedServer = VPH.EvaluatedServer
+ AND PH.EvaluationDateTime > VPH.EvaluationDateTime)
+GO
+
+--Create a view to return all errors.
+--Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table.
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]'))
+DROP VIEW policy.v_EvaluationErrorHistory
+GO
+CREATE VIEW policy.v_EvaluationErrorHistory
+AS
+SELECT EEH.ErrorHistoryID
+ , EEH.EvaluatedServer
+ , EEH.EvaluationDateTime
+ , EEH.EvaluatedPolicy
+ , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0
+ THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1)
+ ELSE EEH.EvaluatedServer
+ END
+ AS EvaluatedObject
+ , EEH.EvaluationResults
+ , p.policy_id
+ , c.name AS CategoryName
+ , DATENAME(month, EvaluationDateTime) + ' ' + datename(year, EvaluationDateTime) AS MonthYear
+ , 'ERROR' AS PolicyResult
+FROM policy.EvaluationErrorHistory AS EEH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = EEH.EvaluatedPolicy
+INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+UNION ALL
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , RIGHT(EvaluatedObject, CHARINDEX('\', REVERSE(EvaluatedObject)) - 1)
+ , ExceptionMessage
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyResult
+FROM policy.v_PolicyHistory_LastEvaluation
+WHERE PolicyResult = 'ERROR'
+GO
+
+--Create a view to return the last error for each policy against
+--an instance.
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]'))
+DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation
+GO
+CREATE VIEW policy.v_EvaluationErrorHistory_LastEvaluation
+AS
+SELECT ErrorHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , Policy_ID
+ , EvaluatedObject
+ , EvaluationResults
+ , CategoryName
+ , MonthYear
+ , PolicyResult
+ , DENSE_RANK() OVER (
+ PARTITION BY EvaluatedServer, EvaluatedPolicy
+ ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc
+FROM policy.v_EvaluationErrorHistory EEH
+WHERE NOT EXISTS (
+ SELECT *
+ FROM policy.PolicyHistoryDetail PH
+ WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy
+ AND PH.EvaluatedServer = EEH.EvaluatedServer
+ AND PH.EvaluationDateTime > EEH.EvaluationDateTime)
+GO
+
+
+--Create the procedure epm_LoadPolicyHistoryDetail will load the details from the XML documents in PolicyHistory to the PolicyHistoryDetails table.
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[epm_LoadPolicyHistoryDetail]') AND type in (N'P', N'PC'))
+DROP PROCEDURE [policy].[epm_LoadPolicyHistoryDetail]
+GO
+CREATE PROCEDURE policy.epm_LoadPolicyHistoryDetail @PolicyCategoryFilter VARCHAR(255)
+AS
+SET NOCOUNT ON;
+
+IF @PolicyCategoryFilter = ''
+SET @PolicyCategoryFilter = NULL
+
+DECLARE @sqlcmd VARCHAR(8000), @Text NVARCHAR(255), @Remain int
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+--Insert the evaluation results.
+SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF)
+,cteEval AS (SELECT PH.PolicyHistoryID
+ , PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') AS EvaluatedObject
+ , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = ''''
+ THEN ''FAIL''
+ WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> ''''
+ THEN ''ERROR''
+ ELSE ''PASS''
+ END) AS PolicyResult
+ , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage
+ , CAST(Expr.value(''(../DMF:ResultDetail)[1]'', ''nvarchar(max)'')AS XML) AS ResultDetail
+ , p.policy_id
+ , c.name AS CategoryName
+ , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear
+ , ''PowerShell EPM Framework'' AS PolicyHistorySource
+ , DENSE_RANK() OVER (PARTITION BY Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') ORDER BY Expr) AS [TopRank]
+ FROM policy.PolicyHistory AS PH
+ INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+ INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+ CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //TargetQueryExpression''
+ ) AS Res(Expr)
+ WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NOT NULL)
+ ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + '
+ AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:EvaluationDetail'') = 1)
+INSERT INTO policy.PolicyHistoryDetail (
+ PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ExceptionMessage
+ , ResultDetail
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyHistorySource
+)
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ExceptionMessage
+ , ResultDetail
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyHistorySource
+FROM cteEval
+WHERE cteEval.[TopRank] = 1'; -- Remove duplicates
+
+EXEC (@sqlcmd);
+
+SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting no target data integration'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+--Insert the policies that evaluated with no target
+SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF)
+INSERT INTO policy.PolicyHistoryDetail (
+ PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ExceptionMessage
+ , ResultDetail
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyHistorySource
+ )
+SELECT PH.PolicyHistoryID
+ , PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , ''No Targets Found'' AS EvaluatedObject
+ , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = ''''
+ THEN ''FAIL''
+ WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> ''''
+ THEN ''ERROR''
+ ELSE ''PASS''
+ END) AS PolicyResult
+ , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage
+ , NULL AS ResultDetail
+ , p.policy_id
+ , c.name AS CategoryName
+ , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear
+ , ''PowerShell EPM Framework''
+FROM policy.PolicyHistory AS PH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:ServerInstance''
+ ) AS Res(Expr)
+WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NULL)
+ ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + '
+ AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:EvaluationDetail'') = 0
+ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates
+
+EXEC (@sqlcmd);
+
+SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting errors data integration'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+--Insert the error records
+SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF)
+INSERT INTO policy.EvaluationErrorHistory(
+ EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluationResults
+ )
+SELECT PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage
+FROM policy.PolicyHistory AS PH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:ServerInstance''
+ ) AS Res(Expr)
+WHERE PH.PolicyHistoryID NOT IN (SELECT DISTINCT PH.PolicyHistoryID FROM policy.EvaluationErrorHistory AS PHD WITH(NOLOCK) INNER JOIN policy.PolicyHistory AS PH WITH(NOLOCK) ON PH.EvaluatedServer = PHD.EvaluatedServer AND PH.EvaluationDateTime = PHD.EvaluationDateTime AND PH.EvaluatedPolicy = PHD.EvaluatedPolicy)
+ ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + '
+ AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> ''''
+ --AND Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE''
+ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates
+
+EXEC (@sqlcmd);
+
+SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Finished data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+GO
+
+USE $(ManagementDatabase)
+GO
+EXEC policy.epm_LoadPolicyHistoryDetail NULL
+GO
+
+USE $(ManagementDatabase)
+GO
+IF (SELECT SERVERPROPERTY('EditionID')) IN (1804890536, 1872460670, 610778273, -2117995310) -- Supports Enterprise only features
+BEGIN
+ ALTER INDEX [PK_EvaluationErrorHistory] ON [policy].[EvaluationErrorHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
+ ALTER INDEX [PK_PolicyHistoryDetail] ON [policy].[PolicyHistoryDetail] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
+ ALTER INDEX [PK_PolicyHistory] ON [policy].[PolicyHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
+END;
+GO
+
diff --git a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql
new file mode 100644
index 00000000..7035124d
--- /dev/null
+++ b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql
@@ -0,0 +1,679 @@
+/*
+SQLCMD script to upgrade changed objects from previous deployment of a centralized Policy-Based Management solution.
+Set the variables to define the server and database which stores the policy results.
+*/
+:SETVAR ServerName "WIN2012"
+:SETVAR ManagementDatabase "MDW"
+GO
+:CONNECT $(ServerName)
+GO
+
+--Drop old indexes and stats
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer')
+DROP INDEX IX_EvaluatedServer ON policy.PolicyHistoryDetail
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer]
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy]
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName')
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName]
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult]
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_Policy_Server_Category' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_Policy_Server_Category]
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_Policy_Result_Server')
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_Policy_Result_Server]
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_Covered' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_Covered]
+GO
+
+--Start create new indexes and stats
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluationDateTime')
+DROP INDEX IX_EvaluationDateTime ON policy.PolicyHistory
+GO
+CREATE INDEX IX_EvaluationDateTime ON policy.PolicyHistory (EvaluationDateTime)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = N'IX_EvaluationErrorHistoryPurge')
+DROP INDEX IX_EvaluationErrorHistoryPurge ON policy.EvaluationErrorHistory
+GO
+CREATE INDEX [IX_EvaluationErrorHistoryPurge] ON policy.EvaluationErrorHistory ([EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_ErrorHistoryID_EvaluatedServer] ON [policy].[EvaluationErrorHistory]([EvaluatedPolicy], [ErrorHistoryID], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[EvaluationErrorHistory]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[EvaluationErrorHistory].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_ErrorHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[EvaluationErrorHistory]([ErrorHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT
+ FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY
+ (PolicyHistoryID) REFERENCES policy.PolicyHistory
+ (PolicyHistoryID)
+ ON UPDATE CASCADE
+ ON DELETE CASCADE
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'FK_PolicyHistoryID')
+DROP INDEX FK_PolicyHistoryID ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX FK_PolicyHistoryID ON [policy].[PolicyHistoryDetail] (PolicyHistoryID)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView_2')
+DROP INDEX IX_PolicyHistoryView_2 ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX [IX_PolicyHistoryView_2] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy] ASC ,[EvaluatedServer] ASC ,[EvaluationDateTime] ASC)
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime')
+DROP INDEX IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX [IX_EvaluatedServer_EvaluatedPolicy_EvaluatedObject_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer] ASC, [EvaluatedPolicy] ASC, [EvaluatedObject] ASC, [EvaluationDateTime] ASC)
+INCLUDE ([PolicyResult])
+GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_MonthYear')
+DROP INDEX IX_EvaluatedPolicy_MonthYear ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX IX_EvaluatedPolicy_MonthYear ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[MonthYear])
+INCLUDE (EvaluationDateTime)
+GO
+
+--CREATE INDEX IX_CategoryName_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([CategoryName],[EvaluatedPolicy])
+--GO
+
+--CREATE INDEX IX_EvaluatedPolicy_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[CategoryName])
+--GO
+
+IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy_EvalDateTime_CategoryName')
+DROP INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON policy.PolicyHistoryDetail
+GO
+CREATE INDEX IX_EvaluatedPolicy_EvalDateTime_CategoryName ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy],[EvaluationDateTime],[CategoryName])
+INCLUDE ([PolicyHistoryDetailID],[MonthYear],[PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail] ([EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy]
+GO
+CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer')
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedServer' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_PolicyResult_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([PolicyResult], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_PolicyResult_CategoryName')
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_PolicyResult_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_PolicyResult_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [PolicyResult], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyResult_PolicyHistoryID_CategoryName] ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime], [PolicyResult], [PolicyHistoryID], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_PolicyResult]
+GO
+CREATE STATISTICS Stat_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([CategoryName], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy]
+GO
+CREATE STATISTICS Stat_EvaluatedServer_PolicyHistoryDetailID_EvaluatedPolicy ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [PolicyHistoryDetailID], [EvaluatedPolicy])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime]
+GO
+CREATE STATISTICS Stat_EvaluatedPolicy_CategoryName_PolicyResult_EvaluationDateTime ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [CategoryName], [PolicyResult], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult]
+GO
+CREATE STATISTICS Stat_EvaluatedPolicy_EvaluatedServer_PolicyHistoryDetailID_CategoryName_PolicyResult ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyHistoryDetailID], [CategoryName], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID]
+GO
+CREATE STATISTICS Stat_EvaluatedServer_CategoryName_PolicyResult_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [CategoryName], [PolicyResult], [EvaluatedPolicy], [EvaluationDateTime], [PolicyHistoryDetailID])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_CategoryName_EvaluatedPolicy_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([CategoryName], [EvaluatedPolicy], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult]
+GO
+CREATE STATISTICS [Stat_EvaluatedServer_EvaluatedServer_EvaluationDateTime_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluatedObject], [EvaluationDateTime], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_1_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult]
+GO
+CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyHistoryDetailID_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyHistoryDetailID], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer]
+GO
+CREATE STATISTICS [Stat_PolicyResult_EvaluatedPolicy_PolicyHistoryDetailID_EvaluatedServer] ON [policy].[PolicyHistoryDetail]([PolicyResult], [EvaluatedPolicy], [PolicyHistoryDetailID], [EvaluatedServer])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryDetailID_PolicyHistoryID_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime] ON [policy].[PolicyHistoryDetail]([PolicyHistoryDetailID], [PolicyHistoryID], [EvaluatedPolicy], [EvaluatedServer], [EvaluationDateTime])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID]
+GO
+CREATE STATISTICS [Stat_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_policy_id_CategoryName_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [policy_id], [CategoryName], [PolicyHistoryID])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedPolicy_EvaluatedServer_EvaluationDateTime_PolicyHistoryDetailID_policy_id_CategoryName] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [PolicyResult], [EvaluatedServer], [EvaluationDateTime], [PolicyHistoryDetailID], [policy_id], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID]
+GO
+CREATE STATISTICS [Stat_EvaluatedPolicy_EvaluatedServer_EvaluatedPolicy_EvaluationDateTime_PolicyHistoryDetailID_PolicyHistoryID] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [EvaluatedServer], [PolicyResult], [EvaluationDateTime], [PolicyHistoryDetailID], [PolicyHistoryID], [policy_id], [CategoryName])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult]
+GO
+CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy_PolicyResult] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy], [PolicyResult])
+GO
+
+IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName' )
+DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName]
+GO
+CREATE STATISTICS [Stat_PolicyHistoryID_EvaluatedServer_EvaluationDateTime_EvaluatedPolicy_CategoryName] ON [policy].[PolicyHistoryDetail]([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [EvaluatedPolicy], [CategoryName])
+GO
+
+--Update the function to support server selection.
+--The following function will support nested CMS folders for the EPM Framework.
+--The function must be created in a database ON the CMS server.
+--This database will also store the policy history.
+
+USE $(ManagementDatabase)
+GO
+IF EXISTS(SELECT * FROM sys.objects WHERE name = 'pfn_ServerGroupInstances' AND type = 'TF')
+ DROP FUNCTION policy.pfn_ServerGroupInstances
+GO
+CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128))
+RETURNS TABLE
+AS
+RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS
+ (
+ SELECT parent_id, server_group_id, name
+ FROM msdb.dbo.sysmanagement_shared_server_groups tg
+ WHERE is_system_object = 0
+ AND (tg.name = @server_group_name OR @server_group_name = '')
+ UNION ALL
+ SELECT cg.parent_id, cg.server_group_id, cg.name
+ FROM msdb.dbo.sysmanagement_shared_server_groups cg
+ INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id
+ )
+ SELECT s.server_name, sg.name AS GroupName
+ FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s
+ INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id
+)
+GO
+
+--Update the views which are used in the policy reports
+
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]'))
+DROP VIEW [policy].[v_ServerGroups]
+GO
+CREATE VIEW policy.v_ServerGroups AS
+WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue)
+AS
+(SELECT parent_id
+ , server_group_id
+ , CAST('ALL' AS varchar(500))
+ , 1 AS GroupLevel
+ , CAST('ALL' AS varchar(500)) AS Sort
+ , CAST('' AS varchar(255)) AS GroupValue
+FROM msdb.dbo.sysmanagement_shared_server_groups tg
+WHERE server_type = 0 AND parent_id IS NULL
+UNION ALL
+SELECT cg.parent_id
+ , cg.server_group_id
+ , CAST(REPLICATE(' ', GroupLevel) + cg.name AS varchar(500))
+ , GroupLevel + 1
+ , CAST(Sort + ' | ' + cg.name AS varchar(500)) AS Sort
+ , CAST(name AS varchar(255)) AS GroupValue
+FROM msdb.dbo.sysmanagement_shared_server_groups cg
+INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id)
+
+SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue
+FROM ServerGroups
+GO
+
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]'))
+DROP VIEW [policy].[v_PolicyHistory]
+GO
+CREATE VIEW [policy].[v_PolicyHistory]
+AS
+--The policy.v_PolicyHistory view will return all results
+--and identify the policy evaluation result AS PASS, FAIL, or
+--ERROR. The ERROR result indicates that the policy was not able
+--to evaluate against an object.
+SELECT PH.PolicyHistoryID
+ , PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , PH.PolicyResult
+ , PH.ExceptionMessage
+ , PH.ResultDetail
+ , PH.EvaluatedObject
+ , PH.policy_id
+ , PH.CategoryName
+ , PH.MonthYear
+FROM policy.PolicyHistoryDetail PH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+--INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+AND PH.EvaluatedPolicy NOT IN (SELECT spp.name
+ FROM msdb.dbo.syspolicy_policies spp
+ INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id
+ WHERE spc.name = 'Disabled')
+GO
+
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]'))
+DROP VIEW policy.v_PolicyHistory_Rank
+GO
+CREATE VIEW policy.v_PolicyHistory_Rank
+AS
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ResultDetail
+ , ExceptionMessage
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , DENSE_RANK() OVER (
+ PARTITION BY EvaluatedPolicy, EvaluatedServer, EvaluatedObject
+ ORDER BY EvaluationDateTime DESC) AS EvaluationOrderDesc
+FROM policy.v_PolicyHistory VPH
+GO
+
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]'))
+DROP VIEW policy.v_PolicyHistory_LastEvaluation
+GO
+CREATE VIEW policy.v_PolicyHistory_LastEvaluation
+AS
+--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object.
+--This view requires the v_PolicyHistory view exist.
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ResultDetail
+ , ExceptionMessage
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , EvaluationOrderDesc
+FROM policy.v_PolicyHistory_Rank VPH
+WHERE EvaluationOrderDesc = 1
+AND NOT EXISTS(
+ SELECT *
+ FROM policy.PolicyHistoryDetail PH
+ WHERE PH.EvaluatedPolicy = VPH.EvaluatedPolicy
+ AND PH.EvaluatedServer = VPH.EvaluatedServer
+ AND PH.EvaluationDateTime > VPH.EvaluationDateTime)
+GO
+
+--Create a view to return all errors.
+--Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table.
+--Drop the view if it exists.
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]'))
+DROP VIEW policy.v_EvaluationErrorHistory
+GO
+CREATE VIEW policy.v_EvaluationErrorHistory
+AS
+SELECT EEH.ErrorHistoryID
+ , EEH.EvaluatedServer
+ , EEH.EvaluationDateTime
+ , EEH.EvaluatedPolicy
+ , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0
+ THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1)
+ ELSE EEH.EvaluatedServer
+ END
+ AS EvaluatedObject
+ , EEH.EvaluationResults
+ , p.policy_id
+ , c.name AS CategoryName
+ , DATENAME(month, EvaluationDateTime) + ' ' + datename(year, EvaluationDateTime) AS MonthYear
+ , 'ERROR' AS PolicyResult
+FROM policy.EvaluationErrorHistory AS EEH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = EEH.EvaluatedPolicy
+INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+UNION ALL
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , RIGHT(EvaluatedObject, CHARINDEX('\', REVERSE(EvaluatedObject)) - 1)
+ , ExceptionMessage
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyResult
+FROM policy.v_PolicyHistory_LastEvaluation
+WHERE PolicyResult = 'ERROR'
+GO
+
+IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]'))
+DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation
+GO
+CREATE VIEW policy.v_EvaluationErrorHistory_LastEvaluation
+AS
+SELECT ErrorHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , Policy_ID
+ , EvaluatedObject
+ , EvaluationResults
+ , CategoryName
+ , MonthYear
+ , PolicyResult
+ , DENSE_RANK() OVER (
+ PARTITION BY EvaluatedServer, EvaluatedPolicy
+ ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc
+FROM policy.v_EvaluationErrorHistory EEH
+WHERE NOT EXISTS (
+ SELECT *
+ FROM policy.PolicyHistoryDetail PH
+ WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy
+ AND PH.EvaluatedServer = EEH.EvaluatedServer
+ AND PH.EvaluationDateTime > EEH.EvaluationDateTime)
+GO
+
+--Update the procedure epm_LoadPolicyHistoryDetail will load the details from the XML documents in PolicyHistory to the PolicyHistoryDetails table.
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[epm_LoadPolicyHistoryDetail]') AND type in (N'P', N'PC'))
+DROP PROCEDURE [policy].[epm_LoadPolicyHistoryDetail]
+GO
+CREATE PROCEDURE policy.epm_LoadPolicyHistoryDetail @PolicyCategoryFilter VARCHAR(255)
+AS
+SET NOCOUNT ON;
+
+IF @PolicyCategoryFilter = ''
+SET @PolicyCategoryFilter = NULL
+
+DECLARE @sqlcmd VARCHAR(8000), @Text NVARCHAR(255), @Remain int
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+--Insert the evaluation results.
+SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF)
+,cteEval AS (SELECT PH.PolicyHistoryID
+ , PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') AS EvaluatedObject
+ , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = ''''
+ THEN ''FAIL''
+ WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> ''''
+ THEN ''ERROR''
+ ELSE ''PASS''
+ END) AS PolicyResult
+ , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage
+ , CAST(Expr.value(''(../DMF:ResultDetail)[1]'', ''nvarchar(max)'')AS XML) AS ResultDetail
+ , p.policy_id
+ , c.name AS CategoryName
+ , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear
+ , ''PowerShell EPM Framework'' AS PolicyHistorySource
+ , DENSE_RANK() OVER (PARTITION BY Res.Expr.value(''(../DMF:TargetQueryExpression)[1]'', ''nvarchar(150)'') ORDER BY Expr) AS [TopRank]
+ FROM policy.PolicyHistory AS PH
+ INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+ INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+ CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //TargetQueryExpression''
+ ) AS Res(Expr)
+ WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NOT NULL)
+ ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + '
+ AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:EvaluationDetail'') = 1)
+INSERT INTO policy.PolicyHistoryDetail (
+ PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ExceptionMessage
+ , ResultDetail
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyHistorySource
+)
+SELECT PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ExceptionMessage
+ , ResultDetail
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyHistorySource
+FROM cteEval
+WHERE cteEval.[TopRank] = 1'; -- Remove duplicates
+
+EXEC (@sqlcmd);
+
+SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting no target data integration'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+--Insert the policies that evaluated with no target
+SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF)
+INSERT INTO policy.PolicyHistoryDetail (
+ PolicyHistoryID
+ , EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluatedObject
+ , PolicyResult
+ , ExceptionMessage
+ , ResultDetail
+ , policy_id
+ , CategoryName
+ , MonthYear
+ , PolicyHistorySource
+ )
+SELECT PH.PolicyHistoryID
+ , PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , ''No Targets Found'' AS EvaluatedObject
+ , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = ''''
+ THEN ''FAIL''
+ WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> ''''
+ THEN ''ERROR''
+ ELSE ''PASS''
+ END) AS PolicyResult
+ , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage
+ , NULL AS ResultDetail
+ , p.policy_id
+ , c.name AS CategoryName
+ , datename(month, EvaluationDateTime) + '' '' + datename(year, EvaluationDateTime) AS MonthYear
+ , ''PowerShell EPM Framework''
+FROM policy.PolicyHistory AS PH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:ServerInstance''
+ ) AS Res(Expr)
+WHERE NOT EXISTS (SELECT DISTINCT PHD.PolicyHistoryID FROM policy.PolicyHistoryDetail PHD WITH(NOLOCK) WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID AND PHD.ResultDetail IS NULL)
+ ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + '
+ AND EvaluationResults.exist(''declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:EvaluationDetail'') = 0
+ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates
+
+EXEC (@sqlcmd);
+
+SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Starting errors data integration'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+--Insert the error records
+SELECT @sqlcmd = ';WITH XMLNAMESPACES (''http://schemas.microsoft.com/sqlserver/DMF/2007/08'' AS DMF)
+INSERT INTO policy.EvaluationErrorHistory(
+ EvaluatedServer
+ , EvaluationDateTime
+ , EvaluatedPolicy
+ , EvaluationResults
+ )
+SELECT PH.EvaluatedServer
+ , PH.EvaluationDateTime
+ , PH.EvaluatedPolicy
+ , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage
+FROM policy.PolicyHistory AS PH
+INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy
+INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+CROSS APPLY EvaluationResults.nodes(''declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08";
+ //DMF:ServerInstance''
+ ) AS Res(Expr)
+WHERE PH.PolicyHistoryID NOT IN (SELECT DISTINCT PH.PolicyHistoryID FROM policy.EvaluationErrorHistory AS PHD WITH(NOLOCK) INNER JOIN policy.PolicyHistory AS PH WITH(NOLOCK) ON PH.EvaluatedServer = PHD.EvaluatedServer AND PH.EvaluationDateTime = PHD.EvaluationDateTime AND PH.EvaluatedPolicy = PHD.EvaluatedPolicy)
+ ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN '' ELSE 'AND c.name = ''' + @PolicyCategoryFilter + '''' END + '
+ AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') <> ''''
+ --AND Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'') = ''FALSE''
+ORDER BY DENSE_RANK() OVER (ORDER BY Expr);' -- Remove duplicates
+
+EXEC (@sqlcmd);
+
+SELECT @Text = CONVERT(NVARCHAR, GETDATE(), 9) + ' |- ' + CONVERT(NVARCHAR, @@ROWCOUNT) + ' rows inserted...'
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+
+SELECT @Text = CONVERT(varchar, GETDATE(), 9) + ' - Finished data integration for ' + CASE WHEN @PolicyCategoryFilter IS NULL THEN 'ALL categories' ELSE 'Category ' + @PolicyCategoryFilter END
+RAISERROR (@Text, 10, 1) WITH NOWAIT;
+GO
+
+USE $(ManagementDatabase)
+GO
+EXEC policy.epm_LoadPolicyHistoryDetail NULL
+GO
+
+USE $(ManagementDatabase)
+GO
+IF (SELECT SERVERPROPERTY('EditionID')) IN (1804890536, 1872460670, 610778273, -2117995310) -- Supports Enterprise only features
+BEGIN
+ ALTER INDEX [PK_EvaluationErrorHistory] ON [policy].[EvaluationErrorHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
+ ALTER INDEX [PK_PolicyHistoryDetail] ON [policy].[PolicyHistoryDetail] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
+ ALTER INDEX [PK_PolicyHistory] ON [policy].[PolicyHistory] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
+END;
+GO
+
diff --git a/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 b/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1
new file mode 100644
index 00000000..cc0f1af8
--- /dev/null
+++ b/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1
@@ -0,0 +1,130 @@
+# Evaluate specific Policies against a Server List
+# Uses the Invoke-PolicyEvaluation Cmdlet
+
+#SAMPLE: #.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "DEV" -PolicyCategoryFilter "Name Pattern" –EvalMode “Check”
+
+<#
+Run Powershell ISE as Admin
+
+https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-ps-module
+
+#https://www.powershellgallery.com/packages/PowerShellGet/
+Install-Module -Name PowerShellGet -Force
+
+#https://www.powershellgallery.com/packages/SqlServer/
+Install-Module -Name SqlServer -Force -AllowClobber
+
+#>
+
+param([string]$ConfigurationGroup=$(Throw `
+"Parameter missing: -ConfigurationGroup ConfigGroup"),`
+[string]$PolicyCategoryFilter=$(Throw "Parameter missing: `
+-PolicyCategoryFilter Category"), `
+[string]$EvalMode=$(Throw "Parameter missing: -EvalMode EvalMode"))
+
+Remove-Module SQLPS -Force -ErrorAction SilentlyContinue
+Import-Module SqlServer -DisableNameChecking
+
+# Parameter -ConfigurationGroup specifies the
+# Central Management Server group to evaluate
+# Parameter -PolicyCategoryFilter specifies the
+# category of policies to evaluate
+# Parameter -EvalMode accepts "Check" to report policy
+# results, "Configure" to reconfigure any violations
+
+# Declare variables to define the central warehouse
+# in which to write the output, store the policies
+$CentralManagementServer = "Win2012"
+$HistoryDatabase = "MDW"
+# Define the location to write the results of the policy evaluation
+$ResultDir = "E:\Results\"
+# End of variables
+
+#Function to insert policy evaluation results into SQL Server - table policy.PolicyHistory
+function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults)
+{
+ &{
+ $sqlQueryText = "INSERT INTO policy.PolicyHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResults')"
+ Invoke-Sqlcmd -ServerInstance $sqlServerVariable -Database $sqlDatabaseVariable -Query $sqlQueryText -ErrorAction Stop
+ }
+ trap
+ {
+ $ExceptionText = $_.Exception.Message -replace "'", ""
+ }
+}
+
+#Function to insert policy evaluation errors into SQL Server - table policy.EvaluationErrorHistory
+function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape)
+{
+ &{
+ $sqlQueryText = "INSERT INTO policy.EvaluationErrorHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResultsEscape')"
+ Invoke-Sqlcmd -ServerInstance $sqlServerVariable -Database $sqlDatabaseVariable -Query $sqlQueryText -ErrorAction Stop
+ }
+ trap
+ {
+ $ExceptionText = $_.Exception.Message -replace "'", ""
+ }
+}
+
+#Function to delete files from this policy only
+function PolicyFileDelete($File)
+{
+ # Delete evaluation files in the directory.
+ Remove-Item -Path $File
+ # ugly but moves on...
+ trap
+ {
+ continue;
+ }
+}
+
+# Connection to the policy store
+$conn = new-object Microsoft.SQlServer.Management.Sdk.Sfc.SqlStoreConnection("server=$CentralManagementServer;Trusted_Connection=true");
+$PolicyStore = new-object Microsoft.SqlServer.Management.DMF.PolicyStore($conn);
+
+# Create recordset of servers to evaluate
+$sconn = new-object System.Data.SqlClient.SqlConnection("server=$CentralManagementServer;Trusted_Connection=true");
+$q = "SELECT DISTINCT server_name FROM $HistoryDatabase.[policy].[pfn_ServerGroupInstances]('$ConfigurationGroup');"
+
+$sconn.Open()
+$cmd = new-object System.Data.SqlClient.SqlCommand ($q, $sconn);
+$cmd.CommandTimeout = 0;
+$dr = $cmd.ExecuteReader();
+
+# Loop through the servers and then loop through
+# the policies. For each server and policy,
+# call cmdlet to evaluate policy on server and delete xml file afterwards
+
+while ($dr.Read()) {
+ $ServerName = $dr.GetValue(0);
+ foreach ($Policy in $PolicyStore.Policies)
+ {
+ if (($Policy.PolicyCategory -eq $PolicyCategoryFilter)-or ($PolicyCategoryFilter -eq ""))
+ {
+ &{
+ $OutputFile = $ResultDir + ("{0}_{1}.xml" -f (Encode-SqlName $ServerName ), ($Policy.Name));
+ Invoke-PolicyEvaluation -Policy $Policy -TargetServerName $ServerName -AdHocPolicyEvaluationMode $EvalMode -OutputXML > $OutputFile;
+ $PolicyResult = Get-Content $OutputFile -encoding UTF8;
+ $PolicyResult = $PolicyResult -replace "'", ""
+ PolicyHistoryInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $PolicyResult;
+ $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name));
+ PolicyFileDelete $File;
+ }
+ trap [Exception]
+ {
+ $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name));
+ PolicyFileDelete $File;
+ $ExceptionText = $_.Exception.Message -replace "'", ""
+ $ExceptionMessage = $_.Exception.GetType().FullName + ", " + $ExceptionText
+ PolicyErrorInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $ExceptionMessage;
+ continue;
+ }
+ }
+ }
+ }
+
+$dr.Close()
+$sconn.Close()
+
+#Shred the XML results to PolicyHistoryDetails
+Invoke-Sqlcmd -ServerInstance $CentralManagementServer -Database $HistoryDatabase -Query "EXEC policy.epm_LoadPolicyHistoryDetail `$(PolicyCategory)" -Variable "PolicyCategory='${PolicyCategoryFilter}'" -QueryTimeout 65535 -Verbose -ErrorAction Stop
diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln
new file mode 100644
index 00000000..503642c9
--- /dev/null
+++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{F14B399A-7131-4C87-9E4B-1186C45EF12D}") = "PolicyReports", "PolicyReports.rptproj", "{E0F65769-8BEA-4BFD-B715-44519AF1CF80}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ DebugLocal|Default = DebugLocal|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Debug|Default.ActiveCfg = Debug
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Debug|Default.Build.0 = DebugLocal
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Debug|Default.Deploy.0 = DebugLocal
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.DebugLocal|Default.ActiveCfg = DebugLocal
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.DebugLocal|Default.Build.0 = DebugLocal
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.DebugLocal|Default.Deploy.0 = DebugLocal
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Release|Default.ActiveCfg = Release
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Release|Default.Build.0 = Release
+ {E0F65769-8BEA-4BFD-B715-44519AF1CF80}.Release|Default.Deploy.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln
new file mode 100644
index 00000000..cc6d9236
--- /dev/null
+++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports.v11.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{F14B399A-7131-4C87-9E4B-1186C45EF12D}") = "PolicyReports", "PolicyReports\PolicyReports.rptproj", "{30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Default = Debug|Default
+ DebugLocal|Default = DebugLocal|Default
+ Release|Default = Release|Default
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Debug|Default.ActiveCfg = Debug
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Debug|Default.Build.0 = DebugLocal
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Debug|Default.Deploy.0 = DebugLocal
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.DebugLocal|Default.ActiveCfg = DebugLocal
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.DebugLocal|Default.Build.0 = DebugLocal
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Release|Default.ActiveCfg = Release
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Release|Default.Build.0 = Release
+ {30FA2CD3-F4E3-4EA6-85A7-07AF4D922933}.Release|Default.Deploy.0 = Release
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds
new file mode 100644
index 00000000..75ad7949
--- /dev/null
+++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDW.rds
@@ -0,0 +1,9 @@
+
+
+
+ SQL
+ Data Source=localhost;Initial Catalog=MDW
+ true
+
+ be53e7b6-9fc8-452b-ac5e-151bec780bf7
+
\ No newline at end of file
diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl
new file mode 100644
index 00000000..7becb2c0
--- /dev/null
+++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl
@@ -0,0 +1,3286 @@
+
+
+ Overview of current state of enterprise SQL Server instances. Launch detail reports through defined actions in the report.
+ 0
+
+
+ PolicyDW
+ None
+ 9d3c6ede-25bb-4220-87c8-3455b1167deb
+
+
+
+
+
+ ReportHistory
+
+
+ =Parameters!EvaluatedPolicy.Value
+ true
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!ServerGroupName.Value
+
+
+
+
+
+ EvaluatedServer
+ System.String
+
+
+ EvaluationDateTime
+ System.DateTime
+
+
+ EvaluatedPolicy
+ System.String
+
+
+ EvaluatedObject
+ System.String
+
+
+ AggEvaluatedObject
+ System.String
+
+
+ PolicyResult
+ System.String
+
+
+ policy_id
+ System.Int32
+
+
+ CategoryName
+ System.String
+
+
+ MonthYear
+ System.String
+
+
+ FailedPolicyCount
+ System.Int32
+
+
+ TrimCategoryName
+
+
+
+
+
+ PolicyDW
+ SELECT DISTINCT CategoryName
+FROM policy.v_PolicyHistory
+ true
+
+
+
+ CategoryName
+ System.String
+
+
+ =IIF(Fields!CategoryName.Value LIKE "*:*", Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1)), Fields!CategoryName.Value)
+
+
+
+
+
+ PolicyDW
+ SELECT DISTINCT DATEADD(d,-day(EvaluationDateTime)+1, CAST(EvaluationDateTime AS DATE)) AS MonthStart
+, MonthYear
+FROM policy.v_PolicyHistory
+UNION
+SELECT '1900-01-01', 'ALL'
+ORDER BY MonthStart DESC
+ true
+
+
+
+ MonthYear
+ System.String
+
+
+ MonthStart
+ System.DateTime
+
+
+
+
+
+ PolicyDW
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!DateMonth.Value
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+ =Parameters!ServerGroupName.Value
+
+
+ SELECT MonthYear
+ , DATEADD(d,-day(EvaluationDateTime)+1, CAST(EvaluationDateTime AS DATE)) AS MonthStart
+ , CASE WHEN PolicyResult IN ('Fail') THEN 1 ELSE 0 end AS FailedPolicyCount
+FROM policy.v_PolicyHistory
+WHERE CategoryName IN (@CategoryName)
+AND EvaluatedPolicy IN (@EvaluatedPolicy)
+AND (EvaluatedServer IN (SELECT server_name
+ FROM policy.pfn_ServerGroupInstances(@ServerGroupName))
+OR @ServerGroupName = '')
+AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE))
+AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0))
+OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE))
+AND @DateMonth = '1900-01-01'))
+ true
+
+
+
+ FailedPolicyCount
+ System.Int32
+
+
+ MonthStart
+ System.DateTime
+
+
+ MonthYear
+ System.String
+
+
+
+
+
+ PolicyDW
+
+
+ =Parameters!EvaluatedPolicy.Value
+ true
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!ServerGroupName.Value
+
+
+ SELECT CASE
+ WHEN EXISTS
+ (SELECT *
+ FROM policy.v_PolicyHistory_LastEvaluation iple
+ WHERE iple.EvaluatedServer = ple.EvaluatedServer
+ AND iple.CategoryName IN (@CategoryName)
+ AND iple.EvaluatedPolicy IN (@EvaluatedPolicy)
+ AND iple.PolicyResult = 'FAIL')
+ THEN 'Out of Compliance'
+ WHEN EXISTS
+ (SELECT *
+ FROM policy.v_PolicyHistory_LastEvaluation iple
+ WHERE iple.EvaluatedServer = ple.EvaluatedServer
+ AND iple.CategoryName IN (@CategoryName)
+ AND iple.EvaluatedPolicy IN (@EvaluatedPolicy)
+ AND iple.PolicyResult = 'ERROR')
+ THEN 'Unknown'
+ ELSE 'In Compliance'
+ END AS InstanceStatus
+ , EvaluatedServer
+FROM policy.v_PolicyHistory ple
+WHERE (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName))
+OR @ServerGroupName = '')
+GROUP BY EvaluatedServer
+ true
+
+
+
+ InstanceStatus
+ System.String
+
+
+ EvaluatedServer
+ System.String
+
+
+
+
+
+ PolicyDW
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!ServerGroupName.Value
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+ SELECT ErrorHistoryID
+FROM policy.v_EvaluationErrorHistory_LastEvaluation
+WHERE EvaluationOrderDesc = 1
+AND CategoryName IN (@CategoryName)
+AND EvaluatedPolicy IN (@EvaluatedPolicy)
+AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName))
+OR @ServerGroupName = '')
+ true
+
+
+
+ ErrorHistoryID
+ System.Int32
+
+
+
+
+
+ PolicyDW
+ SELECT GroupName, GroupValue
+FROM policy.v_ServerGroups
+ORDER BY Sort
+ true
+
+
+
+ GroupName
+ System.String
+
+
+ GroupValue
+ System.String
+
+
+
+
+
+ PolicyDW
+
+
+ =Parameters!CategoryName.Value
+
+
+ SELECT DISTINCT EvaluatedPolicy
+FROM policy.v_PolicyHistory
+WHERE CategoryName IN (@CategoryName)
+ true
+
+
+
+ EvaluatedPolicy
+ System.String
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.84375in
+
+
+ 1.83333in
+
+
+ 1.29167in
+
+
+
+
+ 0.25in
+
+
+
+
+ true
+ true
+
+
+
+
+ Last Execution Status
+
+
+
+
+
+
+ Textbox50
+
+
+ 3
+
+
+
+
+
+
+
+ 0.2725in
+
+
+
+
+ true
+ true
+
+
+
+
+ Server/Instance/Database Object
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Policy Result
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Failed Policies
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.21in
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!EvaluatedServer.Value
+
+
+
+
+
+
+ EvaluatedServer
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bar
+
+
+
+
+
+ White
+ DiagonalLeft
+ =Switch(Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) = 0, "Green",
+Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdWarning.Value, "Red",
+Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdCaution.Value, "Tomato",
+Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) < Parameters!PolicyThresholdCaution.Value, "Gold")
+ None
+ 1pt
+
+
+ =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value)
+ 1
+
+
+ 0pt
+ 0pt
+ External
+
+
+ 25
+ Circle
+ Cross
+ 70
+
+
+
+
+
+
+ Gray
+ DiagonalLeft
+ Salmon
+ None
+ 0pt
+
+ None
+ 0
+
+ 0
+ 1
+
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+ 80
+ 80
+ Cross
+
+
+
+
+ Silver
+ DiagonalLeft
+ Salmon
+ None
+ 0pt
+
+ None
+ 0
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+ 80
+ 80
+ Cross
+
+
+
+
+ Gainsboro
+ DiagonalLeft
+ Salmon
+ None
+ 0pt
+
+ None
+ 0
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+
+ 1
+ 1
+
+ 80
+ 80
+ Cross
+
+
+
+
+ #00ffffff
+ None
+ White
+ None
+ 0pt
+
+ NaN
+ NaN
+
+ 1
+ 1
+
+
+ 0
+ 1
+
+
+ NaN
+ NaN
+
+
+ DimGray
+
+ -20
+ Cross
+
+ External
+
+
+ 5
+ 0.5
+
+
+ NaN
+ NaN
+
+
+ DimGray
+
+ Cross
+
+ External
+
+
+ 9
+ 1
+ true
+
+
+
+
+ 0
+
+
+
+ WhiteSmoke
+
+ Cross
+
+ External
+
+
+ 6
+ 6
+ Circle
+
+
+
+
+ 0
+
+
+
+ WhiteSmoke
+
+ Cross
+
+ External
+
+
+ 6
+ 6
+ Circle
+
+
+
+ NaN
+ NaN
+ 20
+ Outside
+ true
+ true
+ true
+ true
+
+ 0
+
+
+
+
+
+ WhiteSmoke
+ HorizontalCenter
+ DarkGray
+ None
+ 0pt
+
+ RoundedRectangular
+
+
+
+
+ External
+
+
+
+ true
+
+ External
+
+
+ NaN
+ 50
+ 100
+
+
+
+
+
+ =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value)
+ 1
+ NoOutput
+
+ None
+ Tbl_PolicyHistory
+
+ NaN
+ 1
+
+
+ NaN
+ 1
+
+ None
+
+ External
+
+
+ 1
+
+
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+
+ 1
+ 1
+
+ Red
+ 1
+ ThreeSignsDiamond
+
+ External
+
+
+
+
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+ Tomato
+ 1
+ ButtonStop
+
+ External
+
+
+
+
+
+ 0.01
+ 1
+
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+ Gold
+ 1
+ ThreeSignsTriangle
+
+ External
+
+
+
+
+
+ 0
+ 1
+ NoOutput
+
+
+ 0
+ 1
+ NoOutput
+
+ Green
+ 1
+ Circle
+
+ External
+
+
+
+
+ 0
+
+ ThreeSigns
+
+ 54
+ 4
+ 42
+ 92
+
+
+ true
+
+
+
+ Gainsboro
+ DiagonalLeft
+ Gray
+ None
+ 0pt
+
+
+
+
+
+ External
+
+
+
+
+ External
+
+
+ ReportHistory
+ 9
+
+
+ White
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0))
+
+
+
+
+
+
+
+
+ White
+ 2pt
+ 20pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ 0.21in
+
+
+
+
+ true
+ true
+
+
+
+
+ =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bar
+
+
+
+
+
+ White
+ DiagonalLeft
+ =Switch(Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) = 0, "Green",
+Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdWarning.Value, "Red",
+Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) >= Parameters!PolicyThresholdCaution.Value, "Tomato",
+Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value) < Parameters!PolicyThresholdCaution.Value, "Gold")
+ None
+ 1pt
+
+
+ =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value)
+ 1
+
+
+ 0pt
+ 0pt
+ External
+
+
+ 25
+ Wedge
+ Cross
+ 70
+
+
+
+
+
+
+ Gray
+ DiagonalLeft
+ Salmon
+ None
+ 0pt
+
+ None
+ 0
+
+ 0
+ 1
+
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+ 80
+ 80
+ Cross
+
+
+
+
+ Silver
+ DiagonalLeft
+ Salmon
+ None
+ 0pt
+
+ None
+ 0
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+ 80
+ 80
+ Cross
+
+
+
+
+ Gainsboro
+ DiagonalLeft
+ Salmon
+ None
+ 0pt
+
+ None
+ 0
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+
+ 1
+ 1
+
+ 80
+ 80
+ Cross
+
+
+
+
+ #00ffffff
+ None
+ White
+ None
+ 0pt
+
+ NaN
+ NaN
+
+ 1
+ 1
+
+
+ 0
+ 1
+
+
+ NaN
+ NaN
+
+
+ DimGray
+
+ -20
+ Cross
+
+ External
+
+
+ 5
+ 0.5
+
+
+ NaN
+ NaN
+
+
+ DimGray
+
+ Cross
+
+ External
+
+
+ 9
+ 1
+ true
+
+
+
+
+ 0
+
+
+
+ WhiteSmoke
+
+ Cross
+
+ External
+
+
+ 6
+ 6
+ Circle
+
+
+
+
+ 0
+
+
+
+ WhiteSmoke
+
+ Cross
+
+ External
+
+
+ 6
+ 6
+ Circle
+
+
+
+ NaN
+ NaN
+ 20
+ Outside
+ true
+ true
+ true
+ true
+
+ 0
+
+
+
+
+
+ WhiteSmoke
+ HorizontalCenter
+ DarkGray
+ None
+ 0pt
+
+ RoundedRectangular
+
+
+
+
+ External
+
+
+
+ true
+
+ External
+
+
+ NaN
+ 50
+ 100
+
+
+
+
+
+ =SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value)
+ 1
+ NoOutput
+
+ None
+ table1_EvaluatedServer
+
+ NaN
+ 1
+
+
+ NaN
+ 1
+
+ None
+
+ External
+
+
+ 1
+
+
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+
+ 1
+ 1
+
+ Red
+ 1
+ ThreeSignsDiamond
+
+ External
+
+
+
+
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+
+ =Parameters!PolicyThresholdWarning.Value
+ 1
+
+ Tomato
+ 1
+ ButtonStop
+
+ External
+
+
+
+
+
+ 0.01
+ 1
+
+
+ =Parameters!PolicyThresholdCaution.Value
+ 1
+
+ Gold
+ 1
+ ThreeSignsTriangle
+
+ External
+
+
+
+
+
+ 0
+ 1
+ NoOutput
+
+
+ 0
+ 1
+ NoOutput
+
+ Green
+ 1
+ ThreeSignsCircle
+
+ External
+
+
+
+
+ 0
+
+ ThreeSigns
+
+ 54
+ 4
+ 42
+ 92
+
+
+ true
+
+
+
+ Gainsboro
+ DiagonalLeft
+ Gray
+ None
+ 0pt
+
+
+
+
+
+ External
+
+
+
+
+ External
+
+
+ ReportHistory
+ 9
+
+
+ White
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1,
+Fields!PolicyResult.Value= "ERROR", 1,
+Fields!PolicyResult.Value= "PASS", 0))
+
+
+
+
+
+
+
+
+ White
+ 2pt
+ 20pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ 0.21in
+
+
+
+
+ true
+
+ =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) = Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), True, False)
+
+ true
+
+
+
+
+ =Fields!EvaluatedPolicy.Value
+
+
+
+
+
+
+
+
+
+
+ =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) = Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), "PolicyDetails", 0)
+
+
+ =Fields!policy_id.Value
+
+
+ =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\")))
+
+
+ =Fields!PolicyResult.Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!PolicyResult.Value
+
+
+
+
+
+
+ PolicyResult
+
+
+
+
+ PolicyDetails
+
+
+ =Fields!policy_id.Value
+
+
+ =Fields!EvaluatedObject.Value
+
+
+ =Fields!PolicyResult.Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!EvaluationDateTime.Value
+
+
+
+
+
+
+ EvaluationDateTime
+
+
+
+
+
+
+
+ 0.21in
+
+
+
+
+ true
+ true
+
+
+
+
+ =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\")))
+
+
+
+
+
+
+
+
+
+
+ PolicyDetails
+
+
+ =Fields!policy_id.Value
+
+
+ =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\")))
+
+
+ =Fields!PolicyResult.Value
+
+
+
+
+
+
+
+ true
+ Policy
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+ Textbox64
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+ Textbox65
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+ =Fields!EvaluatedServer.Value
+
+
+
+
+ =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0))
+ Descending
+
+
+ =Fields!EvaluatedServer.Value
+
+
+
+
+ true
+
+
+
+
+ =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1))
+
+
+
+
+ =SUM(IIF(Fields!PolicyResult.Value= "FAIL", 1, 0))
+ Descending
+
+
+ =
+Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1))
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+ =Fields!EvaluatedPolicy.Value
+ =Fields!EvaluationDateTime.Value
+
+
+
+
+ =Fields!EvaluatedPolicy.Value
+
+
+
+
+ After
+
+
+
+
+ StartAndEnd
+
+
+
+ =Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1))
+ NotEqual
+
+ =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\")))
+
+
+
+ Detail
+
+
+
+ =Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\")))
+
+
+
+
+
+
+ =IIF(Left(Fields!AggEvaluatedObject.Value,(InStr(Fields!AggEvaluatedObject.Value,"\")-1)) <> Right(Fields!EvaluatedObject.Value, (Len(Fields!EvaluatedObject.Value) - InStrRev(Fields!EvaluatedObject.Value, "\"))), True, False)
+ Policy
+
+ Detail_Collection
+ Output
+ true
+
+
+
+ true
+ DatabaseName
+
+
+
+
+
+
+ true
+ DatabaseName
+
+
+
+
+ true
+ EvaluatedServer
+
+
+
+
+
+
+ ReportHistory
+ 3.83in
+ 1.3625in
+ 5.96875in
+
+
+
+
+
+
+
+
+ =Fields!MonthYear.Value
+
+
+
+
+ =Fields!MonthStart.Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ =Sum(Fields!FailedPolicyCount.Value)/COUNT(Fields!FailedPolicyCount.Value)
+
+
+
+
+ ="View Details for " & First(Fields!MonthYear.Value)
+
+
+
+
+ PolicyEvaluationDetails
+
+
+ =Fields!MonthYear.Value
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!ServerGroupName.Value
+
+
+ ="ALL"
+
+
+ =Parameters!PolicyResult.Value
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+
+
+
+
+
+
+
+
+ Output
+
+
+
+
+
+
+
+
+
+
+
+
+ Primary
+ Primary
+
+ Black
+ 0pt
+
+
+
+
+
+
+ =Sum(Fields!FailedPolicyCount.Value)
+
+
+
+
+
+
+ Circle
+
+
+ Output
+
+
+ Line
+
+
+
+
+
+
+
+
+
+
+ Secondary
+ Primary
+
+ Black
+ 0pt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ NaN
+ NaN
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ Opposite
+ NaN
+ NaN
+
+
+
+
+
+
+
+
+
+ Failed Policies %
+
+
+
+ True
+
+
+
+ False
+
+
+
+
+
+ 0.5
+
+ NaN
+ NaN
+ NaN
+
+
+
+
+
+
+
+ Failed Objects Count
+
+
+
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ Opposite
+ NaN
+ NaN
+
+
+
+
+
+
+
+
+
+
+ Failed Policy % By Month
+
+
+
+ BrightPastel
+
+
+
+
+ No Data Available
+
+
+ ReportHistoryFull
+ 0.90292in
+ 6.01042in
+ 2.79167in
+ 4.98958in
+ 1
+
+
+ White
+ None
+
+
+
+ true
+ true
+
+
+
+
+ Objects in Failed State
+
+
+
+
+
+
+ 1.02792in
+ 0.93492cm
+ 0.31958in
+ 1.92012in
+ 2
+
+
+
+ true
+ true
+
+
+
+
+ =Sum(Fields!FailedPolicyCount.Value, "ReportHistory")
+
+
+
+
+
+
+
+
+
+
+ PolicyEvaluationDetails
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+
+
+
+
+ 1.02792in
+ 2.34376in
+ 0.31958in
+ 0.76389in
+ 3
+ ="Click to review evaluation details"
+
+
+
+ true
+ true
+
+
+
+
+ SQL Server Compliance
+
+
+
+
+
+
+
+
+ Current Enterprise State
+
+
+
+
+
+
+ 0.80917in
+ 5.25in
+ 4
+
+
+
+
+
+
+
+
+ =Fields!CategoryName.Value
+
+
+
+
+ =Right(Fields!CategoryName.Value, (Len(Fields!CategoryName.Value) - InStrRev(Fields!CategoryName.Value,":") - 1))
+
+
+
+
+
+
+
+
+
+
+
+ =Fields!PolicyResult.Value
+
+
+
+
+ =IIF(Fields!PolicyResult.Value="FAIL", 1, (IIF(Fields!PolicyResult.Value="PASS", 2, 3)))
+ Descending
+
+
+
+
+
+
+
+
+
+
+
+
+ =Fields!TrimCategoryName.Value
+ =IIF(IsNothing(Fields!PolicyResult.Value), Nothing, Count(Fields!PolicyResult.Value))
+
+
+
+
+ true
+ Outside
+
+ ="View Failed Policy Details for " & Fields!CategoryName.Value
+
+
+
+
+ PolicyEvaluationDetails
+
+
+ =Fields!CategoryName.Value
+
+
+ ="ALL"
+
+
+ =Parameters!ServerGroupName.Value
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+
+
+
+
+
+
+
+
+ Output
+
+
+ Stacked
+
+
+
+
+
+
+
+
+
+
+ Primary
+ Primary
+
+ Black
+ 0pt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ NaN
+ NaN
+ -45
+ Rotate45
+ true
+ 8pt
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ Opposite
+ NaN
+ NaN
+
+
+
+
+
+
+
+
+
+ Objects Count
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ NaN
+ NaN
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ Opposite
+ NaN
+ NaN
+
+
+
+
+
+
+
+
+
+
+
+ TopRight
+ WideTable
+
+
+
+
+ Black
+ Black
+ true
+
+
+
+
+ Failed Object Count by Policy Category
+
+ true
+
+
+
+ Black
+ Green
+ Red
+
+
+
+
+
+ No Data Available
+
+
+ ReportHistory
+ 3.83in
+ 6.01042in
+ 4.73063in
+ 4.98958in
+ 5
+
+
+ White
+ None
+ LightGrey
+ None
+
+
+
+ true
+ true
+
+
+
+
+ =Sum(Fields!FailedPolicyCount.Value, "ReportHistory")/Count(Fields!PolicyResult.Value, "ReportHistory")
+
+
+
+
+
+
+ 1.41694in
+ 2.35764in
+ 0.31958in
+ 0.76389in
+ 6
+
+
+
+ true
+ true
+
+
+
+
+ Failed Policies (%)
+
+
+
+
+
+
+ 1.41694in
+ 0.36808in
+ 0.31958in
+ 1.92012in
+ 7
+
+
+
+
+
+
+
+
+ =Fields!InstanceStatus.Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ =IIF(IsNothing(Fields!EvaluatedServer.Value), Nothing, Count(Fields!EvaluatedServer.Value))
+
+
+
+ true
+ true
+
+ ="Click to review evaluation details"
+
+
+
+
+ PolicyEvaluationDetails
+
+
+ ALL
+
+
+ =Parameters!CategoryName.Value
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+
+
+
+
+
+
+
+
+ Output
+
+
+ Shape
+ ExplodedPie
+
+
+
+
+
+
+
+
+
+
+ Primary
+ Primary
+
+ Black
+ 0pt
+
+
+
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ NaN
+ NaN
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ Opposite
+ NaN
+ NaN
+
+
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ NaN
+ NaN
+
+
+
+
+
+
+
+ Axis Title
+
+
+
+
+
+
+
+
+
+
+
+ 0.5
+
+ NaN
+ Opposite
+ NaN
+ NaN
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+ TopRight
+ WideTable
+
+
+
+
+ Black
+ Black
+
+
+
+
+ Instance Compliance
+
+
+
+ BrightPastel
+
+
+
+
+ No Data Available
+
+
+ FailedInstances
+ 0.90292in
+ 3.17709in
+ 2.79167in
+ 2.79166in
+ 8
+
+
+ White
+ None
+
+
+
+ true
+ true
+
+
+
+
+ =Count(Fields!ErrorHistoryID.Value, "Evaluation_Errors")
+
+
+
+
+
+
+
+
+
+
+ PolicyEvaluationErrors
+
+
+ =Parameters!EvaluatedPolicy.Value
+
+
+ =Parameters!CategoryName.Value
+
+
+
+
+
+
+ 1.80596in
+ 2.35764in
+ 0.31958in
+ 0.76389in
+ 9
+ ="Click to view error details"
+
+
+
+ true
+ true
+
+
+
+
+ Object Evaluation Errors
+
+
+
+
+
+
+ 1.80596in
+ 0.36808in
+ 0.31958in
+ 1.92012in
+ 10
+
+
+
+ 9.36271in
+
+
+ 11.05556in
+
+ 1in
+ 1in
+ 1in
+ 1in
+
+
+
+
+
+
+ String
+
+
+ Parameter_ServerGroup
+ GroupValue
+
+
+ true
+ Server Group Name
+
+
+ Parameter_ServerGroup
+ GroupValue
+ GroupName
+
+
+
+
+ String
+
+
+ Parameter_CategoryName
+ CategoryName
+
+
+ Category Name
+
+
+ Parameter_CategoryName
+ CategoryName
+ TrimCategoryName
+
+
+ true
+
+
+ DateTime
+
+
+ Parameter_MonthYear
+ MonthStart
+
+
+ Date Month
+
+
+ Parameter_MonthYear
+ MonthStart
+ MonthYear
+
+
+
+
+ String
+
+
+ PASS
+ FAIL
+ ERROR
+
+
+ PolicyResult
+ true
+
+
+
+ PASS
+
+
+
+ FAIL
+
+
+
+ ERROR
+
+
+
+
+ true
+
+
+ Float
+
+
+ 0.5
+
+
+ PolicyThresholdWarning
+ true
+
+
+ Float
+
+
+ 0.17
+
+
+ PolicyThresholdCaution
+ true
+
+
+ String
+
+
+ Parameter_EvaluatedPolicy
+ EvaluatedPolicy
+
+
+ Policy Name
+
+
+ Parameter_EvaluatedPolicy
+ EvaluatedPolicy
+ EvaluatedPolicy
+
+
+ true
+
+
+ Inch
+ http://localhost/ReportServer
+ 6c2f485d-f3eb-401c-a53b-94c2eaba3d98
+
\ No newline at end of file
diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl
new file mode 100644
index 00000000..e0fcd65f
--- /dev/null
+++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl
@@ -0,0 +1,963 @@
+
+
+ Policy description. Launch from PolicyDashboard and PolicyEvaluationDetails reports.
+ 0
+
+
+ PolicyDW
+ None
+ 37c8eb31-61fd-4b14-94ba-8a12551e3ca7
+
+
+
+
+
+ PolicyDW
+
+
+ =Parameters!pid.Value
+
+
+ SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled,
+ c.policy_category_id
+FROM msdb.dbo.syspolicy_policies AS p INNER JOIN
+ msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id
+WHERE (p.policy_id = @pid)
+
+
+
+ policy_id
+ System.Int32
+
+
+ cName
+ System.String
+
+
+ pName
+ System.String
+
+
+ date_created
+ System.DateTime
+
+
+ created_by
+ System.String
+
+
+ date_modified
+ System.DateTime
+
+
+ modified_by
+ System.String
+
+
+ description
+ System.String
+
+
+ help_text
+ System.String
+
+
+ help_link
+ System.String
+
+
+ is_enabled
+ System.Boolean
+
+
+ policy_category_id
+ System.Int32
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =First(Fields!pName.Value, "ReportHistory")
+
+
+
+
+
+
+ pName
+ 1.98277in
+ 0.8925in
+ 0.34375in
+ 8.09374in
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =First(Fields!cName.Value, "ReportHistory")
+
+
+
+
+
+
+ cName
+ 1.23278in
+ 1.99667in
+ 0.29513in
+ 5.45833in
+ 1
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ Database Compliance
+
+
+
+
+
+
+
+
+ Policy Details
+
+
+
+
+
+
+ 0.33187in
+ 0.8925in
+ 0.80917in
+ 6.6875in
+ 2
+
+
+
+ 1.16333in
+ 0.93417in
+ 0in
+ 8.02083in
+ 3
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Category -
+
+
+
+
+
+
+ 1.21889in
+ 0.8925in
+ 0.29513in
+ 1.07639in
+ 4
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ Policy Name
+
+
+
+
+
+
+ 1.61125in
+ 0.8925in
+ 0.34375in
+ 1.70833in
+ 5
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ 1.56958in
+ 0.93417in
+ 0in
+ 8.02083in
+ 6
+
+
+
+
+
+
+
+
+ 1.70833in
+
+
+ 2.23958in
+
+
+ 1.73958in
+
+
+ 2.40625in
+
+
+
+
+ 0.25in
+
+
+
+
+ true
+ true
+
+
+
+
+ Date Created
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Created By
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Date Modified
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Modified By
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ 0.25in
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!date_created.Value
+
+
+
+
+
+
+ date_created
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!created_by.Value
+
+
+
+
+
+
+ created_by
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!date_modified.Value
+
+
+
+
+
+
+ date_modified
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!modified_by.Value
+
+
+
+
+
+
+ modified_by
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ After
+
+
+
+
+
+
+ ReportHistory
+ 2.82306in
+ 0.8925in
+ 0.5in
+ 8.09374in
+ 7
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =First(Fields!description.Value, "ReportHistory")
+
+
+
+
+
+
+ description
+ 3.42375in
+ 0.8925in
+ 0.8125in
+ 8.0625in
+ 8
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!help_link.Value
+
+
+
+
+
+
+ help_text
+
+
+
+ =First(Fields!help_link.Value, "ReportHistory")
+
+
+
+ 4.61125in
+ 0.8925in
+ 0.66667in
+ 8.0625in
+ 9
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ Resources
+
+
+
+
+
+
+ 4.25361in
+ 0.8925in
+ 0.34375in
+ 2.85417in
+ 10
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ Policy Status
+
+
+
+
+
+
+ 1.61125in
+ 4.97916in
+ 0.34375in
+ 1.60083in
+ 11
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =SWITCH(Parameters!Status.Value="PASS","SUCCESS",
+Parameters!Status.Value="FAIL", "FAILURE",
+Parameters!Status.Value="ERROR", "ERROR")
+
+
+
+
+
+
+ 1.61125in
+ 7.11805in
+ 0.34375in
+ 1.71195in
+ 12
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ Policy Target
+
+
+
+
+
+
+ Textbox4
+ 2.40987in
+ 0.8925in
+ 0.34375in
+ 1.70833in
+ 13
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =Parameters!Target.Value
+
+
+
+
+
+
+ Textbox4
+ 2.40987in
+ 2.71209in
+ 0.34375in
+ 6.24291in
+ 14
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ Embedded
+ =IIF(Parameters!Status.Value="PASS","IndicatorImageOK","IndicatorImageSTOP")
+ Clip
+ 1.63902in
+ 6.78818in
+ 0.29514in
+ 0.32292in
+ 15
+
+
+
+
+
+ 5.525in
+
+
+ 10in
+
+ 1in
+ 1in
+ 1in
+ 1in
+
+
+
+
+
+
+ String
+
+
+ 1
+
+
+ pid
+ true
+
+
+ String
+ true
+
+
+
+
+
+ true
+ Target
+ true
+
+
+ String
+ true
+
+
+
+
+
+ true
+ Status
+ true
+
+
+
+
+ image/gif
+ R0lGODlhGAAYAPUAAP///1paWoyMjM7Ozt7e3ufn5yEICEIQEJwQEKUQEK0QEBgAACEAACkAADEAAEIAAEoAAIQAAIwAAJQAAJwAAKUAAK0AALUAAL0AAMYAAM4AANYAAN4AAOcAAO8AABgYCMDAwJQAEJwAEKUAEK0AEKUACK0ACLUACL0ACMYACM4ACNYACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACAALAAAAAAYABgAAAb/QJBweCgaj8WhUunwOJ9QD8KxVD48Gk1mGwhst5wKpApqfjFdQGCQwWAynQqV6Wm3A+q8t43ZTOYgEHVvfXiGagQbbhgaFQ9lg1saG4eGBAEbGhgXKxEOBnVbGB0elWoDASQrHBkrCg5mbnCleogBJiu5GwkGoFxetJWXqisqKgkfTW5rBWkDAM8DzSTGKikKH6BuF3gFAgDg4c0m1ikpyA0em9zPBc/hANMpKPTIBx4XFhaUBfDit/RQkMB2T58FDSkC9IPnLpVAgfY8WKhQAUVCAQUWQutComPHiBMpWDAXQMC7AahMePz4oYE1CjAtroGHauWIEchAMEhwYcKERxIoTuAJh+rmTRG8hhhIUEGChI5rUKI0KgIpgyULEpSIoLKL1wBVQyBdQGbpiI5Hq4YNkZQMiKUJ4sqd29YtiA948+rtVSUIADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+
+
+ image/gif
+ R0lGODlhGAAYAPYAAP///729vSEICEIQEBgAACEAACkAADEAAEoAABgYCFrOGGPOMVK9IVrWIVLGGFLOGGPWMVrGKVrOKVLGIUq9GEK1EFrGMUKtGEK1GDmlEFrOMVrWMVLGKUq9IUrGIUK9GDmtEFK9MVLGMUq1KUKtIUK1ITmlGDmtGDGcEDGlECmUCCmMECGECEKtKTmcITmlITGcGCmUECGMCDmlKTGUISmMGCmUGBh7CBiECBBzACmEISF7GCmMIRBzCCGEIRhrGBhzGBBjGBBrGAhaEAhjGABaEABSEMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEcALAAAAAAYABgAAAf/gEeCgwOFhoeFg4qKBxodEx0eHJOURgeLiggaDZwNEw4UFBUnGSZFCJhHBxGcEwqfFB8XFyYZKDBEl4wSnAqeoBgYFRkpKCgrLkO6Rwgcnr8OHRwMHSUkJCYrKiszRKiNEw2+DxMTEBAWFiEjI0RGAAAzNEUHjeKeFOYLGiIh60QB4C2goSOXAQjQKEDY12+dkYAABvIoaMDAgl8dOkDQoI5DO3gAAiyY6GNIAouwhhCx0HDEO3giJ+rYQeTkgmgvifhzCTIABJI+gJgUAKHDByIgh/CE+VOHjx1AftQcsEBWhQUgkYIc6TToDyFTF2AAYcIEVpACSe4IKiSISaq0hWy1OAtzgQ6nUYMEITJ1AwlbMV7MBQnB6Y4fX/cOMWmgBQljK7jNwCrSR1AgbfnyTXDEwBAYMWSwqEGDxoIFlqNmJjLEiIFBAoa4YIFj
+Bw2gqhWrfK2IwBAbN3LUMBz1x17NBFIVIFKjxw68iVmrLJBK0HK+RlRq1k69uqAE4MOLLyAAUyAAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+ image/gif
+ R0lGODlhGAAYAPUAACEICEIQEBgAACEAACkAADEAADkAAEIAAEoAAGMIAFoYEEoIAFopAEIhACEYCDEhALV7AMaEAM6MAL2EANaUAMaMAM6UANacAN6lAM6cANalAN6tANatAN61AOe9AIxzAN69AOfGAIRzAOfOAO/WAOfWAO/eAMa9COfeAO/nABgYCHNzCNbWAN7eAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAC4ALAAAAAAYABgAAAb/QJdwGCgaj8WhUhkwlZ5PVEnKEhWWTBNqu32ORqDQSYTAugJclNY7CoFAnfE1u011S+88fANazc9TaU8URRdgHhwcGx5kZy1qalEoE0UTX20dHB0dVgtpUmopRyghbnAdGysGB3Z3kKOmmxsaIgkEXFBroyAeqBsctAwEj15TT0cmp7MYwcNsKCQlI5QBEyi+wBcZIgwAUmAjbNTWqNkXFisMAS2XINJtGUUZJhzMF+cW3Ghgb19hIUVQbJh1z4KFCtwUoOAHoo0pLho0FDwYIaEJfh3CvOlQJIVEfBImTFjxgMCJjYp4cTQysUKECRBEOHBB4AOcRJs2BcRXQSSERBUEhhBY0SGihoEatvB8OTKoEgFEM1gAFnGpSBEDzNTckEEDhpYRIIzMaobmChFn04pAi9ZpWRcqGsiV60CF3QEAsAQBADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+
+
+ en-US
+ true
+ Inch
+ http://localhost/ReportServer
+ 509b7756-618c-4006-84d6-dcd5e685ee93
+