Skip to content

Commit 2856a6b

Browse files
committed
Feat: Implement Invoke-ListCompliancePolicies function to retrieve compliance policies and their assignments
1 parent fc08ca5 commit 2856a6b

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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

Comments
 (0)