The case of the unexplained – Application Deployment Monitoring reports: Which one to rely?

Hi Folks,

The mismatch between the error is explained at:

I worked on checking the different views for deployment status for monitoring for the deployment of Applications across the different places–

1. Pie chart on the console-



“Top Level” deployment report (i.e. Monitoring à Deployments and look at the status under “Completion Statistics”)

fn_DeploymentSummary -> VDeploymentSummary -> DeploymentSummary

-This seems to be a summarized data from the current data as this will not contain the current data.

2. Clicking on the Status for detailed view-

If you click on “View Status” then the pie chart at the top is still pulling from the same data, but the details below that (Success/In Progress/Errors/etc.)


fn_AppDeploymentStatus -> [vAppDeploymentStatus] -> [vAppDeploymentAssetData]

Here information is grouped by  AssignmentID, PolicyModelID, DTCI, EnforcementState, AppStatusType.

Here [fn_GetAppState] used by [vAppDeploymentAssetData] gets the State data as mentioned below. The function here dictates the enforcement states. It has its own logic depending on the Compliance State,  Enforcement State, OfferTypeID , SummarizationType , ResolvedState , Applicability 


  — OfferTypeID 0 = Required, 2 = Available, 3 = Preflight

  — SummarizationType 1 = App Intent, 2 = DT/App

  — Compliance State 1 = Compliant, 2 = Non Compliant, 4 = Error, 6 = Partial Compliance

  — Enforcement State 1000-1999 = Success, 2000-2999 = In Progress, 3000-3999 = Requirements Not Met, 4000-4999 = Unknown, 5000-5999 = Error

  — ResolvedState 0 = None, 1 = NotPresent/NonCompliant, 2=Present/Compliant, 3=Unknown, 4=Available

  — Applicability 0 = Not Applicable, 1 = Applicable, NULL = Host Platform Not Applicable

  — Compliance evaluation errors are always promoted to errors.

And the total is just Aggregate SUM() of the data returned by the final grouping by AssignmentID, PolicyModelID, DTCI, EnforcementState, AppStatusType.

So two level grouping here.

3. From the report:

Software Distribution – Application Monitoring”-> “All Application Deployment (basic)”


fn_rbac_DeploymentSummary -> v_DeploymentSummary

fn_rbac_AppDeploymentSummary(@UserSIDs) -> v_AppDeploymentSummary -> vAppDeploymentResultsPerClient -> vAppDeploymentResultsPerClientMachine -> Data Direct from the Raw client information send)

fn_rbac_AppDTDeploymentSummary(@UserSIDs) -> v_AppDTDeploymentSummary -> vAppDTDeploymentResultsPerClient -> vAppDTDeploymentResultsPerClientMachine -> Data Direct from the Raw client information send)

Here also vAppDeploymentResultsPerClientMachine and vAppDTDeploymentResultsPerClientMachine use the data from the base tables and [fn_GetAppState] is used. But here there is only grouping by CI_ID , AssignmentID.

I modified the SQL view vAppDeploymentResultsPerClientMachine to get the same per Client machine per every Application –


select  MIN(cit.CI_ID) as CI_ID, MIN(cit.CI_ID) as ParentID, MIN(co.SiteID) as TargetCollectionID, cia.AssignmentID, ci.ModelID as PolicyModelID, 
        cm.MachineID as ResourceID, 0 as UserResource, MIN(cil.DisplayName) as Descript, MIN(cia.StartTime) as StartTime, 
        MIN(cia.LastModificationTime) as LastModificationTime, MAX(ccs.ComplianceState) as ComplianceState,  
        MAX(dbo.fn_GetAppState(ccs.ComplianceState,ccs.EnforcementState,cia.OfferTypeID,1,ccs.DesiredState,ccs.IsApplicable)) as EnforcementStateValue,
        EnforcementStateName = CASE 
        when (MIN(dbo.fn_GetAppState(ccs.ComplianceState,ccs.EnforcementState,cia.OfferTypeID,1,ccs.DesiredState,ccs.IsApplicable)) between 1000 and 1999) then 'Success'
        when (MIN(dbo.fn_GetAppState(ccs.ComplianceState,ccs.EnforcementState,cia.OfferTypeID,1,ccs.DesiredState,ccs.IsApplicable)) between 2000 and 2999) then 'In Progress'
        when (MIN(dbo.fn_GetAppState(ccs.ComplianceState,ccs.EnforcementState,cia.OfferTypeID,1,ccs.DesiredState,ccs.IsApplicable)) between 3000 and 3999) then 'Requirements Not Met'
        when (MIN(dbo.fn_GetAppState(ccs.ComplianceState,ccs.EnforcementState,cia.OfferTypeID,1,ccs.DesiredState,ccs.IsApplicable)) between 4000 and 4999) then 'Unknown'
        when (MIN(dbo.fn_GetAppState(ccs.ComplianceState,ccs.EnforcementState,cia.OfferTypeID,1,ccs.DesiredState,ccs.IsApplicable)) between 5000 and 5999) then 'Error'
         else 'NULL'
        --<add more cases here>     
        MIN(cia.OfferTypeID) as OfferTypeID, MIN(ccs.CIVersion) as Revision 
        from CI_CIAssignments cia 
        INNER JOIN CI_AssignmentTargetedCIs cit ON cia.AssignmentID = cit.AssignmentID 
        INNER JOIN Collections co on co.CollectionID = cia.TargetCollectionID 
        INNER JOIN CI_ConfigurationItems ci ON ci.CI_ID = cit.ActualCI_ID  -- ci = intent  
        INNER JOIN CI_LocalizedProperties cil on cit.CI_ID = cil.CI_ID 
        INNER JOIN vCollectionMembers cm ON cia.TargetCollectionID = cm.CollectionID 
        inner join vAppDeploymentResultsPerClientMachine vAD on Vad.CI_ID = cit.CI_ID
        LEFT JOIN CI_CurrentComplianceStatus ccs ON ccs.ModelID = ci.ModelId and ccs.ItemKey = cm.MachineID 
        where cia.AssignmentType=2 and cia.IsTombstoned=0 and cm.IsClient=1 --and vad.EnforcementState is not NULL
        group by cia.AssignmentID, ci.ModelID, cm.MachineID

Hope it helps!

Umair Khan
Support Escalation Engineer | Microsoft System Center Configuration Manager 

Disclaimer: This posting is provided "AS IS" with no warranties and confers no rights.

Comments (0)

Skip to main content