internal/functions/Convert-PolicyToDetails.ps1
function Convert-PolicyToDetails { [CmdletBinding()] param ( $PolicyId, $PolicyDefinition, $PolicyDetails ) $properties = Get-PolicyResourceProperties -PolicyResource $PolicyDefinition $category = "Unknown" if ($properties.metadata -and $properties.metadata.category) { $category = $properties.metadata.category } $effectRawValue = $properties.policyRule.then.effect $found, $effectParameterName = Get-ParameterNameFromValueString -ParamValue $effectRawValue $effectValue = $null $effectDefault = $null $effectAllowedValues = @() $effectAllowedOverrides = @() $effectReason = "Policy No Default" $parameters = $properties.parameters | ConvertTo-HashTable if ($found) { if ($parameters.Keys -contains $effectParameterName) { $effectParameter = $parameters.$effectParameterName if ($effectParameter.defaultValue) { $effectValue = $effectParameter.defaultValue $effectDefault = $effectParameter.defaultValue $effectReason = "Policy Default" } } else { Write-Error "Policy uses parameter '$effectParameterName' for the effect not defined in the parameters. This should not be possible!" -ErrorAction Stop } if ($effectParameter.allowedValues) { $effectAllowedValues = $effectParameter.allowedValues $effectAllowedOverrides = $effectParameter.allowedValues } } else { # Fixed value $effectValue = $effectRawValue $effectDefault = $effectRawValue $effectAllowedValues = @( $effectDefault ) $effectReason = "Policy Fixed" } if ($effectAllowedOverrides.Count -eq 0) { # Analyze Policy $then = $properties.policyRule.then $details = $then.details $denyAction = $details -and $details.actionNames $auditIfNotExists = $details -and $details.existenceCondition $deployIfNotExists = $auditIfNotExists -and $details.deployment $modify = $details -and $details.operations $manual = $details -and $details.defaultState $append = $details -and $details -is [array] if ($denyAction) { $effectAllowedOverrides = @("Disabled", "DenyAction") } elseif ($manual) { $effectAllowedOverrides = @("Disabled", "Manual") } elseif ($deployIfNotExists) { $effectAllowedOverrides = @("Disabled", "AuditIfNotExists", "DeployIfNotExists") } elseif ($auditIfNotExists) { $effectAllowedOverrides = @("Disabled", "AuditIfNotExists") } elseif ($modify) { $effectAllowedOverrides = @("Disabled", "Audit", "Modify") } elseif ($append) { $effectAllowedOverrides = @("Disabled", "Audit", "Deny", "Append") } else { if ($effectReason -eq "Policy Fixed") { if ($effectValue -eq "deny") { $effectAllowedOverrides = @("Disabled", "Audit", "Deny") } elseif ($effectValue -eq "audit") { $effectAllowedOverrides = @("Disabled", "Audit", "Deny") # Safe assumption if Audit or Disabled - deny is a valid case as well - see ALZ deny-unmanageddisk } else { # Disabled: very weird for hard coded $effectAllowedOverrides = @("Disabled", "Audit") # Safe assumption } } else { if ($effectDefault -eq "deny") { $effectAllowedOverrides = @("Disabled", "Audit", "Deny") } else { $effectAllowedOverrides = @("Disabled", "Audit", "Deny") # Guess, could be @("Disabled", "Audit") } } } } $displayName = $properties.displayName if (-not $displayName -or $displayName -eq "") { $displayName = $PolicyDefinition.name } $description = $properties.description if (-not $description) { $description = "" } $parameterDefinitions = @{} foreach ($parameterName in $parameters.Keys) { $parameter = $parameters.$parameterName $parameterDefinition = @{ isEffect = $parameterName -eq $effectParameterName value = $null defaultValue = $parameter.defaultValue definition = $parameter } $null = $parameterDefinitions.Add($parameterName, $parameterDefinition) } $name = $PolicyDefinition.name $policyDetail = @{ id = $PolicyId name = $name displayName = $displayName description = $description policyType = $properties.policyType category = $category effectParameterName = $effectParameterName effectValue = $effectValue effectDefault = $effectDefault effectAllowedValues = $effectAllowedValues effectAllowedOverrides = $effectAllowedOverrides effectReason = $effectReason parameters = $parameterDefinitions } $null = $PolicyDetails.Add($PolicyId, $policyDetail) } |