Intune Compliance Policies Als Regie-instrument Voor Veilige Werkplekken

💼 Management Samenvatting

Intune compliance policies vormen het juridische en technische contract tussen het bestuur en iedere endpointbeheerder. Ze bepalen welke toestellen toegang krijgen tot Microsoft 365, welke configuraties verplicht zijn en hoe uitzonderingen worden geverifieerd. Binnen de Nederlandse Baseline voor Veilige Cloud functioneren deze policies als hard bewijs dat elk apparaat dezelfde beveiligingsmaatregelen afdwingt, ongeacht de leverancier of het platform. Door compliance policies professioneel te ontwerpen ontstaat een directe relatie tussen wettelijke kaders, Zero Trust-principes en de dagelijkse praktijk van werkplekbeheer.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
280u (tech: 160u)
Van toepassing op:
Microsoft 365 E5
Microsoft Intune
Windows 11
Windows 10
Android Enterprise
iOS/iPadOS
macOS

NIS2, BIO en AVG eisen aantoonbare beheersing van apparaatrisico’s. In audits blijkt steeds opnieuw dat instellingen als versleuteling, code-integriteit of anti-malwarestatus alleen geloofwaardig zijn wanneer een organisatie kan aantonen dat elk apparaat periodiek wordt getoetst tegen een vastgesteld normenkader. Intune compliance policies leveren deze toets. Zonder eenduidige policies ontstaat een lappendeken van verouderde instellingen, uitzonderingsgroepen zonder einddatum en data die niet langer als betrouwbaar wordt gezien. Dat leidt tot blokkades in change boards, boetes van toezichthouders en vooral het risico dat kritieke diensten uitvallen door een onbeveiligd device.

PowerShell Modules Vereist
Primary API: Microsoft Graph DeviceManagement en WindowsUpdates
Connection: Connect-MgGraph
Required Modules: Microsoft.Graph, Microsoft.Graph.Beta, Microsoft.Graph.DeviceManagement

Implementatie

Dit artikel beschrijft hoe organisaties binnen de Nederlandse publieke sector compliance policies strategisch positioneren, technisch ontwerpen en operationeel bewaken. We behandelen de governance die nodig is om beleid te koppelen aan risicobereidheid, de architectuur van instellingen per platform, de operationele monitoring via Microsoft Graph en het bewijsmateriaal voor auditors. Het gekoppelde PowerShell-script `code/m365/device-management/intune-compliance-policies.ps1` controleert automatisch of de policies aanwezig zijn, of toewijzingen actueel blijven en of uitzonderingen binnen de afgesproken termijnen worden opgelost.

Strategische Regie en Risicogestuurde Scope

Strategische regie begint bij het benoemen van compliance policies als kritieke controle binnen het informatiebeveiligingsbeleid. Bestuurders koppelen de policies aan concrete risicostellingen, bijvoorbeeld dat geen enkel apparaat zonder BitLocker, Secure Boot of actuele anti-malwareverbinding toegang krijgt tot workloads die persoonsgegevens of staatsgeheime documentatie bevatten. Deze stelling wordt vertaald naar een formeel besluit van het CISO-office en vastgelegd in het ISMS. Door het beleid in bestuurstaal uit te leggen, inclusief juridische verwijzingen naar BIO 12.1 en NIS2 artikel 21, begrijpen toezichthouders en departementale controllers precies waarom Intune de primaire bron van waarheid is voor endpointcompliance. De scope omvat niet alleen laptops en tablets maar ook industriële tablets, mobiele werkstations in voertuigen en hybride apparaten die zowel on-premises als cloudresources benaderen. Hiermee wordt voorkomen dat schaduw-IT buiten de zwaartekracht van het programma valt.

Het governance-model beschrijft hoe compliance policies samenhangen met andere besturingsorganen, zoals het patchboard, de privacy board en de change advisory board. Elke wijziging aan een policy vereist een risicobeoordeling, een impactanalyse op gebruikersproductiviteit en een communicatieplan. Door deze stappen te standaardiseren ontstaat een voorspelbare cadans: kwartaalreviews toetsen of de configuratiestandaard nog aansluit op nieuwe dreigingen, terwijl maandelijkse operatiemeetings analyseren of afwijkingen tijdig worden hersteld. De governance bepaalt tevens hoe uitzonderingen worden afgehandeld. Alleen een door het bestuur aangewezen functionaris mag een tijdelijke afwijking goedkeuren, waarbij het besluit een expliciete einddatum, compensatiemaatregel en incidentnummer bevat. Deze granulaire vastlegging is essentieel om tijdens inspecties aan te tonen dat de organisatie bewust omgaat met risico’s in plaats van ad-hoc beslissingen te nemen.

Strategische regie vraagt ook om een gedeeld begrippenkader tussen security, werkplekbeheer, leveranciers en juridische adviseurs. Daarom leggen organisaties in een compliance policy-handboek uit wat begrippen als device health, jailbreakdetectie of custom compliance scripts betekenen en welke minimale waarden gelden. Het handboek beschrijft hoe classificaties uit de Nederlandse Baseline voor Veilige Cloud vertaald worden naar technische drempels. Een informatieklasse "Zeer Vertrouwelijk" vereist bijvoorbeeld altijd device encryption, virtualisatiegebaseerde beveiliging en een maximale patchachterstand van zeven dagen. Door dit begrippenkader te koppelen aan training voor projectleiders, contractmanagers en leveranciers ontstaat een cultuur waarin iedereen dezelfde taal spreekt wanneer zij compliance policies bespreken. Dit is cruciaal om fouten tijdens aanbestedingen of migraties te voorkomen.

Tot slot hoort strategische regie bij meetbare prestatie-indicatoren. De organisatie definieert KPI’s zoals het percentage apparaten dat binnen 24 uur na inschrijving compliant is, de gemiddelde hersteltijd voor afwijkingen of het aantal uitzonderingen met verlopen einddatum. Deze indicatoren worden gevoed door Microsoft Graph-exports en het bijbehorende PowerShell-script. Rapportages gaan niet alleen naar techniekteams maar ook naar CIO’s, controllers en privacy officers zodat zij realtime zicht hebben op de naleving van wettelijke verplichtingen. Door KPI’s te koppelen aan bestuurstargets ontstaat een gesloten PDCA-cyclus waarin beleidskeuzes direct worden teruggevoerd naar technische uitvoering.

Architectuur en Ontwerp van Intune Compliance Policies

Gebruik PowerShell-script intune-compliance-policies.ps1 (functie Invoke-CompliancePolicyAssessment) – Controleert via Microsoft Graph of alle vereiste compliance policies bestaan, toegewezen zijn en actuele kerninstellingen bevatten voor Windows, macOS, iOS/iPadOS en Android..

Een volwassen architectuur verdeelt compliance policies over meerdere lagen. De eerste laag bevat platformspecifieke policies voor Windows, macOS, iOS/iPadOS en Android Enterprise. Deze policies delen een uniforme naamgevingsconventie, bijvoorbeeld NLVC-COMP-WIN-BASELINE, zodat rapportages automatisch gegroepeerd kunnen worden. Binnen Windows policies wordt versleuteling afgedwongen via BitLocker, wordt Device Health Attestation gecontroleerd en wordt geëist dat Windows Defender Antivirus real-time bescherming ingeschakeld houdt. Voor macOS bevat de architectuur eisen rond FileVault, systeemintegriteitsbescherming en Gatekeeper. Mobiele platforms krijgen instellingen voor jailbreakdetectie, minimale OS-versie, compliant MDM-registratie en een verbod op onbeveiligde e-mailclients. Door elk platform dezelfde governance-structuur te geven kan het script eenduidig toetsen of minimale parameters aanwezig zijn en of de policy de juiste gebruikersgroepen bereikt.

De tweede laag bestaat uit scenario policies die extra eisen stellen aan specifieke doelgroepen, zoals bestuurssecretariaten, OT-aansluitingen of laptops binnen GRIP-crisisorganisaties. Deze scenario policies zijn gebaseerd op informatieklassen en worden vaak gecombineerd met Conditional Access. Een crisiswerkplek krijgt bijvoorbeeld aanvullende eisen voor TPM 2.0, Virtualization Based Security en maximum leeftijd van antivirus-signatures. De architect beschrijft hoe deze scenario policies worden gekoppeld aan dynamische Entra ID-groepen die automatisch devices selecteren op basis van DeviceCategory, Ownership of registratietag. Door deze segmentatie ontstaan geen overlappende configuraties en kan het script in een oogopslag zien of een apparaat de juiste combinaties ontvangt.

Custom compliance scripts vormen de derde laag. Hiermee kunnen organisaties aanvullende controles uitvoeren, zoals het valideren van BitLocker-recovery key escrow, het controleren van BIOS-wachtwoorden of het meten van Defender for Endpoint sensorstatus. Het ontwerp beschrijft hoe deze scripts veilig worden ontwikkeld, geversioneerd en gedistribueerd via Intune. Alle scripts ondergaan code reviews, bevatten logging naar het security data lake en hebben ingebouwde time-outs zodat de maximaal vijftien seconden testtijd die intern wordt gehanteerd niet wordt overschreden. Het artikel benadrukt dat custom compliance alleen wordt ingezet wanneer standaardinstellingen tekortschieten, zodat beheerders niet verdrinken in maatwerk.

Tot slot beschrijft de architectuur de automatisering waarmee policies consistent blijven. GitOps-processen beheren JSON-exporten van policies, terwijl Azure Automation of GitHub Actions dagelijks controles uitvoeren met het aangeleverde script. Bij afwijkingen worden automatisch ITSM-tickets geopend en wordt het CAB geïnformeerd. In deze workflow is ook vastgelegd hoe nieuwe regelgeving, zoals aanvullende eisen uit de Europese AI-Act voor AI-werkplekken, leidt tot een herziening van de compliance policies. Door architectuur, scripts en changeproces strak aan elkaar te koppelen ontstaat een robuuste keten waarin Intune compliance policies niet alleen bestaan, maar aantoonbaar effectief blijven.

Operaties, Monitoring en Remediatie

Gebruik PowerShell-script intune-compliance-policies.ps1 (functie Invoke-CompliancePolicyOperations) – Genereert samenvattingen van compliant en non-compliant apparaten, signaleert verlopen uitzonderingen en exporteert bevindingen naar CSV binnen het vijftien seconden debugvenster..

Gebruik PowerShell-script intune-compliance-policies.ps1 (functie Invoke-CompliancePolicyRemediation) – Biedt stapsgewijze herstelinstructies, inclusief koppeling met ITSM, Conditional Access en communicatie naar proceseigenaren..

Operationeel beheer draait om constante feedback. Het script wordt elk uur in een gecontroleerde runbook uitgevoerd met LocalDebug-optie voor testtenants en live modus voor productie. De output wordt naar een Log Analytics workspace en het ITSM-systeem gestuurd, zodat analisten direct zien welke apparaten non-compliant zijn, welke policies geen assignments meer hebben en welke custom scripts fouten retourneren. Door operationele data te combineren met SOC-signalen ontstaat een compleet beeld van de endpointgezondheid. Ops-teams hanteren een drietrapsproces: detectie via het script, triage door het compliance team en remediatie door het device-team of de leverancier. Dit proces is gedocumenteerd in runbooks en gekoppeld aan een RACI-matrix zodat iedere betrokkene weet wanneer hij verantwoordelijk, aansprakelijk, geconsulteerd of geïnformeerd is.

Monitoring gebruikt meerdere databronnen. Microsoft Graph levert real-time compliance states, terwijl Defender for Endpoint exposure scores context geven over dreigingen. Intune analytics toont trends in policy-evaluaties en mislukte check-ins, terwijl Conditional Access logs inzicht bieden in blokkades die direct voortkomen uit compliance status. Alle data wordt verrijkt met metadata zoals informatieklasse, levenscyclusfase van het device en betrokken leverancier. Hierdoor kan het operations team prioriteiten toekennen op basis van impact op primaire processen, bijvoorbeeld verkiezingssoftware, noodhulpcommunicatie of vergunningensystemen. Dashboards in Power BI en Microsoft Sentinel zijn afgestemd op drie doelgroepen: tactische analisten, service managers en bestuurders. Zo krijgt iedere laag precies de informatie die nodig is om besluiten te nemen.

Remediatie sluit aan op bestaande serviceprocessen. Zodra het script een kritieke afwijking detecteert, zoals een ontbrekende compliance policy op een bestuursdevice, opent het automatisch een P1-ticket met alle relevante gegevens: device-ID, toegewezen gebruiker, laatste compliance-check en aanbevolen herstelactie. Servicedeskmedewerkers hebben toegang tot gestandaardiseerde draaiboeken waarin staat hoe zij een remote sync uitvoeren, hoe zij het device isoleren via Defender of hoe zij een tijdelijke blokkade instellen via Conditional Access. Communicatie naar de gebruiker gebeurt via een vooraf goedgekeurd template waarin de reden, verwachte impact en contactgegevens staan. Hierdoor blijft de organisatie transparant en worden verstoringen beperkt. Elke remediatie-actie eindigt met een validerende script-run zodat er bewijs is dat het device weer compliant is.

Het operationshoofdstuk behandelt ook capaciteits- en continuïteitsplanning. De organisatie rekent scenario’s door waarin binnen 24 uur honderden apparaten gecontroleerd moeten worden, bijvoorbeeld tijdens een zero-day exploit of een landelijke verkiezing. Door het script te optimaliseren voor snelle lokale tests kan een beheerder binnen vijftien seconden bevestigen dat nieuwe instellingen correct worden geëvalueerd voordat ze landelijk worden uitgerold. Daarnaast beschrijft het proces hoe failover plaatsvindt wanneer Intune of Graph tijdelijk niet beschikbaar zijn. In dat geval worden caches van de laatste succesvolle run gebruikt om prioriteiten te bepalen en worden alternatieve beheerkanalen zoals Configuration Manager of PowerShell-Remoting geactiveerd. Zo blijft de complianceketen stabiel, zelfs onder zware druk.

Assurance, Bewijsvoering en Continue Verbetering

Assurance vereist een sluitende administratie. Elke wijziging aan een compliance policy wordt automatisch geëxporteerd naar JSON en opgeslagen in een Git-repository met versiebeheer, reviewerlog en CAB-referentie. Het PowerShell-script voegt bij iedere run een auditrecord toe met tijdstip, Graph-request-ID en hash van de aangetroffen configuratie. Deze records worden zeven jaar bewaard in een immutabele storagecontainer, zodat auditors kunnen aantonen dat beleidsinstellingen niet tussentijds ongemerkt zijn veranderd. Het assuranceproces omvat ook de validatie van uitzonderingen. Wanneer een device een tijdelijke vrijstelling krijgt, wordt het besluit vastgelegd met risicoclassificatie, einddatum en compenserende maatregelen. Het script controleert dagelijks of einddata zijn verstreken en dwingt herbeoordeling af. Hierdoor is altijd zichtbaar dat uitzonderingen onder bestuurlijke regie staan.

De organisatie combineert technische bewijslast met procesdocumentatie. Service catalogi beschrijven welke diensten worden geleverd, welke KPI’s gelden en welke rapportages beschikbaar zijn. Elk kwartaal wordt een assurance-rapport opgesteld waarin trends, incidenten en verbetermaatregelen staan. Dit rapport bevat koppelingen naar Power BI-dashboards, scriptexports en CAB-notulen. Auditors krijgen toegang tot een leesportaal waarin zij zelf steekproeven kunnen draaien op basis van device-ID’s of gebruikersgroepen. Door deze transparantie ontstaat vertrouwen tussen bestuurders, toezichthouders en het uitvoeringsteam. Bovendien verkort het de tijd die nodig is voor BIO- en NIS2-audits aanzienlijk, omdat documenten klaarstaan in gestandaardiseerde formats.

Continue verbetering wordt ingericht als een PDCA-cyclus waarin bevindingen uit audits, incidenten en gebruikersfeedback worden vertaald naar concrete acties. Het compliance team plant elke zes weken een retro-sessie met vertegenwoordigers van SOC, servicedesk, privacy en leveranciers. Tijdens deze sessie worden metrics geanalyseerd, zoals gemiddelde tijd tot remediatie, aantal scripts dat moest worden bijgewerkt of de impact van nieuwe OS-versies op compliant status. Acties krijgen een eigenaar en een deadline en worden gevolgd in het centrale GRC-platform. Zodra een actie is afgerond, controleert het script automatisch of de betreffende policywijziging daadwerkelijk live staat en of devices de nieuwe eisen hebben opgehaald. Daarmee wordt het verbeterproces direct gekoppeld aan meetbare uitkomsten.

Tot slot richt de organisatie zich op kennisborging en samenwerking. Nieuwe teamleden doorlopen een opleidingspad waarin zij leren hoe compliance policies zijn opgebouwd, hoe scripts worden gebruikt en hoe beslissingen worden gedocumenteerd. Leveranciers nemen deel aan halfjaarlijkse maturity-assessments waarin zij aantonen hoe hun diensten bijdragen aan de complianceketen. De resultaten worden gedeeld binnen het communityplatform van de Nederlandse Baseline voor Veilige Cloud, zodat andere overheidsorganisaties kunnen profiteren van lessons learned. Door kennisdeling onderdeel te maken van assurance ontstaat een lerende sector, waarin verbeteringen sneller worden opgeschaald en fouten minder vaak worden herhaald.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Baseline-assessment en operationsrapportage voor Intune compliance policies. .DESCRIPTION Controleert of alle noodzakelijke compliance policies bestaan, toegewezen zijn en actuele instellingen bevatten en levert operationele inzichten plus remediatie-instructies volgens de Nederlandse Baseline voor Veilige Cloud. .NOTES Filename : intune-compliance-policies.ps1 Author : Nederlandse Baseline voor Veilige Cloud Version : 1.0 Related : content/m365/device-management/intune-compliance-policies.json .EXAMPLE .\intune-compliance-policies.ps1 -Assessment -LocalDebug .EXAMPLE .\intune-compliance-policies.ps1 -Operations -ExportPath .\compliance-status.csv #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph.DeviceManagement [CmdletBinding(DefaultParameterSetName = 'Assessment')] param( [Parameter(ParameterSetName = 'Assessment')] [switch]$Assessment, [Parameter(ParameterSetName = 'Operations')] [switch]$Operations, [Parameter(ParameterSetName = 'Remediation')] [switch]$Remediation, [switch]$LocalDebug, [string]$ExportPath, [switch]$WhatIf ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Intune Compliance Policies Baseline" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Initialize-IntuneContext { if ($LocalDebug) { Write-Verbose "LocalDebug actief: Graph-verbinding wordt overgeslagen." return } $context = Get-MgContext if (-not $context) { Write-Host "Verbinden met Microsoft Graph..." -ForegroundColor Yellow $null = Connect-MgGraph -Scopes @( 'DeviceManagementConfiguration.Read.All', 'DeviceManagementManagedDevices.Read.All', 'DeviceManagementServiceConfig.Read.All' ) -ErrorAction Stop $context = Get-MgContext } if ($context.ApiVersion -ne 'beta') { Select-MgProfile -Name 'beta' } } function Invoke-PagedGraphRequest { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$Uri ) $results = @() $nextLink = $Uri while ($nextLink) { $response = Invoke-MgGraphRequest -Method GET -Uri $nextLink -ErrorAction Stop if ($response.value) { $results += $response.value } $nextLink = if ($response.'@odata.nextLink') { $response.'@odata.nextLink' } else { $null } } return $results } function Get-ItemCount { [CmdletBinding()] param( $InputObject ) if ($null -eq $InputObject) { return 0 } if ($InputObject -is [System.Array] -or $InputObject -is [System.Collections.ICollection]) { return $InputObject.Count } return 1 } function Get-ComplianceSampleData { $now = Get-Date return [pscustomobject]@{ Policies = @( [pscustomobject]@{ displayName = 'NLVC-COMP-WIN-BASELINE' '@odata.type' = '#microsoft.graph.windows10CompliancePolicy' lastModifiedDateTime = $now.AddDays(-20) assignments = @('EntraID:NLVC-Windows-Prod') bitLockerEnabled = $true secureBootEnabled = $true deviceThreatProtectionEnabled = $true scheduledActionsForRule = @( @{ scheduledActionConfigurations = @( @{ actionType = 'block' } ) } ) }, [pscustomobject]@{ displayName = 'NLVC-COMP-MAC-BASELINE' '@odata.type' = '#microsoft.graph.macOSCompliancePolicy' lastModifiedDateTime = $now.AddDays(-30) assignments = @('EntraID:NLVC-Mac') systemIntegrityProtectionEnabled = $true gatekeeperAllowedAppSource = 'macAppStoreWithIdentifiedDevelopers' scheduledActionsForRule = @( @{ scheduledActionConfigurations = @( @{ actionType = 'block' } ) } ) }, [pscustomobject]@{ displayName = 'NLVC-COMP-ANDROID' '@odata.type' = '#microsoft.graph.androidDeviceOwnerCompliancePolicy' lastModifiedDateTime = $now.AddDays(-15) assignments = @('EntraID:NLVC-Android') securityBlockJailbrokenDevices = $true passwordRequired = $true scheduledActionsForRule = @( @{ scheduledActionConfigurations = @( @{ actionType = 'block' } ) } ) }, [pscustomobject]@{ displayName = 'NLVC-COMP-IOS' '@odata.type' = '#microsoft.graph.iosCompliancePolicy' lastModifiedDateTime = $now.AddDays(-18) assignments = @('EntraID:NLVC-iOS') passcodeRequired = $true deviceThreatProtectionEnabled = $true scheduledActionsForRule = @( @{ scheduledActionConfigurations = @( @{ actionType = 'block' } ) } ) } ) CustomScripts = @( [pscustomobject]@{ displayName = 'NLVC-BitLocker-Validator' lastModifiedDateTime = $now.AddDays(-10) assignments = @('EntraID:NLVC-Windows-Prod') } ) Devices = @( [pscustomobject]@{ deviceName = 'RWS-LAP-0101' userDisplayName = 'beheerder@voorbeeld.nl' operatingSystem = 'Windows 11' complianceState = 'compliant' lastSyncDateTime = $now.AddHours(-5) }, [pscustomobject]@{ deviceName = 'Gemeente-LAP-533' userDisplayName = 'gebruiker@voorbeeld.nl' operatingSystem = 'Windows 10' complianceState = 'noncompliant' lastSyncDateTime = $now.AddDays(-3) } ) Exemptions = @( [pscustomobject]@{ DeviceName = 'Inspectie-Tablet-12' Owner = 'Inspectie ILT' Reason = 'Specialistische sensoren' ExpiresOn = $now.AddDays(-1) } ) } } function Get-ComplianceInventory { Initialize-IntuneContext if ($LocalDebug) { return Get-ComplianceSampleData } $policies = Invoke-PagedGraphRequest -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies?`$expand=assignments,scheduledActionsForRule" $scripts = Invoke-PagedGraphRequest -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceComplianceScripts?`$expand=assignments" $devices = Invoke-PagedGraphRequest -Uri "https://graph.microsoft.com/beta/deviceManagement/managedDevices?`$select=deviceName,userDisplayName,operatingSystem,lastSyncDateTime,complianceState&`$top=999" return [pscustomobject]@{ Policies = $policies CustomScripts= $scripts Devices = $devices Exemptions = @() } } function Get-PolicyPlatform { param( [Parameter(Mandatory)] $Policy ) $type = if ($Policy.PSObject.Properties['@odata.type']) { $Policy.'@odata.type' } else { '' } switch -Regex ($type) { 'windows10' { return 'Windows' } 'macOS' { return 'macOS' } 'ios' { return 'iOS' } 'android' { return 'Android' } default { return 'Onbekend' } } } function Test-PolicySetting { param( [Parameter(Mandatory)] $Policy, [Parameter(Mandatory)] [string[]]$RequiredProperties, [string]$DisplayName ) $issues = @() foreach ($property in $RequiredProperties) { $prop = $Policy.PSObject.Properties[$property] if (-not $prop -or -not $prop.Value) { $issues += "Instelling '$property' ontbreekt of staat uit in policy '$DisplayName'." } } return $issues } function Invoke-CompliancePolicyAssessment { try { $inventory = Get-ComplianceInventory $issues = @() $platforms = @('Windows','macOS','Android','iOS') foreach ($platform in $platforms) { if (-not ($inventory.Policies | Where-Object { (Get-PolicyPlatform $_) -eq $platform })) { $issues += "Er is geen compliance policy gevonden voor platform $platform." } } $staleThreshold = (Get-Date).AddDays(-90) foreach ($policy in $inventory.Policies) { $platform = Get-PolicyPlatform -Policy $policy $display = if ($policy.PSObject.Properties['displayName']) { $policy.displayName } else { 'Onbekend' } $assignments = if ($policy.PSObject.Properties['assignments']) { @($policy.assignments) } else { @() } if ((Get-ItemCount $assignments) -eq 0) { $issues += "Policy '$display' heeft geen assignments." } $lastModified = if ($policy.PSObject.Properties['lastModifiedDateTime']) { [datetime]$policy.lastModifiedDateTime } else { $null } if ($lastModified -and $lastModified -lt $staleThreshold) { $issues += "Policy '$display' is ouder dan 90 dagen; voer een review uit." } $required = switch ($platform) { 'Windows' { @('bitLockerEnabled','secureBootEnabled','deviceThreatProtectionEnabled') } 'macOS' { @('systemIntegrityProtectionEnabled','gatekeeperAllowedAppSource') } 'Android' { @('securityBlockJailbrokenDevices','passwordRequired') } 'iOS' { @('passcodeRequired','deviceThreatProtectionEnabled') } default { @() } } if ((Get-ItemCount $required) -gt 0) { $issues += Test-PolicySetting -Policy $policy -RequiredProperties $required -DisplayName $display } $scheduled = if ($policy.PSObject.Properties['scheduledActionsForRule']) { $policy.scheduledActionsForRule | ForEach-Object { $_.scheduledActionConfigurations } } else { @() } $hasBlock = $false foreach ($config in $scheduled) { if ($config.actionType -eq 'block') { $hasBlock = $true break } } if (-not $hasBlock) { $issues += "Policy '$display' heeft geen block-actie in scheduledActionsForRule." } } $customScripts = @($inventory.CustomScripts) if ((Get-ItemCount $customScripts) -eq 0) { $issues += "Er zijn geen custom compliance scripts gevonden; valideer of aanvullende controles vereist zijn." } if ((Get-ItemCount $issues) -eq 0) { Write-Host "COMPLIANT: Alle gecontroleerde instellingen voldoen aan de baseline." -ForegroundColor Green return 0 } else { Write-Host ("NON-COMPLIANT: Er zijn {0} bevindingen gevonden." -f (Get-ItemCount $issues)) -ForegroundColor Red $issues | ForEach-Object { Write-Host " - $_" -ForegroundColor Yellow } return 1 } } catch { Write-Host "ERROR tijdens assessment: $_" -ForegroundColor Red return 2 } } function Invoke-CompliancePolicyOperations { param( [string]$ExportPath ) try { $inventory = Get-ComplianceInventory $now = Get-Date $deviceSummary = foreach ($device in $inventory.Devices) { $lastSync = if ($device.PSObject.Properties['lastSyncDateTime']) { [datetime]$device.lastSyncDateTime } else { $null } $hoursSinceSync = if ($lastSync) { [math]::Round(($now - $lastSync).TotalHours, 1) } else { [double]::PositiveInfinity } [pscustomobject]@{ DeviceName = if ($device.PSObject.Properties['deviceName']) { $device.deviceName } else { 'Onbekend' } User = if ($device.PSObject.Properties['userDisplayName']) { $device.userDisplayName } else { 'Onbekend' } OperatingSystem = if ($device.PSObject.Properties['operatingSystem']) { $device.operatingSystem } else { 'Onbekend' } ComplianceState = if ($device.PSObject.Properties['complianceState']) { $device.complianceState } else { 'unknown' } HoursSinceSync = $hoursSinceSync } } $nonCompliant = $deviceSummary | Where-Object { $_.ComplianceState -ne 'compliant' -or $_.HoursSinceSync -gt 48 } $expiredExemptions = $inventory.Exemptions | Where-Object { $_.ExpiresOn -and $_.ExpiresOn -lt $now } Write-Host ("Totaal gecontroleerde apparaten: {0}" -f (Get-ItemCount $deviceSummary)) -ForegroundColor Cyan Write-Host ("Apparaten met open bevindingen: {0}" -f (Get-ItemCount $nonCompliant)) -ForegroundColor Yellow if ((Get-ItemCount $expiredExemptions) -gt 0) { Write-Host "`nVerlopen uitzonderingen:" -ForegroundColor Red $expiredExemptions | Format-Table DeviceName,Owner,Reason,ExpiresOn -AutoSize | Out-String | Write-Host } if ($ExportPath) { $directory = Split-Path -Parent $ExportPath if ($directory -and -not (Test-Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $deviceSummary | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8 Write-Host "Rapport geëxporteerd naar $ExportPath" -ForegroundColor Green } if ((Get-ItemCount $nonCompliant) -gt 0 -or (Get-ItemCount $expiredExemptions) -gt 0) { return 1 } return 0 } catch { Write-Host "ERROR tijdens operations-rapportage: $_" -ForegroundColor Red return 2 } } function Invoke-CompliancePolicyRemediation { try { Write-Host "Remediatie-aanwijzingen voor Intune compliance policies:" -ForegroundColor Yellow Write-Host "1. Valideer in Intune admin center > Apparaten > Compliance policies of alle platformen een toegewezen baseline hebben." -ForegroundColor Gray Write-Host "2. Controleer per policy de block-actie onder Actions for noncompliance en stel minimaal één dag-deadline in." -ForegroundColor Gray Write-Host "3. Gebruik custom compliance scripts om aanvullende BIO-eisen (zoals BitLocker escrow) te bevestigen en koppel deze aan dynamische groepen." -ForegroundColor Gray Write-Host "4. Synchroniseer non-compliant apparaten via Remote device actions en documenteer iedere interventie in ITSM." -ForegroundColor Gray Write-Host "5. Rapporteer status naar het patchboard en sluit uitzonderingen met verlopen einddata direct af." -ForegroundColor Gray if ($WhatIf) { Write-Host "`nWhatIf actief: er zijn geen aanpassingen gedaan." -ForegroundColor Yellow } return 0 } catch { Write-Host "ERROR tijdens remediatie-instructies: $_" -ForegroundColor Red return 2 } } try { switch ($PSCmdlet.ParameterSetName) { 'Assessment' { $exitCode = Invoke-CompliancePolicyAssessment exit $exitCode } 'Operations' { $exitCode = Invoke-CompliancePolicyOperations -ExportPath $ExportPath exit $exitCode } 'Remediation' { $exitCode = Invoke-CompliancePolicyRemediation exit $exitCode } default { Write-Host "Gebruik -Assessment, -Operations of -Remediation (optioneel -LocalDebug, -ExportPath, -WhatIf)." -ForegroundColor Yellow } } } catch { Write-Host "Onverwachte fout: $_" -ForegroundColor Red exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Devicebeheer blijft versnipperd, uitzonderingen worden niet bewaakt en audits tonen aan dat de organisatie geen aantoonbare controle heeft over endpointconfiguraties. Dit leidt tot maatregelen van toezichthouders, reputatieschade en verhoogde kans op ransomware.

Management Samenvatting

Veranker Intune compliance policies als bestuurlijke controle, ontwerp platform- en scenario policies, automatiseer monitoring met `code/m365/device-management/intune-compliance-policies.ps1` en leg alle besluiten vast voor audits.