|
| 1 | +function Invoke-ListCompliancePolicies { |
| 2 | + <# |
| 3 | + .FUNCTIONALITY |
| 4 | + Entrypoint |
| 5 | + .ROLE |
| 6 | + Endpoint.MEM.Read |
| 7 | + #> |
| 8 | + [CmdletBinding()] |
| 9 | + param($Request, $TriggerMetadata) |
| 10 | + |
| 11 | + $APIName = $Request.Params.CIPPEndpoint |
| 12 | + $Headers = $Request.Headers |
| 13 | + Write-LogMessage -headers $Headers -API $APIName -message 'Accessed this API' -Sev 'Debug' |
| 14 | + |
| 15 | + $TenantFilter = $Request.Query.tenantFilter |
| 16 | + |
| 17 | + try { |
| 18 | + # Use bulk requests to get groups and compliance policies |
| 19 | + $BulkRequests = @( |
| 20 | + @{ |
| 21 | + id = 'Groups' |
| 22 | + method = 'GET' |
| 23 | + url = '/groups?$top=999&$select=id,displayName' |
| 24 | + } |
| 25 | + @{ |
| 26 | + id = 'CompliancePolicies' |
| 27 | + method = 'GET' |
| 28 | + url = '/deviceManagement/deviceCompliancePolicies?$expand=assignments&$orderby=displayName' |
| 29 | + } |
| 30 | + ) |
| 31 | + |
| 32 | + $BulkResults = New-GraphBulkRequest -Requests $BulkRequests -tenantid $TenantFilter |
| 33 | + |
| 34 | + # Extract results |
| 35 | + $Groups = ($BulkResults | Where-Object { $_.id -eq 'Groups' }).body.value |
| 36 | + $Policies = ($BulkResults | Where-Object { $_.id -eq 'CompliancePolicies' }).body.value |
| 37 | + |
| 38 | + $GraphRequest = [System.Collections.Generic.List[object]]::new() |
| 39 | + |
| 40 | + foreach ($Policy in $Policies) { |
| 41 | + # Determine policy type from @odata.type |
| 42 | + $policyType = switch -Wildcard ($Policy.'@odata.type') { |
| 43 | + '*windows10CompliancePolicy*' { 'Windows 10/11 Compliance' } |
| 44 | + '*windowsPhone81CompliancePolicy*' { 'Windows Phone 8.1 Compliance' } |
| 45 | + '*windows81CompliancePolicy*' { 'Windows 8.1 Compliance' } |
| 46 | + '*iosCompliancePolicy*' { 'iOS Compliance' } |
| 47 | + '*macOSCompliancePolicy*' { 'macOS Compliance' } |
| 48 | + '*androidCompliancePolicy*' { 'Android Compliance' } |
| 49 | + '*androidDeviceOwnerCompliancePolicy*' { 'Android Enterprise Compliance' } |
| 50 | + '*androidWorkProfileCompliancePolicy*' { 'Android Work Profile Compliance' } |
| 51 | + '*aospDeviceOwnerCompliancePolicy*' { 'AOSP Compliance' } |
| 52 | + default { 'Compliance Policy' } |
| 53 | + } |
| 54 | + |
| 55 | + # Process assignments |
| 56 | + $PolicyAssignment = [System.Collections.Generic.List[string]]::new() |
| 57 | + $PolicyExclude = [System.Collections.Generic.List[string]]::new() |
| 58 | + |
| 59 | + if ($Policy.assignments) { |
| 60 | + foreach ($Assignment in $Policy.assignments) { |
| 61 | + $target = $Assignment.target |
| 62 | + switch ($target.'@odata.type') { |
| 63 | + '#microsoft.graph.allDevicesAssignmentTarget' { $PolicyAssignment.Add('All Devices') } |
| 64 | + '#microsoft.graph.allLicensedUsersAssignmentTarget' { $PolicyAssignment.Add('All Licensed Users') } |
| 65 | + '#microsoft.graph.groupAssignmentTarget' { |
| 66 | + $groupName = ($Groups | Where-Object { $_.id -eq $target.groupId }).displayName |
| 67 | + if ($groupName) { $PolicyAssignment.Add($groupName) } |
| 68 | + } |
| 69 | + '#microsoft.graph.exclusionGroupAssignmentTarget' { |
| 70 | + $groupName = ($Groups | Where-Object { $_.id -eq $target.groupId }).displayName |
| 71 | + if ($groupName) { $PolicyExclude.Add($groupName) } |
| 72 | + } |
| 73 | + } |
| 74 | + } |
| 75 | + } |
| 76 | + |
| 77 | + $Policy | Add-Member -NotePropertyName 'PolicyTypeName' -NotePropertyValue $policyType -Force |
| 78 | + $Policy | Add-Member -NotePropertyName 'PolicyAssignment' -NotePropertyValue ($PolicyAssignment -join ', ') -Force |
| 79 | + $Policy | Add-Member -NotePropertyName 'PolicyExclude' -NotePropertyValue ($PolicyExclude -join ', ') -Force |
| 80 | + |
| 81 | + $GraphRequest.Add($Policy) |
| 82 | + } |
| 83 | + |
| 84 | + $StatusCode = [HttpStatusCode]::OK |
| 85 | + } catch { |
| 86 | + $ErrorMessage = Get-NormalizedError -Message $_.Exception.Message |
| 87 | + $StatusCode = [HttpStatusCode]::Forbidden |
| 88 | + $GraphRequest = $ErrorMessage |
| 89 | + } |
| 90 | + |
| 91 | + return ([HttpResponseContext]@{ |
| 92 | + StatusCode = $StatusCode |
| 93 | + Body = @($GraphRequest) |
| 94 | + }) |
| 95 | +} |
0 commit comments