Azure Resource Graph sample queries for Azure Policy
Article 2025/02/27
4 contributors
Feedback
In this article
Azure Policy
Azure Policy exemptions
Next steps
This page is a collection of Azure Resource Graph sample queries
for Azure Policy.
Compliance by policy assignment
Provides compliance state, compliance percentage, and counts of resources for each Azure Policy assignment.
PolicyResources
| where type =~ 'Microsoft.PolicyInsights/PolicyStates'
| extend complianceState = tostring (properties.complianceState)
| extend
resourceId = tostring (properties.resourceId),
policyAssignmentId = tostring (properties.policyAssignmentId),
policyAssignmentScope = tostring (properties.policyAssignmentScope),
policyAssignmentName = tostring (properties.policyAssignmentName),
policyDefinitionId = tostring (properties.policyDefinitionId),
policyDefinitionReferenceId = tostring (properties.policyDefinitionReferenceId),
stateWeight = iff (complianceState == 'NonCompliant' , int (300 ), iff (complianceState == 'Compliant' , int (200 ), iff (complianceState == 'Conflict' , int (100 ), iff (complianceState == 'Exempt' , int (50 ), int (0 )))))
| summarize max (stateWeight) by resourceId, policyAssignmentId, policyAssignmentScope, policyAssignmentName
| summarize counts = count () by policyAssignmentId, policyAssignmentScope, max_stateWeight, policyAssignmentName
| summarize overallStateWeight = max (max_stateWeight),
nonCompliantCount = sumif (counts, max_stateWeight == 300 ),
compliantCount = sumif (counts, max_stateWeight == 200 ),
conflictCount = sumif (counts, max_stateWeight == 100 ),
exemptCount = sumif (counts, max_stateWeight == 50 ) by policyAssignmentId, policyAssignmentScope, policyAssignmentName
| extend totalResources = todouble (nonCompliantCount + compliantCount + conflictCount + exemptCount)
| extend compliancePercentage = iff (totalResources == 0 , todouble (100 ), 100 * todouble (compliantCount + exemptCount) / totalResources)
| project policyAssignmentName, scope = policyAssignmentScope,
complianceState = iff (overallStateWeight == 300 , 'noncompliant' , iff (overallStateWeight == 200 , 'compliant' , iff (overallStateWeight == 100 , 'conflict' , iff (overallStateWeight == 50 , 'exempt' , 'notstarted' )))),
compliancePercentage,
compliantCount,
nonCompliantCount,
conflictCount,
exemptCount
az graph query -q "PolicyResources | where type =~ 'Microsoft.PolicyInsights/PolicyStates' | extend complianceState = tostring(properties.complianceState) | extend resourceId = tostring(properties.resourceId), policyAssignmentId = tostring(properties.policyAssignmentId), policyAssignmentScope = tostring(properties.policyAssignmentScope), policyAssignmentName = tostring(properties.policyAssignmentName), policyDefinitionId = tostring(properties.policyDefinitionId), policyDefinitionReferenceId = tostring(properties.policyDefinitionReferenceId), stateWeight = iff(complianceState == 'NonCompliant', int(300), iff(complianceState == 'Compliant', int(200), iff(complianceState == 'Conflict', int(100), iff(complianceState == 'Exempt', int(50), int(0))))) | summarize max(stateWeight) by resourceId, policyAssignmentId, policyAssignmentScope, policyAssignmentName | summarize counts = count() by policyAssignmentId, policyAssignmentScope, max_stateWeight, policyAssignmentName | summarize overallStateWeight = max(max_stateWeight), nonCompliantCount = sumif(counts, max_stateWeight == 300), compliantCount = sumif(counts, max_stateWeight == 200), conflictCount = sumif(counts, max_stateWeight == 100), exemptCount = sumif(counts, max_stateWeight == 50) by policyAssignmentId, policyAssignmentScope, policyAssignmentName | extend totalResources = todouble(nonCompliantCount + compliantCount + conflictCount + exemptCount) | extend compliancePercentage = iff(totalResources == 0, todouble(100), 100 * todouble(compliantCount + exemptCount) / totalResources) | project policyAssignmentName, scope = policyAssignmentScope, complianceState = iff(overallStateWeight == 300, 'noncompliant', iff(overallStateWeight == 200, 'compliant', iff(overallStateWeight == 100, 'conflict', iff(overallStateWeight == 50, 'exempt', 'notstarted')))), compliancePercentage, compliantCount, nonCompliantCount, conflictCount, exemptCount"
Search-AzGraph -Query "PolicyResources | where type =~ 'Microsoft.PolicyInsights/PolicyStates' | extend complianceState = tostring(properties.complianceState) | extend resourceId = tostring(properties.resourceId), policyAssignmentId = tostring(properties.policyAssignmentId), policyAssignmentScope = tostring(properties.policyAssignmentScope), policyAssignmentName = tostring(properties.policyAssignmentName), policyDefinitionId = tostring(properties.policyDefinitionId), policyDefinitionReferenceId = tostring(properties.policyDefinitionReferenceId), stateWeight = iff(complianceState == 'NonCompliant', int(300), iff(complianceState == 'Compliant', int(200), iff(complianceState == 'Conflict', int(100), iff(complianceState == 'Exempt', int(50), int(0))))) | summarize max(stateWeight) by resourceId, policyAssignmentId, policyAssignmentScope, policyAssignmentName | summarize counts = count() by policyAssignmentId, policyAssignmentScope, max_stateWeight, policyAssignmentName | summarize overallStateWeight = max(max_stateWeight), nonCompliantCount = sumif(counts, max_stateWeight == 300), compliantCount = sumif(counts, max_stateWeight == 200), conflictCount = sumif(counts, max_stateWeight == 100), exemptCount = sumif(counts, max_stateWeight == 50) by policyAssignmentId, policyAssignmentScope, policyAssignmentName | extend totalResources = todouble(nonCompliantCount + compliantCount + conflictCount + exemptCount) | extend compliancePercentage = iff(totalResources == 0, todouble(100), 100 * todouble(compliantCount + exemptCount) / totalResources) | project policyAssignmentName, scope = policyAssignmentScope, complianceState = iff(overallStateWeight == 300, 'noncompliant', iff(overallStateWeight == 200, 'compliant', iff(overallStateWeight == 100, 'conflict', iff(overallStateWeight == 50, 'exempt', 'notstarted')))), compliancePercentage, compliantCount, nonCompliantCount, conflictCount, exemptCount"
Compliance by resource type
Provides compliance state, compliance percentage, and counts of resources for each resource type.
PolicyResources
| where type =~ 'Microsoft.PolicyInsights/PolicyStates'
| extend complianceState = tostring (properties.complianceState)
| extend
resourceId = tostring (properties.resourceId),
resourceType = tolower (tostring (properties.resourceType)),
policyAssignmentId = tostring (properties.policyAssignmentId),
policyDefinitionId = tostring (properties.policyDefinitionId),
policyDefinitionReferenceId = tostring (properties.policyDefinitionReferenceId),
stateWeight = iff (complianceState == 'NonCompliant' , int (300 ), iff (complianceState == 'Compliant' , int (200 ), iff (complianceState == 'Conflict' , int (100 ), iff (complianceState == 'Exempt' , int (50 ), int (0 )))))
| summarize max (stateWeight) by resourceId, resourceType
| summarize counts = count () by resourceType, max_stateWeight
| summarize overallStateWeight = max (max_stateWeight),
nonCompliantCount = sumif (counts, max_stateWeight == 300 ),
compliantCount = sumif (counts, max_stateWeight == 200 ),
conflictCount = sumif (counts, max_stateWeight == 100 ),
exemptCount = sumif (counts, max_stateWeight == 50 ) by resourceType
| extend totalResources = todouble (nonCompliantCount + compliantCount + conflictCount + exemptCount)
| extend compliancePercentage = iff (totalResources == 0 , todouble (100 ), 100 * todouble (compliantCount + exemptCount) / totalResources)
| project resourceType,
overAllComplianceState = iff (overallStateWeight == 300 , 'noncompliant' , iff (overallStateWeight == 200 , 'compliant' , iff (overallStateWeight == 100 , 'conflict' , iff (overallStateWeight == 50 , 'exempt' , 'notstarted' )))),
compliancePercentage,
compliantCount,
nonCompliantCount,
conflictCount,
exemptCount
az graph query -q "PolicyResources | where type =~ 'Microsoft.PolicyInsights/PolicyStates' | extend complianceState = tostring(properties.complianceState) | extend resourceId = tostring(properties.resourceId), resourceType = tolower(tostring(properties.resourceType)), policyAssignmentId = tostring(properties.policyAssignmentId), policyDefinitionId = tostring(properties.policyDefinitionId), policyDefinitionReferenceId = tostring(properties.policyDefinitionReferenceId), stateWeight = iff(complianceState == 'NonCompliant', int(300), iff(complianceState == 'Compliant', int(200), iff(complianceState == 'Conflict', int(100), iff(complianceState == 'Exempt', int(50), int(0))))) | summarize max(stateWeight) by resourceId, resourceType | summarize counts = count() by resourceType, max_stateWeight | summarize overallStateWeight = max(max_stateWeight), nonCompliantCount = sumif(counts, max_stateWeight == 300), compliantCount = sumif(counts, max_stateWeight == 200), conflictCount = sumif(counts, max_stateWeight == 100), exemptCount = sumif(counts, max_stateWeight == 50) by resourceType | extend totalResources = todouble(nonCompliantCount + compliantCount + conflictCount + exemptCount) | extend compliancePercentage = iff(totalResources == 0, todouble(100), 100 * todouble(compliantCount + exemptCount) / totalResources) | project resourceType, overAllComplianceState = iff(overallStateWeight == 300, 'noncompliant', iff(overallStateWeight == 200, 'compliant', iff(overallStateWeight == 100, 'conflict', iff(overallStateWeight == 50, 'exempt', 'notstarted')))), compliancePercentage, compliantCount, nonCompliantCount, conflictCount, exemptCount"
Search-AzGraph -Query "PolicyResources | where type =~ 'Microsoft.PolicyInsights/PolicyStates' | extend complianceState = tostring(properties.complianceState) | extend resourceId = tostring(properties.resourceId), resourceType = tolower(tostring(properties.resourceType)), policyAssignmentId = tostring(properties.policyAssignmentId), policyDefinitionId = tostring(properties.policyDefinitionId), policyDefinitionReferenceId = tostring(properties.policyDefinitionReferenceId), stateWeight = iff(complianceState == 'NonCompliant', int(300), iff(complianceState == 'Compliant', int(200), iff(complianceState == 'Conflict', int(100), iff(complianceState == 'Exempt', int(50), int(0))))) | summarize max(stateWeight) by resourceId, resourceType | summarize counts = count() by resourceType, max_stateWeight | summarize overallStateWeight = max(max_stateWeight), nonCompliantCount = sumif(counts, max_stateWeight == 300), compliantCount = sumif(counts, max_stateWeight == 200), conflictCount = sumif(counts, max_stateWeight == 100), exemptCount = sumif(counts, max_stateWeight == 50) by resourceType | extend totalResources = todouble(nonCompliantCount + compliantCount + conflictCount + exemptCount) | extend compliancePercentage = iff(totalResources == 0, todouble(100), 100 * todouble(compliantCount + exemptCount) / totalResources) | project resourceType, overAllComplianceState = iff(overallStateWeight == 300, 'noncompliant', iff(overallStateWeight == 200, 'compliant', iff(overallStateWeight == 100, 'conflict', iff(overallStateWeight == 50, 'exempt', 'notstarted')))), compliancePercentage, compliantCount, nonCompliantCount, conflictCount, exemptCount"
List all non-compliant resources
Provides a list of all resources types that are in a NonCompliant
state.
PolicyResources
| where type == 'microsoft.policyinsights/policystates'
| where properties.complianceState == 'NonCompliant'
| extend NonCompliantResourceId = properties.resourceId, PolicyAssignmentName = properties.policyAssignmentName
az graph query -q "PolicyResources | where type == 'microsoft.policyinsights/policystates' | where properties.complianceState == 'NonCompliant' | extend NonCompliantResourceId = properties.resourceId, PolicyAssignmentName = properties.policyAssignmentName"
Search-AzGraph -Query "PolicyResources | where type == 'microsoft.policyinsights/policystates' | where properties.complianceState == 'NonCompliant'"
Summarize resource compliance by state
Details the number of resources in each compliance state.
PolicyResources
| where type == 'microsoft.policyinsights/policystates'
| extend complianceState = tostring (properties.complianceState)
| summarize count () by complianceState
az graph query -q "PolicyResources | where type == 'microsoft.policyinsights/policystates' | extend complianceState = tostring(properties.complianceState) | summarize count() by complianceState"
Search-AzGraph -Query "PolicyResources | where type == 'microsoft.policyinsights/policystates' | extend complianceState = tostring(properties.complianceState) | summarize count() by complianceState"
Summarize resource compliance by state per location
Details the number of resources in each compliance state per location.
PolicyResources
| where type == 'microsoft.policyinsights/policystates'
| extend complianceState = tostring (properties.complianceState)
| extend resourceLocation = tostring (properties.resourceLocation)
| summarize count () by resourceLocation, complianceState
az graph query -q "PolicyResources | where type == 'microsoft.policyinsights/policystates' | extend complianceState = tostring(properties.complianceState) | extend resourceLocation = tostring(properties.resourceLocation) | summarize count() by resourceLocation, complianceState"
Search-AzGraph -Query "PolicyResources | where type == 'microsoft.policyinsights/policystates' | extend complianceState = tostring(properties.complianceState) | extend resourceLocation = tostring(properties.resourceLocation) | summarize count() by resourceLocation, complianceState"
Policy exemptions per assignment
Lists the number of exemptions for each assignment.
PolicyResources
| where type == 'microsoft.authorization/policyexemptions'
| summarize count () by tostring (properties.policyAssignmentId)
Use the --management-groups
parameter with an Azure management group ID or tenant ID. In this example, the tenantid
variable stores the tenant ID.
tenantid= "$(az account show --query tenantId --output tsv) "
az graph query -q "policyresources | where type == 'microsoft.authorization/policyexemptions' | summarize count() by tostring(properties.policyAssignmentId)" --management-groups $tenantid
By default, PowerShell get results for all subscriptions in your tenant but you can also include the -UseTenantScope
parameter.
Search-AzGraph -Query "policyresources | where type == 'microsoft.authorization/policyexemptions' | summarize count() by tostring(properties.policyAssignmentId)" -UseTenantScope
Policy exemptions that expire within 90 days
Lists the name and expiration date.
PolicyResources
| where type == 'microsoft.authorization/policyexemptions'
| extend expiresOnC = todatetime (properties.expiresOn)
| where isnotnull (expiresOnC)
| where expiresOnC >= now () and expiresOnC < now (+90 d)
| project name, expiresOnC
az graph query -q "policyresources | where type == 'microsoft.authorization/policyexemptions' | extend expiresOnC = todatetime(properties.expiresOn) | where isnotnull(expiresOnC) | where expiresOnC >= now() and expiresOnC < now(+90d) | project name, expiresOnC"
Search-AzGraph -Query "policyresources | where type == 'microsoft.authorization/policyexemptions' | extend expiresOnC = todatetime(properties.expiresOn) | where isnotnull(expiresOnC) | where expiresOnC >= now() and expiresOnC < now(+90d) | project name, expiresOnC"