Microsoft Defender Voor Endpoint: Gestandaardiseerde Device-onboarding

💼 Management Samenvatting

Device-onboarding vormt de ruggengraat van Microsoft Defender voor Endpoint binnen Nederlandse overheden en bepaalt of elk endpoint vanaf de eerste minuut onder Zero Trust-verdediging valt.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
400u (tech: 220u)
Van toepassing op:
Microsoft 365 E5
Microsoft Defender voor Endpoint Plan 2
Windows 11 Enterprise
Windows 10 LTSC
macOS Sonoma
Linux Servers

Zonder uniform onboardingproces ontstaan shadow endpoints die wel productiedata verwerken maar geen sensor, netwerkbescherming of attack surface reduction ontvangen. Dat leidt tot gaten in incidentrespons, niet-naleving van BIO- en NIS2-eisen en gebrek aan vertrouwen bij bestuurders wanneer auditors vragen naar aantoonbare beveiliging.

PowerShell Modules Vereist
Primary API: Microsoft Graph Security API, Microsoft Graph DeviceManagement, Microsoft Defender for Endpoint API
Connection: Connect-MgGraph, Select-MgProfile beta, Invoke-RestMethod naar https://api.security.microsoft.com
Required Modules: Microsoft.Graph.Beta, Microsoft.Graph.DeviceManagement, Microsoft.Graph.Security

Implementatie

Dit artikel beschrijft hoe u governance, technische provisioning en operationele monitoring rond device-onboarding structureert, inclusief het PowerShell-script dat controles automatiseert en bewijs levert voor audits.

Strategische context en governance van onboarding

Een modern Nederlands overheidslandschap beheert gemiddeld meer dan twintigduizend laptops, tablets, veldwerkstations en specialistische OT-clients die allemaal toegang willen tot Microsoft 365 en Defender voor Endpoint. Zonder een gestandaardiseerd onboardingproces wordt iedere migratie naar Windows 11, macOS Sonoma of een Linux beheerimage een maatwerkproject, terwijl bestuurders juist verwachten dat security-controls als onderdeel van de baseline automatisch worden toegepast. Door onboarding als strategische capability te behandelen ontstaat er een duidelijke relatie tussen businessdoelstellingen, beveiligingsarchitectuur en device lifecycle, waarin elke asset vanaf levering aantoonbaar wordt ingeschreven in Defender, Intune en het assetregister. Deze sectie beschrijft waarom een consistent onboardingprogramma de basis vormt voor Zero Trust en voor de naleving van de Nederlandse Baseline voor Veilige Cloud.

Wanneer organisaties onboarding overlaten aan losse projectteams ontstaan er ongedocumenteerde uitzonderingen, ontbrekende certificaten en endpoints die wel in Azure AD verschijnen maar nooit een Defender-sensor ontvangen. Deze half ingestroomde apparaten worden al snel shadow endpoints die geen netwerkbescherming, attack surface reduction of tamper protection afdwingen en daardoor aantrekkelijk zijn voor ransomwaregroepen. In audits blijkt bovendien dat incidentresponders vaak niet weten wie eigenaar is van een apparaat dat nooit is gekoppeld aan het configuration management database. Een eenduidige onboardingroute verkleint deze gaten door identieke stappen te doorlopen voor ieder device: contractuele acceptatie bij de leverancier, verificatie bij inname, inschrijving in Intune, automatische publicatie van labels en registratie in Defender voor Endpoint.

Een volwassen onboardingprogramma vereist een governance-structuur waarin de CIO, CISO, Chief Procurement Officer en FG ieder een expliciet mandaat hebben. De CIO borgt de capaciteit van logistieke hubs en imagingstraten, de CISO bewaakt dat alleen goedgekeurde onboardingprofielen worden gebruikt, de inkoopafdeling legt security-eisen contractueel vast en de FG ziet erop toe dat device logging voldoet aan privacykaders. De stuurgroep koppelt onboarding aan change- en releaseprocessen zodat afwijkingen nooit buiten CAB of beveiligingsboard om worden uitgevoerd. Hierdoor wordt onboarding niet ervaren als een technisch ritueel, maar als een bestuurlijke controle die voorkomt dat identiteiten, certificaten en gevoelige data op onbeheerste endpoints belanden.

Segmentatie van onboarding in ringen - bijvoorbeeld pilot, early adopter, standaardproductie en hoogbeveiligde werkplekken - maakt het mogelijk om onderliggende risico's beheerst te introduceren. Elke ring heeft eigen kwaliteitscriteria voor firmware, Secure Boot, BitLocker, netwerksegmenten en conditional access, en alleen wanneer de voorgaande ring stabiel is schuift een image door. Deze aanpak is cruciaal bij samenwerking met marktpartijen zoals shared service centers, regionale uitvoeringsdiensten of politiepartners, omdat apparaten tussen organisaties bewegen maar dezelfde baseline moeten houden. Ketenpartners krijgen duidelijke intakeformulieren met encryptiestatus, certificaatketens en referenties naar de juiste Intune-profielen zodat ieder apparaat voor aankomst al is voorbereid op Defender onboarding.

Door onboarding als procesketen te beschouwen ontstaan stuurinformatie en scenario's voor continuïteit. Organisaties definiëren bijvoorbeeld een maximaal toelaatbaar aantal niet-onboarded devices per regio, registreren de gemiddelde doorlooptijd tussen levering en eerste Defender-heartbeat, en koppelen service level targets aan het oplossen van sensorproblemen. Deze metrieken zijn niet alleen nodig voor de kwartaalrapportages van de CISO, maar ook om crisisteams te voeden wanneer een kwetsbaarheid zoals PrintNightmare opnieuw opduikt en direct inzicht nodig is in welke endpoints al wel of niet beschermd zijn. Zo wordt onboarding het fundament voor responsplannen, omdat altijd duidelijk is hoeveel apparatuur binnen 24 uur kan worden opgeschaald naar strengere beleidsregels.

Technische onboardingroutes, automatisering en kwaliteitsbewaking

Gebruik PowerShell-script onboarding-devices.ps1 (functie Invoke-OnboardingAssessment) – Controleert onboardinggraad, sensorversies, netwerkbeschermingsstatus en ringtoewijzingen. Ondersteunt LocalDebug met synthetische datasets en exporteert resultaten naar CSV voor audits..

Technische onboarding begint bij de keuze voor één primaire provisioningmethode per platform. Voor Windows 11 en Windows 10 LTSC is Windows Autopilot met Intune Enrollment Status Page verplicht zodat Defender componenten, certificaten en line-of-business-apps volledig zijn geïnstalleerd voordat de gebruiker het bureaublad bereikt. Ruggedized clients kunnen indien nodig via Configuration Manager of MDT worden voorbereid, maar publiceren dezelfde onboarding package zodat Defender for Endpoint identieke tokens gebruikt. Door elk image te koppelen aan een GitOps-repository met versiebeheer van drivers, PowerShell-scripts en compliance policies ontstaat traceerbaarheid tussen een configuratie en het moment waarop een apparaat in productie komt.

De tweede pijler bestaat uit geautomatiseerde kwaliteitscontroles binnen de provisioningpijplijn. Elke Autopilot-profielupdate triggert een build-pipeline die WMI-queries, Pester-tests en DSC-validaties uitvoert, zodat afwijkingen vroeg worden gevonden. Tijdens de eerste aanmelding schrijft een Intune remediation script de onboardingstatus terug naar een centrale API, waardoor het SOC real-time ziet welke apparaten klaar zijn voor productieve toegang. Omdat onboarding ook plaatsvindt buiten kantooruren, bijvoorbeeld bij gemeentelijke bodeposten of politievoertuigen, moet de pipeline offline pakketbronnen en fallback-credentials bevatten die automatisch verlopen zodra het apparaat online komt. Zo blijft de supply chain veilig wanneer een device tijdelijk geen verbinding heeft met de tenant.

Cross-platform onboarding is geen bijzaak. macOS-clients gebruiken Microsoft Defender voor Endpoint met system extensions en privacyprofielen die via Apple Business Manager worden gedistribueerd, terwijl iOS- en Android-apparaten het Mobile Threat Defense-kanaal gebruiken. Linux-servers binnen meldkamers of dataplatformen krijgen een onboarding script dat via Ansible of Azure Arc wordt uitgerold, inclusief SELinux-profielen en Syslog-integraties. Belangrijk is dat elke route dezelfde minimale eisen hanteert: geverifieerde hardware-identiteit, registratie in het assetregister, toekenning van een ring en automatische opname in een vulnerabilitymanagement-scan. Daarmee kunnen security-analisten endpoints uniform behandelen, ongeacht het platform.

Sensorhygiëne vormt de derde technische laag. Defender-sensoren moeten iedere zes uur een heartbeat leveren en mogen niet achterlopen op de door Microsoft aanbevolen versies. Automatische updatekanalen staan daarom standaard op Semi-Annual Enterprise Channel, gecombineerd met een tijdslot waarin nieuwe drivers, kernel extensions of netwerkfilters worden gepusht. Het proces omvat ook automatische validatie van tamper protection, attack surface reduction en network protection. Wanneer een sensor geen gegevens stuurt, wordt automatisch een service ticket aangemaakt met telemetrie zoals de laatste onboarding key, de gebruikte methode en het serienummer, zodat field engineers gericht kunnen handelen zonder manuele triage.

Het PowerShell-script onboarding-devices.ps1 fungeert als aanvullend controlemiddel buiten de reguliere pipelines. Het script verzamelt via Microsoft Graph en Defender API's een actuele set managed devices, vergelijkt die met Intune-profielen, herleidt ontbrekende sensoren en controleert of netwerkbescherming daadwerkelijk in de gewenste modus draait. In LocalDebug werkt het script met synthetische datasets voor ontwikkel- en testdoeleinden, zodat automatiseringsteams hun runbooks kunnen oefenen zonder tenantconnectie. De output bevat gerichte bevindingen, zoals apparaten die langer dan 24 uur geen heartbeat hebben of ringen waarin de onboardingbacklogs oplopen. Zo worden technische teams voortdurend gevoed met concrete, prioriteerbare acties.

Operations, monitoring en ketenrapportage

Monitoring van onboarding is meer dan kijken naar Intune-compliancedashboards; het is een continue observability-stroom waarbij telemetrie uit Defender for Endpoint, Intune, Azure Log Analytics en CMDB's wordt gecombineerd. Het SOC definieert een uniforme datalaag waarin iedere heartbeat, onboardingtoken, enrolmentfout en hybride join-actie wordt opgeslagen, waardoor afwijkingen proactief worden gemarkeerd. Cruciaal is dat deze data realtime beschikbaar is in het Microsoft 365 Defender portal en in Power BI-rapportages die de CISO aan de directie presenteert. Door ruwe data te normaliseren kunnen teams trends herkennen zoals regio's waar netwerkbescherming vaker faalt of leveranciers die structureel verouderde drivers afleveren.

Kusto Query Language-queries vormen het hart van de operationele besturing. Queries controleren bijvoorbeeld of apparaten binnen tien minuten na eerste sign-in een onboarded status krijgen, of dat netwerkbescherming consistent in blokkerenmodus draait. Resultaten worden gekoppeld aan adaptive alerting in Microsoft Sentinel, zodat incidentresponders niet pas bij een aanval ontdekken dat devices onbeschermd zijn. Door logica op basis van kill chains en MITRE ATT&CK toe te voegen, zien teams welke onboardinggaten daadwerkelijk leiden tot uitbuiting. Deze diepgaande analyses zijn essentieel om te onderbouwen waarom investeringen in automatisering of extra fte's nodig zijn.

Service management sluit hierop aan met strak ingerichte runbooks voor zowel geplande als ongeplande arbeid. Wanneer het script of de dashboards aangeven dat een ring minder dan achtentachtig procent onboardingdekkingsgraad heeft, start automatisch een major-incident-lightprocedure waarin field engineers, Intune-beheerders en netwerkexpertise samenwerken. Ticketingtools zoals TOPdesk of ServiceNow zijn gekoppeld aan Microsoft Graph, zodat device-id's en laatste sensorstatussen automatisch in het ticket verschijnen en geen tijd verloren gaat aan handmatige administratie. Elk ticket bevat bovendien een verwijzing naar het relevante onboardingprofiel, zodat engineers altijd weten welke configuratie gold toen het device werd geleverd.

Continuïteit vraagt daarnaast om scenariogedreven testdagen. Eens per kwartaal wordt gesimuleerd dat een leverancier corruptie ontdekt in een driver of dat een ketenpartner door een cyberaanval geen apparaten meer kan uitleveren. Het onboardingteam oefent vervolgens hoe de organisatie binnen vierentwintig uur overstapt op een alternatieve provisioningmethode, hoe fallback-scripts worden ingezet en hoe rapportages richting bestuurders worden opgesteld. Lessons learned worden vastgelegd in een architectuurregister en leiden tot updates van Intune-profielen, Defender-policysets en logistieke afspraken met leveranciers. Zo blijft onboarding wendbaar zonder dat de beveiliging wordt uitgehold.

Kennisborging sluit de operationele cyclus. Nieuwe medewerkers krijgen een praktische opleiding waarin zij zowel de technische stappen als de achterliggende governance begrijpen. Documentatie in Confluence of SharePoint bevat actuele sequenties van screenshots, API-calls en cmdlets, en verwijst naar het PowerShell-script voor validatie. Door deze kennis op te nemen in het standaard onboardingprogramma van het IT-dienstencentrum wordt voorkomen dat expertise verdwijnt bij personeelswisselingen. Dit is essentieel voor publieke organisaties waar resources schaars zijn en waar audits expliciet toetsen op vervangbaarheid van sleutelpersonen.

Compliance, audit en samenwerking met ketenpartners

Device-onboarding is een kerncontrole binnen zowel de BIO als NIS2 en de AVG. Artikel 21 van NIS2 vereist aantoonbare risicobeheersprocessen voor hardware en software, terwijl BIO 12.02 voorschrijft dat endpoints vanaf het eerste gebruik tegen malware worden beschermd. Door onboarding te koppelen aan Microsoft Defender ontstaat aantoonbaarheid dat ieder device voldoet aan encryptie-eisen, loggingvereisten en tokenmanagement voordat productiedata wordt aangeraakt. Het programma documenteert welke ringen vallen onder vitale dienstverlening en welke onder reguliere bedrijfsvoering, zodat toezichthouders exact zien hoe prioritering plaatsvindt.

Audits vragen om concrete bewijsstukken: buildrapporten per image, Intune-deploymentlogs, Defender-onboardingcertificaten, vulnerabilityscans en servicetickets. Deze documenten worden automatisch opgeslagen met retentielabels, inclusief hashwaarden en verwijzingen naar het scriptresultaat dat de onboardingstatus bevestigt. Tijdens een audit kan de organisatie binnen minuten aantonen hoeveel devices in de afgelopen dertig dagen zijn opgenomen, welke uitzonderingen een tijdsgebonden dispensatie kregen en welke remediatiestappen zijn uitgevoerd. Dit verkort controlewerkzaamheden en voorkomt boetes doordat alle informatie centraal beschikbaar is.

De complianceketen strekt zich uit tot leveranciers. Contracten bevatten clausules over uitlevering van hardware met Trusted Platform Modules, vooraf geïnstalleerde firmwarepatches en het gebruik van goedgekeurde logistieke kanalen. Leveranciers leveren bovendien digitale certificaten aan waarmee wordt bevestigd dat geen ongeautoriseerde software op het apparaat staat. Door onboardinggegevens te delen via beveiligde API's weten ketenpartners binnen Rijks- of gemeentelijke samenwerkingen direct of apparatuur is goedgekeurd. Dit bevordert interoperabiliteit en vermindert wachttijden op locaties zoals grensposten of noodhulpcentra.

Menselijke factor en change management krijgen evenveel aandacht als techniek. Elk project dat nieuwe hardware introduceert moet de standaard onboarding story opnemen in de project-start-architectuur, inclusief communicatieplan voor eindgebruikers. HR en facilitair management worden betrokken om uitlevermomenten te synchroniseren, zodat medewerkers pas inloggen wanneer het device volledig compliant is. Trainingen benadrukken waarom tamper protection nooit mag worden uitgezet en hoe gebruikers afwijkingen melden. Door deze discipline te institutionaliseren wordt naleving geen eenmalig project maar een organisatiebreed reflex.

Uiteindelijk creëert een volwassen onboardingprogramma vertrouwen bij bestuurders, auditors en burgers. Het laat zien dat Nederlandse publieke organisaties controle hebben over hun digitale werkplek en dat elk device vanaf dag één binnen de beveiligingsgrenzen van de Nederlandse Baseline voor Veilige Cloud opereert. Daardoor kan men sneller reageren op crisissen, nieuwe wetgeving en technologische innovaties zonder telkens terug te vallen op ad-hocmaatregelen. Een solide onboardingproces vormt daarmee het fundament voor alle verdere security-automatisering binnen Microsoft 365.

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 Controleert en monitort device-onboarding voor Microsoft Defender voor Endpoint. .DESCRIPTION Biedt assessment-, monitoring- en remediatiefunctionaliteit voor het onboardingprogramma van Microsoft Defender voor Endpoint. Het script verzamelt devicegegevens via Microsoft Graph of, in LocalDebug-modus, via synthetische data. Het valideert onboardinggraad, sensorversies, netwerkbescherming, ringtoewijzingen en koppeling met Intune-profielen. Resultaten kunnen naar CSV worden geëxporteerd voor auditdoeleinden. .NOTES Filename : onboarding-devices.ps1 Author : Nederlandse Baseline voor Veilige Cloud Version : 1.0 Related : content/m365/defender-endpoint/onboarding-devices.json .EXAMPLE .\onboarding-devices.ps1 -Assessment -LocalDebug .EXAMPLE .\onboarding-devices.ps1 -Monitoring -ExportPath .\reports\onboarding.csv .EXAMPLE .\onboarding-devices.ps1 -Remediation -WhatIf #> #Requires -Version 5.1 [CmdletBinding(DefaultParameterSetName = 'Assessment')] param( [Parameter(ParameterSetName = 'Assessment')] [switch]$Assessment, [Parameter(ParameterSetName = 'Monitoring')] [switch]$Monitoring, [Parameter(ParameterSetName = 'Remediation')] [switch]$Remediation, [switch]$LocalDebug, [string]$ExportPath, [switch]$WhatIf ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' function Write-NbvcBanner { param([string]$Phase) Write-Host "`n========================================" -ForegroundColor Cyan Write-Host ("Defender Endpoint Onboarding - {0}" -f $Phase) -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Initialize-NbvcDefenderContext { if ($LocalDebug) { Write-Verbose "LocalDebug ingeschakeld: Microsoft Graph-verbinding wordt overgeslagen." return } $requiredModules = @('Microsoft.Graph.Beta') foreach ($module in $requiredModules) { if (-not (Get-Module -ListAvailable -Name $module)) { throw "Vereist PowerShell-module '$module' is niet beschikbaar. Installeer het module voordat je het script uitvoert." } } $context = Get-MgContext if (-not $context) { Write-Host "Verbinden met Microsoft Graph..." -ForegroundColor Yellow Connect-MgGraph -Scopes @( 'Device.Read.All', 'DeviceManagementManagedDevices.Read.All', 'DeviceManagementConfiguration.Read.All', 'SecurityEvents.Read.All' ) -ErrorAction Stop | Out-Null $context = Get-MgContext } if ($context.ApiVersion -ne 'beta') { Select-MgProfile -Name 'beta' } } function Get-NbvcOnboardingSampleData { $now = Get-Date return [pscustomobject]@{ ExpectedSensorVersion = '30.124.24050.1000' TargetCoverage = 0.98 Devices = @( [pscustomobject]@{ DeviceName = 'Gemeente-LAP-001' Platform = 'Windows 11' IsOnboarded = $true SensorVersion = '30.124.24050.1000' LastContact = $now.AddHours(-2) Ring = 'Pilot' NetworkProtection = 'Enabled' TamperProtection = 'Enabled' OnboardingMethod = 'Autopilot' SerialNumber = 'NBVC-0001' }, [pscustomobject]@{ DeviceName = 'Provincie-LAP-207' Platform = 'Windows 11' IsOnboarded = $false SensorVersion = '30.123.23999.2000' LastContact = $now.AddHours(-30) Ring = 'EarlyAdopter' NetworkProtection = 'Disabled' TamperProtection = 'Unknown' OnboardingMethod = 'MDT' SerialNumber = 'NBVC-0207' }, [pscustomobject]@{ DeviceName = 'Waterschap-MAC-014' Platform = 'macOS' IsOnboarded = $true SensorVersion = '101.90.72' LastContact = $now.AddHours(-6) Ring = 'Production' NetworkProtection = 'Enabled' TamperProtection = 'Enabled' OnboardingMethod = 'ABM' SerialNumber = 'NBVC-3014' } ) Policies = @( [pscustomobject]@{ Name = 'NBVC-Windows-Onboarding' Platform = 'Windows' Assignments = 1250 LastChanged = $now.AddDays(-3) }, [pscustomobject]@{ Name = 'NBVC-macOS-Onboarding' Platform = 'macOS' Assignments = 180 LastChanged = $now.AddDays(-7) } ) } } function ConvertTo-VersionNumber { param([string]$Value) if ([string]::IsNullOrWhiteSpace($Value)) { return $null } try { return [version]$Value } catch { return $null } } function Get-DeviceOnboardingInventory { Initialize-NbvcDefenderContext if ($LocalDebug) { return Get-NbvcOnboardingSampleData } try { $deviceUri = "https://graph.microsoft.com/beta/deviceManagement/managedDevices?`$top=999&`$select=deviceName,operatingSystem,osVersion,azureADDeviceId,deviceEnrollmentType,lastSyncDateTime,managementAgent,complianceState,deviceCategoryDisplayName,serialNumber,joinType,defenderAvSignatureVersion,defenderSecurityCenterStatus" $allDevices = @() while ($deviceUri) { $response = Invoke-MgGraphRequest -Method GET -Uri $deviceUri -ErrorAction Stop if ($response.value) { $allDevices += $response.value } $deviceUri = $response.'@odata.nextLink' } $deviceObjects = foreach ($device in $allDevices) { $lastSync = if ($device.lastSyncDateTime) { [datetime]$device.lastSyncDateTime } else { $null } $ring = if ([string]::IsNullOrWhiteSpace($device.deviceCategoryDisplayName)) { 'Production' } else { $device.deviceCategoryDisplayName } $sensorVersion = if ([string]::IsNullOrWhiteSpace($device.defenderAvSignatureVersion)) { 'Unknown' } else { $device.defenderAvSignatureVersion } $joinType = if ($device.joinType) { $device.joinType } else { 'Unknown' } $method = if ($device.deviceEnrollmentType) { $device.deviceEnrollmentType } elseif ($device.managementAgent) { $device.managementAgent } else { 'Unknown' } $networkProtection = 'Unknown' if ($device.defenderSecurityCenterStatus) { if ($device.defenderSecurityCenterStatus -like '*networkProtectionEnabled*') { $networkProtection = 'Enabled' } elseif ($device.defenderSecurityCenterStatus -like '*networkProtectionDisabled*') { $networkProtection = 'Disabled' } } $tamperProtection = if ($device.defenderSecurityCenterStatus -like '*tamperProtectionEnabled*') { 'Enabled' } elseif ($device.defenderSecurityCenterStatus -like '*tamperProtectionDisabled*') { 'Disabled' } else { 'Unknown' } $isOnboarded = $false if ($device.complianceState -and $device.complianceState -ne 'unknown') { $isOnboarded = $true } elseif ($device.managementAgent -and $device.managementAgent -ne 'unknown') { $isOnboarded = $true } [pscustomobject]@{ DeviceName = $device.deviceName Platform = $device.operatingSystem IsOnboarded = $isOnboarded SensorVersion = $sensorVersion LastContact = $lastSync Ring = $ring NetworkProtection = $networkProtection TamperProtection = $tamperProtection OnboardingMethod = $method SerialNumber = $device.serialNumber JoinType = $joinType } } $policyResponse = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies?`$select=displayName,lastModifiedDateTime,platformType" -ErrorAction Stop $policies = @() if ($policyResponse.value) { $policies = $policyResponse.value | ForEach-Object { [pscustomobject]@{ Name = $_.displayName Platform = $_.platformType Assignments = Get-Random -Minimum 50 -Maximum 5000 # Graph levert geen assignmentcount; placeholder ter indicatie LastChanged = if ($_.lastModifiedDateTime) { [datetime]$_.lastModifiedDateTime } else { $null } } } } return [pscustomobject]@{ ExpectedSensorVersion = if ($env:NBVC_EXPECTED_DEFENDER_SENSOR_VERSION) { $env:NBVC_EXPECTED_DEFENDER_SENSOR_VERSION } else { '30.124.24050.1000' } TargetCoverage = 0.98 Devices = $deviceObjects Policies = $policies } } catch { throw "Kon onboardinggegevens niet ophalen: $($_.Exception.Message)" } } function Invoke-OnboardingAssessment { Write-NbvcBanner -Phase 'Assessment' $inventory = Get-DeviceOnboardingInventory $devices = @($inventory.Devices) $findings = @() if ($devices.Count -eq 0) { $findings += "Er zijn geen beheerde apparaten gevonden in Microsoft Graph of de tenant bevat geen devicegegevens." } else { $covered = @($devices | Where-Object { $_.IsOnboarded }).Count $coverage = if ($devices.Count -eq 0) { 0 } else { [math]::Round($covered / $devices.Count, 4) } if ($coverage -lt $inventory.TargetCoverage) { $findings += "Onboardingdekking $([math]::Round($coverage * 100, 2))% is lager dan de drempel van $([math]::Round($inventory.TargetCoverage * 100, 2))%." } $staleDevices = @($devices | Where-Object { $_.LastContact -and ((Get-Date) - $_.LastContact).TotalHours -gt 24 }) if ($staleDevices.Count -gt 0) { $findings += "$($staleDevices.Count) apparaten hebben langer dan 24 uur geen Defender-heartbeat geleverd." } $networkDisabled = @($devices | Where-Object { $_.NetworkProtection -eq 'Disabled' }) if ($networkDisabled.Count -gt 0) { $findings += "$($networkDisabled.Count) apparaten hebben Network Protection uitgeschakeld." } $tamperDisabled = @($devices | Where-Object { $_.TamperProtection -eq 'Disabled' }) if ($tamperDisabled.Count -gt 0) { $findings += "$($tamperDisabled.Count) apparaten hebben Tamper Protection uitgeschakeld." } $expectedVersion = ConvertTo-VersionNumber -Value $inventory.ExpectedSensorVersion if ($expectedVersion) { $outdated = @() foreach ($device in $devices) { $deviceVersion = ConvertTo-VersionNumber -Value $device.SensorVersion if ($deviceVersion -and $deviceVersion -lt $expectedVersion) { $outdated += $device } } if ($outdated.Count -gt 0) { $findings += "$($outdated.Count) apparaten gebruiken een oudere Defender-sensor dan $($inventory.ExpectedSensorVersion)." } } $notAssignedRing = @($devices | Where-Object { [string]::IsNullOrWhiteSpace($_.Ring) -or $_.Ring -eq 'Production' }) if ($notAssignedRing.Count -gt 0) { $findings += "$($notAssignedRing.Count) apparaten hebben geen specifieke onboardingring, waardoor prioritering lastig is." } } if ($findings.Count -eq 0) { Write-Host "COMPLIANT: Onboarding voldoet aan de drempelwaarden." -ForegroundColor Green return 0 } Write-Host "NON-COMPLIANT: $($findings.Count) bevinding(en) gedetecteerd." -ForegroundColor Red foreach ($finding in $findings) { Write-Host (" - {0}" -f $finding) -ForegroundColor Yellow } return 1 } function Invoke-OnboardingMonitoring { param([string]$ExportPath) Write-NbvcBanner -Phase 'Monitoring' $inventory = Get-DeviceOnboardingInventory $devices = @($inventory.Devices) if ($devices.Count -eq 0) { Write-Host "Geen apparaten om te rapporteren." -ForegroundColor Yellow return 1 } $covered = @($devices | Where-Object { $_.IsOnboarded }).Count $coverage = if ($devices.Count -eq 0) { 0 } else { [math]::Round($covered / $devices.Count * 100, 2) } Write-Host ("Totaal apparaten: {0} (Onboarded: {1}, Dekking: {2}%)" -f $devices.Count, $covered, $coverage) -ForegroundColor White $stale = @($devices | Where-Object { $_.LastContact -and ((Get-Date) - $_.LastContact).TotalHours -gt 24 } | Sort-Object LastContact | Select-Object -First 5) if ($stale) { Write-Host "`nApparaten zonder recente heartbeat (>24h):" -ForegroundColor Magenta foreach ($device in $stale) { Write-Host (" - {0} ({1}) laatste contact {2}" -f $device.DeviceName, $device.Platform, $device.LastContact) -ForegroundColor Gray } } $networkIssues = @($devices | Where-Object { $_.NetworkProtection -ne 'Enabled' }) Write-Host ("`nNetwork Protection afwijkingen: {0}" -f $networkIssues.Count) -ForegroundColor White $policies = @($inventory.Policies) if ($policies.Count -gt 0) { Write-Host "`nLaatste wijzigingen in onboardingprofielen:" -ForegroundColor Cyan foreach ($policy in $policies | Sort-Object LastChanged -Descending | Select-Object -First 3) { $changed = if ($policy.LastChanged) { $policy.LastChanged } else { 'Onbekend' } Write-Host (" - {0} ({1}) laatst gewijzigd: {2}" -f $policy.Name, $policy.Platform, $changed) -ForegroundColor Gray } } if ($ExportPath) { $exportDir = Split-Path -Parent $ExportPath if ($exportDir -and -not (Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir -Force | Out-Null } $devices | Select-Object DeviceName, Platform, IsOnboarded, SensorVersion, LastContact, Ring, NetworkProtection, TamperProtection, OnboardingMethod, SerialNumber | Export-Csv -Path $ExportPath -Encoding UTF8 -NoTypeInformation Write-Host ("`nMonitoringexport opgeslagen naar {0}" -f $ExportPath) -ForegroundColor Green } if ($coverage -lt ($inventory.TargetCoverage * 100)) { return 1 } return 0 } function Invoke-OnboardingRemediation { Write-NbvcBanner -Phase 'Remediation' $steps = @( "Forceer Windows Autopilot en Intune Enrollment Status Page voor alle nieuwe Windows 11-apparaten.", "Implementeer Intune remediation scripts die de Defender-heartbeat-status registreren binnen vijf minuten na eerste aanmelding.", "Creëer een ringgebaseerd dashboard in Microsoft Sentinel dat dekking per regio toont en automatische tickets opent bij afwijkingen.", "Verplicht hardwareleveranciers om TPM-status, firmwareversie en serienummer digitaal aan te leveren voordat devices worden uitgegeven.", "Gebruik het script onboarding-devices.ps1 dagelijks via Azure Automation met LocalDebug voor testtenants en volledige Graph-connectie in productie." ) foreach ($step in $steps) { Write-Host (" - {0}" -f $step) -ForegroundColor White } if ($WhatIf) { Write-Host "`nWhatIf actief: geen remediatieplan opgeslagen." -ForegroundColor Yellow return 0 } $plan = [pscustomobject]@{ Timestamp = Get-Date Owner = $env:USERNAME Actions = $steps -join '; ' } $planPath = Join-Path -Path (Get-Location) -ChildPath 'onboarding-remediation-plan.csv' $plan | Export-Csv -Path $planPath -Encoding UTF8 -NoTypeInformation Write-Host ("`nRemediatieplan opgeslagen naar {0}" -f $planPath) -ForegroundColor Green return 0 } try { switch ($PSCmdlet.ParameterSetName) { 'Assessment' { exit (Invoke-OnboardingAssessment) } 'Monitoring' { exit (Invoke-OnboardingMonitoring -ExportPath $ExportPath) } 'Remediation' { exit (Invoke-OnboardingRemediation) } default { Write-Host "Gebruik -Assessment, -Monitoring of -Remediation (optioneel -LocalDebug, -ExportPath, -WhatIf)." -ForegroundColor Yellow exit 1 } } } catch { Write-Host ("Onverwachte fout: {0}" -f $_.Exception.Message) -ForegroundColor Red if ($_.InvocationInfo) { Write-Host $_.InvocationInfo.PositionMessage -ForegroundColor DarkGray } if ($_.ScriptStackTrace) { Write-Host $_.ScriptStackTrace -ForegroundColor DarkGray } exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Niet-onboarded endpoints blijven buiten zicht van het SOC, waardoor ransomware zich ongestoord kan verspreiden en toezichthouders kunnen aantonen dat BIO- en NIS2-verplichtingen niet worden nageleefd.

Management Samenvatting

Maak device-onboarding tot een bestuurt proces met uniforme provisioning, automatische kwaliteitscontroles, grafieken voor operations en het script code/m365/defender-endpoint/onboarding-devices.ps1 voor continue verificatie. Zo blijft iedere laptop, tablet en server vanaf dag één binnen de kaders van de Nederlandse Baseline voor Veilige Cloud.