internal/defender/Test-MdePolicyCompliance.ps1
|
function Test-MdePolicyCompliance { <# .SYNOPSIS Tests policy compliance for an MDE setting across all assigned policies .DESCRIPTION Analyzes configuration policies for compliance with the specified setting. Returns detailed compliance results categorized by compliant, non-compliant, and not-configured. .PARAMETER PolicyConfiguration Policy configuration hashtable from Get-MdePolicyConfiguration .PARAMETER SettingId The Intune setting definition ID to check (e.g., "device_vendor_msft_policy_config_defender_allowarchivescanning") .PARAMETER ComplianceCheck The type of compliance check: Boolean, Range, Enum, MinimumLevel, MinimumValue, NotRequired .PARAMETER ExpectedValue The expected value for Boolean checks .PARAMETER RangeMin Minimum value for Range checks .PARAMETER RangeMax Maximum value for Range checks .PARAMETER ValidValues Array of valid values for Enum checks .PARAMETER ValidLevels Hashtable mapping values to numeric levels for MinimumLevel checks .PARAMETER MinimumValue Minimum numeric value for MinimumValue and MinimumLevel checks .EXAMPLE Test-MdePolicyCompliance -PolicyConfiguration $config -SettingId "device_vendor_msft_policy_config_defender_allowarchivescanning" -ComplianceCheck "Boolean" -ExpectedValue "_1" Returns a hashtable with CompliantPolicies, NonCompliantPolicies, and NotConfiguredPolicies arrays. #> [CmdletBinding()] [OutputType([hashtable])] param( [Parameter(Mandatory = $true)] [hashtable]$PolicyConfiguration, [Parameter(Mandatory = $true)] [string]$SettingId, [Parameter(Mandatory = $true)] [ValidateSet("Boolean", "Range", "Enum", "MinimumLevel", "MinimumValue", "NotRequired", "Manual")] [string]$ComplianceCheck, [string]$ExpectedValue, [int]$RangeMin, [int]$RangeMax, [string[]]$ValidValues, [hashtable]$ValidLevels, [int]$MinimumValue, [ValidateSet('AllPolicies', 'AnyPolicy')] [string]$ComplianceLogic = 'AllPolicies' ) $compliantPolicies = @() $nonCompliantPolicies = @() $notConfiguredPolicies = @() if ($PolicyConfiguration.ConfigurationPolicies.Count -gt 0) { foreach ($policy in $PolicyConfiguration.ConfigurationPolicies) { try { $settingsParams = @{ RelativeUri = "deviceManagement/configurationPolicies/$($policy.id)/settings" ApiVersion = 'beta' ErrorAction = 'SilentlyContinue' } $policySettings = Invoke-MtGraphRequest @settingsParams $specificSetting = $policySettings | Where-Object { $_.settingInstance.settingDefinitionId -eq $SettingId } if ($specificSetting) { $settingValue = Get-MdeSettingValue -Setting $specificSetting -ComplianceCheck $ComplianceCheck $complianceParams = @{ Value = $settingValue ComplianceCheck = $ComplianceCheck } if ($PSBoundParameters.ContainsKey('ExpectedValue')) { $complianceParams.ExpectedValue = $ExpectedValue } if ($PSBoundParameters.ContainsKey('RangeMin')) { $complianceParams.RangeMin = $RangeMin } if ($PSBoundParameters.ContainsKey('RangeMax')) { $complianceParams.RangeMax = $RangeMax } if ($PSBoundParameters.ContainsKey('ValidValues')) { $complianceParams.ValidValues = $ValidValues } if ($PSBoundParameters.ContainsKey('ValidLevels')) { $complianceParams.ValidLevels = $ValidLevels } if ($PSBoundParameters.ContainsKey('MinimumValue')) { $complianceParams.MinimumValue = $MinimumValue } $complianceResult = Test-MdeSettingCompliance @complianceParams switch ($complianceResult) { "Compliant" { $compliantPolicies += $policy.name } "NonCompliant" { $nonCompliantPolicies += $policy.name } "NotConfigured" { $notConfiguredPolicies += $policy.name } } } elseif ($ComplianceCheck -in "NotRequired", "Manual") { # Setting not present in policy - treat as compliant for non-required/manual checks $compliantPolicies += $policy.name } else { $notConfiguredPolicies += $policy.name } } catch { Write-Verbose "Error analyzing configuration policy $($policy.name): $($_.Exception.Message)" $notConfiguredPolicies += $policy.name } } } switch ($ComplianceLogic) { "AnyPolicy" { # At least one policy must be compliant $isCompliant = $compliantPolicies.Count -gt 0 } default { # "AllPolicies" (default): every policy must be compliant $isCompliant = ($compliantPolicies.Count -gt 0) -and ($compliantPolicies.Count -eq $PolicyConfiguration.TotalCount) } } return @{ CompliantPolicies = $compliantPolicies NonCompliantPolicies = $nonCompliantPolicies NotConfiguredPolicies = $notConfiguredPolicies HasCompliant = $compliantPolicies.Count -gt 0 HasNonCompliant = $nonCompliantPolicies.Count -gt 0 HasNotConfigured = $notConfiguredPolicies.Count -gt 0 IsCompliant = $isCompliant ComplianceLogic = $ComplianceLogic } } |