setup/backend/Function/code/policyCompliance/run.ps1 (78 lines of code) (raw):
# Input bindings are passed in via param block.
param($Timer)
# Get the current universal time in the default string format.
$currentUTCtime = (Get-Date).ToUniversalTime()
# Write an information log with the current time.
Write-Host "PolicyManagement timer trigger function ran! TIME: $currentUTCtime"
$SolutionTag=$env:SolutionTag
$polStateQuery=@"
policyresources
| where ['type'] == 'microsoft.policyinsights/policystates'
| extend ComplianceState=tostring(properties.complianceState), PolicySetDefinitionName=tostring(properties.policySetDefinitionName)
| where isnotempty(PolicySetDefinitionName)
| where ComplianceState =~ "NonCompliant"
| summarize by PolicySetDefinitionName
| join kind= innerunique (policyresources
| where ['type'] =~ "microsoft.authorization/policysetdefinitions" and isnotnull(properties.metadata.$SolutionTag)
| project PolicySetDefinitionName=name, PolicySetDefinitionId=id, policyDefinitions=properties.policyDefinitions) on PolicySetDefinitionName
| project-away PolicySetDefinitionName1
"@
$inits=Search-AzGraph -Query $polStateQuery -UseTenantScope
#$inits=Get-AzPolicySetDefinition | Where-Object {$_.Metadata.$SolutionTag -ne $null} | Where-Object {$_.Name -in $polState.PolicySetDefinitionName}
$polStateQuery=@"
policyresources
| where ['type'] == 'microsoft.policyinsights/policystates'
| extend ComplianceState=tostring(properties.complianceState), PolicySetDefinitionName=tostring(properties.policySetDefinitionName), PolicyDefinitionName=tostring(properties.policyDefinitionName)
| where ComplianceState =~ "NonCompliant"
| summarize by PolicyDefinitionName
| join kind= innerunique (policyresources
| where ['type'] =~ "microsoft.authorization/policydefinitions" and isnotnull(properties.metadata.$SolutionTag)
and properties.metadata.initiativeMember != true
| project PolicyDefinitionName=name, PolicyDefinitionId=id) on PolicyDefinitionName
| project-away PolicyDefinitionName1
"@
$pols=Search-AzGraph -Query $polStateQuery -UseTenantScope
#$pols=Get-AzPolicyDefinition | Where-Object {($_.Metadata.$SolutionTag -ne $null -or $_.Metadata.MonitorStarterPacksComponents -ne $null) -and $_.Metadata.initiativeMember -ne $true} | Where-Object {$_.Name -in $polState.PolicyDefinitionName}
"Found $($pols.Count) policies and $($inits.Count) policy sets to remediate"
# $pols=Get-AzPolicyDefinition | Where-Object {$_.properties.Metadata.$SolutionTag -ne $null -or $_.properties.Metadata.MonitorStarterPacksComponents -ne $null}
# $inits=Get-AzPolicySetDefinition | ? {$_.properties.Metadata.MonitorStarterPacks -ne $null}
foreach ($pol in $pols) {
"Policy $($pol.PolicyDefinitionId) is non-compliant"
$assignmentsQuery=@"
policyresources
| where type == 'microsoft.authorization/policyassignments'
| extend policyDefinitionId=properties.policyDefinitionId, Scope=properties.scope
| where policyDefinitionId == '$($pol.PolicyDefinitionId)'
"@
#$assignments=Get-AzPolicyAssignment -PolicyDefinitionId $pol.PolicyDefinitionId
$assignments=Search-AzGraph -Query $assignmentsQuery -UseTenantScope
foreach ($assignment in $assignments) {
"Starting remediation for $($assignment.DisplayName)"
Start-AzPolicyRemediation -Name "$($pol.PolicyDefinitionName) remediation" -PolicyAssignmentId $assignment.id -ResourceDiscoveryMode ExistingNonCompliant -Scope $assignment.Scope
}
}
foreach ($init in $inits) {
"Policy set $($init.PolicySetDefinitionId) is non-compliant"
#$assignment=Get-AzPolicyAssignment -PolicyDefinitionId $init.PolicySetDefinitionId -Scope "IntermediateRoot"
$assignmentsQuery=@"
policyresources
| where type == 'microsoft.authorization/policyassignments'
| extend policyDefinitionId=properties.policyDefinitionId, Scope=properties.scope
| where policyDefinitionId == '$($init.PolicySetDefinitionId)'
"@
$assignments=Search-AzGraph -Query $assignmentsQuery -UseTenantScope
if ($assignments.Count -gt 0) {
"Found $($assignments.Count) assignments for $($init.PolicySetDefinitionId)"
$policiesInSet=$init.PolicyDefinitions | Select-Object -ExpandProperty policyDefinitionReferenceId
#$policiesInSet
foreach ($pol in $policiesInSet) {
"Starting remediation for $($assignment.Id) policy $pol"
foreach ($assignment in $assignments) {
Start-AzPolicyRemediation -Name "$($pol) remediation" -PolicyAssignmentId $assignment.Id -PolicyDefinitionReferenceId $pol -Scope $assignment.Scope
}
}
}
else {
"No assignment found for $($init.PolicySetDefinitionId)"
}
}