Skip to content

Commit

Permalink
Merge pull request microsoft#4828 from FabienTschanz/feat/intune-offl…
Browse files Browse the repository at this point in the history
…ine-filtering

Add filter functions to Intune resources
  • Loading branch information
NikCharlebois authored Jul 4, 2024
2 parents f7bd0cd + 30f97b4 commit 431c665
Show file tree
Hide file tree
Showing 14 changed files with 144 additions and 0 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,12 @@
* Add missing property `ExternalAccessWithTrialTenants`
FIXES [#4829](https://github.com/microsoft/Microsoft365DSC/issues/4829)
* M365DSCDRGUtil
* Added Microsoft Graph filter functions.
* Force array as parameter in `Compare-M365DSCIntunePolicyAssignment`.
* MISC
* Added support for `startswith`, `endswith` and `contains` filter methods to Intune resources
that did not support it previously.
FIXES [#4597](https://github.com/microsoft/Microsoft365DSC/issues/4597)
* Fixes issues with values of type `groupSettingCollection` and `choiceSetting`
when creating the settings catalog policy settings body.
* DEPENDENCIES
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,14 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configPolicies = Get-MgBetaDeviceAppManagementTargetedManagedAppConfiguration -All:$true -Filter $Filter -ErrorAction Stop
$configPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configPolicies

$i = 1
$dscContent = ''
if ($configPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1102,7 +1102,14 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$policies = Get-MgBetaDeviceAppManagementAndroidManagedAppProtection -All:$true -Filter $Filter -ErrorAction Stop
$policies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $policies

$i = 1
$dscContent = ''
if ($policies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1153,7 +1153,14 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$policies = Get-MgBetaDeviceAppManagementiOSManagedAppProtection -All:$true -Filter $Filter -ErrorAction Stop
$policies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $policies

$i = 1
$dscContent = ''
if ($policies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,14 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
Write-Warning -Message "Microsoft Graph filter is only supported for the platform on this resource. Other filters are only supported using startswith, endswith and contains and done by best-effort."
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$assignmentFilters = Get-MgBetaDeviceManagementAssignmentFilter -All:$true -Filter $Filter -ErrorAction Stop
$assignmentFilters = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $assignmentFilters

if ($policies.Length -eq 0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -806,9 +806,16 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configDeviceAndroidPolicies = Get-MgBetaDeviceManagementDeviceCompliancePolicy `
-ErrorAction Stop -All:$true -Filter $Filter | Where-Object `
-FilterScript { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.androidCompliancePolicy' }
$configDeviceAndroidPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configDeviceAndroidPolicies

$i = 1
$dscContent = ''
if ($configDeviceAndroidPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -656,11 +656,18 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configDeviceAndroidPolicies = Get-MgBetaDeviceManagementDeviceCompliancePolicy `
-ErrorAction Stop -All:$true -Filter $Filter | Where-Object `
-FilterScript {
$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.androidDeviceOwnerCompliancePolicy'
}
$configDeviceAndroidPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configDeviceAndroidPolicies

$i = 1
$dscContent = ''
if ($configDeviceAndroidPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -769,9 +769,16 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configDeviceAndroidPolicies = Get-MgBetaDeviceManagementDeviceCompliancePolicy `
-ErrorAction Stop -All:$true -Filter $Filter | Where-Object `
-FilterScript { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.androidWorkProfileCompliancePolicy' }
$configDeviceAndroidPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configDeviceAndroidPolicies

$i = 1
$dscContent = ''
if ($configDeviceAndroidPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -718,9 +718,16 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configDeviceMacOsPolicies = Get-MgBetaDeviceManagementDeviceCompliancePolicy `
-ErrorAction Stop -All:$true -Filter $Filter | Where-Object `
-FilterScript { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.macOSCompliancePolicy' }
$configDeviceMacOsPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configDeviceMacOsPolicies

$i = 1
$dscContent = ''
if ($configDeviceMacOsPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -850,9 +850,16 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configDeviceWindowsPolicies = Get-MgBetaDeviceManagementDeviceCompliancePolicy `
-ErrorAction Stop -All:$true -Filter $Filter | Where-Object `
-FilterScript { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.windows10CompliancePolicy' }
$configDeviceWindowsPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configDeviceWindowsPolicies

$i = 1
$dscContent = ''
if ($configDeviceWindowsPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -699,9 +699,16 @@ function Export-TargetResource

try
{
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$configDeviceiOsPolicies = Get-MgBetaDeviceManagementDeviceCompliancePolicy `
-ErrorAction Stop -All:$true -Filter $Filter | Where-Object `
-FilterScript { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.iosCompliancePolicy' }
$configDeviceiOsPolicies = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $configDeviceiOsPolicies

$i = 1
$dscContent = ''
if ($configDeviceiOsPolicies.Length -eq 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -950,7 +950,13 @@ function Export-TargetResource
try
{
#region resource generator code
if (-not [string]::IsNullOrEmpty($Filter))
{
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$getValue = Get-MgBetaDeviceAppManagementMdmWindowsInformationProtectionPolicy -Filter $Filter -All -ErrorAction Stop
$getValue = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $getValue
#endregion

$i = 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,14 @@ function Export-TargetResource
#region resource generator code
# Filter not supported on this resource
# [array]$getValue = Get-MgBetaDeviceManagementWindowsFeatureUpdateProfile -Filter $Filter -All -ErrorAction Stop
if (-not [string]::IsNullOrEmpty($Filter))
{
Write-Warning -Message "Microsoft Graph filter is not supported on this resource. Only best-effort filtering using startswith, endswith and contains is supported."
$complexFunctions = Get-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
$Filter = Remove-ComplexFunctionsFromFilterQuery -FilterQuery $Filter
}
[array]$getValue = Get-MgBetaDeviceManagementWindowsFeatureUpdateProfile -All -ErrorAction Stop
$getValue = Find-GraphDataUsingComplexFunctions -ComplexFunctions $complexFunctions -Policies $getValue
#endregion

$i = 1
Expand Down
56 changes: 56 additions & 0 deletions Modules/Microsoft365DSC/Modules/M365DSCDRGUtil.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -1996,3 +1996,59 @@ function Update-IntuneDeviceConfigurationPolicy
return $null
}
}

function Get-ComplexFunctionsFromFilterQuery {
[CmdletBinding()]
[OutputType([System.Array])]
param (
[string]$FilterQuery
)

$complexFunctionsRegex = "startswith\((.*?),\s*'(.*?)'\)|endswith\((.*?),\s*'(.*?)'\)|contains\((.*?),\s*'(.*?)'\)"
[array]$complexFunctions = [regex]::Matches($FilterQuery, $complexFunctionsRegex) | ForEach-Object {
$_.Value
}

return $complexFunctions
}

function Remove-ComplexFunctionsFromFilterQuery {
[CmdletBinding()]
[OutputType([System.String])]
param (
[string]$FilterQuery
)

$complexFunctionsRegex = "startswith\((.*?),\s*'(.*?)'\)|endswith\((.*?),\s*'(.*?)'\)|contains\((.*?),\s*'(.*?)'\)"
$basicFilterQuery = [regex]::Replace($FilterQuery, $complexFunctionsRegex, "").Trim()
$basicFilterQuery = $basicFilterQuery -replace "^and\s","" -replace "\sand$","" -replace "\sand\s+", " and " -replace "\sor\s+", " or "

return $basicFilterQuery
}

function Find-GraphDataUsingComplexFunctions {
[CmdletBinding()]
[OutputType([System.Array])]
param (
[array]$Policies,
[array]$ComplexFunctions
)

foreach ($function in $ComplexFunctions) {
if ($function -match "startswith\((.*?),\s*'(.*?)'") {
$property = $matches[1]
$value = $matches[2]
$Policies = $Policies | Where-Object { $_.$property -like "$value*" }
} elseif ($function -match "endswith\((.*?),\s*'(.*?)'") {
$property = $matches[1]
$value = $matches[2]
$Policies = $Policies | Where-Object { $_.$property -like "*$value" }
} elseif ($function -match "contains\((.*?),\s*'(.*?)'") {
$property = $matches[1]
$value = $matches[2]
$Policies = $Policies | Where-Object { $_.$property -like "*$value*" }
}
}

return $Policies
}

0 comments on commit 431c665

Please sign in to comment.