Windows Autopilot Deployment Orkestratie

💼 Management Samenvatting

Windows Autopilot is de fundering voor een moderne, aantoonbaar veilige werkplekomgeving. Het platform combineert hardware-registratie, Zero Touch provisioning en Intune-beleid in één keten, waardoor nieuwe apparaten binnen enkele minuten voldoen aan de Nederlandse Baseline voor Veilige Cloud. Door Autopilot centraal te positioneren verdwijnen kwetsbare handmatige installatieprocessen, ontstaat een volledig gedocumenteerde keten en worden gebruikers al bij de eerste aanmelding beschermd door beleid, certificaten en identiteit. Het resultaat is minder wachturen, een voorspelbare kostenstructuur en een betrouwbare audittrail die laat zien dat iedere laptop identiek, veilig en herleidbaar is ingezet.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
9/10
Implementatie
96u (tech: 56u)
Van toepassing op:
Windows 11
Windows 10
Intune
Entra ID
Microsoft Endpoint Manager

Nederlandse overheidsorganisaties vallen onder BIO, AVG, NIS2 en sectorale toezichteisen. Deze kaders eisen dat hardware-inzet aantoonbaar controleerbaar is, dat er geen ongeautoriseerde configuraties op endpoints komen en dat de keten van leverancier tot gebruiker inzichtelijk is. Traditionele beeldbeheerprocessen voldoen daar niet meer aan omdat ze afhankelijk zijn van losse USB-sticks, lokale accounts en ongedocumenteerde tweaks. Autopilot biedt een standaardproces waarin elke stap centraal geregistreerd en afdwingbaar is: serienummers worden vooraf gekoppeld aan het juiste beleid, Enrollment Status Page blokkeert gebruik totdat beveiligingsmaatregelen zijn voltooid en Graph-telemetrie levert bewijslast voor audits. Daarmee wordt provisioning van een risico naar een gecontroleerde control-activiteit getild.

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

Implementatie

Dit artikel beschrijft hoe Autopilot binnen Nederlandse overheden tot een volwassen dienst uitgroeit. We behandelen governance, rollen en lifecycle-management, het technische ontwerp van deploymentprofielen en ESP-configuraties, de operationele monitoring via Microsoft Graph en Log Analytics, en de vereiste auditdocumentatie. Elk hoofdstuk koppelt strategische keuzes aan concrete implementatiestappen, inclusief scripts voor assessments en operationele rapportages. Het doel is dat CIO’s, CISO’s, device-teams en leveranciers dezelfde taal spreken wanneer zij hardware bestellen, registreren, uitleveren en uitfaseren. De nadruk ligt op professionaliteit: geen versnipperde lijstjes, maar volwaardige hoofdstukken met minimaal vijfhonderd woorden die beleid, techniek en proces onverbrekelijk verbinden.

Regie, Kaders en Lifecycle

Autopilot begint niet bij Intune maar bij bestuurlijke afspraken. Het CIO-office benoemt device provisioning tot kritieke controle voor bedrijfscontinuïteit en koppelt er een expliciete risicotolerantie aan: geen enkel apparaat mag productie bereiken zonder geregistreerde serienummerketen, toegewezen beveiligingsprofiel en geverifieerde identiteit. Dat uitgangspunt wordt vastgelegd in het securitybeleid en in het aanschafproces. Elke hardware-order bevat een verplichting aan leveranciers om serienummers, hardware hash en orderidentifier binnen 24 uur te leveren, inclusief digitale handtekening. Daarmee verschuift de verantwoordelijkheid van “bestel en hoop” naar “bestel en bewijs”. Het beleid beschrijft ook dat Autopilot het enige toegestane kanaal voor standaardwerkplekken is; uitzonderingen worden centraal geregistreerd met einddatum, compensatiemaatregel en bestuurdergoedkeuring.

Governance wordt ondersteund door een dedicated provisioning board waarin CISO, werkplekbeheer, leveranciersmanagement, inkoop en privacy vertegenwoordigd zijn. Deze board bewaakt de volledige lifecycle: pre-registratie, logistieke ontvangst, pre-provisioning, productie-uitrol en end-of-life. Voor elke fase zijn meetbare KPI’s afgesproken, zoals het percentage devices dat binnen vijf dagen na levering in Autopilot is geregistreerd, de duur van de ESP-fase, het aantal herstarts voordat policies compliant zijn en de snelheid waarmee een device op verzoek kan worden uitgeschreven. Besluiten worden via CAB-procedures vastgelegd zodat auditors precies zien waarom bijvoorbeeld een build gebruikt mocht worden voor een crisisorganisatie. Door governance in een multidisciplinair gremium te organiseren ontstaat grip op zowel techniek als proces, iets wat bij traditionele werkplekteams vaak ontbreekt.

Regelgeving verplicht ook tot duidelijke verantwoordelijkheden rondom gegevensbescherming en ketentransparantie. Het privacyteam beoordeelt dat Autopilot alleen noodzakelijke persoonsgegevens verwerkt (zoals UPN en device-naam) en beschrijft retentiebeleid voor logs. Juristen leggen in contracten vast dat leveranciers geen devices uitleveren zonder dat serienummers zijn gekoppeld aan de juiste tenants en dat bij terugkoop of reparatie alle gegevens worden gewist volgens NEN 7513 en BIO 10.04. Het SOC ontvangt meldingen zodra een onbekend serienummer verbinding maakt met Entra ID, zodat mogelijke supply-chain aanvallen vroegtijdig worden ontdekt. Hiermee is provisioning niet langer een black box maar een controleerbare, aantoonbare keten tussen externe partners en de interne organisatie.

Tot slot vereist een volwassen lifecycle budget en capaciteitsplanning. De organisatie reserveert structureel middelen voor Autopilot-experts, Intune-beheer, hardware-labs en testapparatuur. Service Level Agreements beschrijven hoeveel devices per week door het pre-provisioning team worden verwerkt en welke responstijden gelden voor spoedvervangingen. Dankzij deze afspraken kunnen crisisteams of verkiezingsorganisaties binnen 48 uur nieuwe werkplekken aanvragen zonder concessies aan beveiliging. Lifecycle-data voedt bovendien strategische besluiten: aan de hand van Autopilot-telemetrie ziet het CIO-office welke modellen end-of-life naderen, waar prestatieproblemen ontstaan en hoe duurzaamheidsdoelen (zoals hergebruik) worden gehaald. Zo wordt Autopilot een bedrijfsdienst met duidelijke stuurinformatie in plaats van een technisch project.

Architectuur, Profielen en Voorafgaande Validatie

Gebruik PowerShell-script windows-autopilot-deployment.ps1 (functie Invoke-AutopilotAssessment) – Controleert Autopilot-profielen, ESP-configuraties en device-registraties op baselinecriteria en rapporteert hiaten..

Het ontwerp van Autopilot start met segmentatie. De standaardindeling voor Nederlandse overheden bestaat uit vier profieltypen: reguliere kantoorwerkplekken, bestuurskritische devices (burgemeester, gedeputeerde, inspecteur), veldwerkapparatuur en high-security werkplekken met aanvullende hardening. Elk profiel heeft een eigen device name template, taal, keyboardlayout, privacyverklaring en tenantbranding. Naming conventies volgen een vaste syntaxis zoals "RWS-{Afkorting}-{Serial}" waardoor elk apparaat direct te herleiden is naar eigenaar en omgeving. Device-type instellingen bepalen of hybride join is toegestaan, of dat apparaten uitsluitend in Entra ID geregistreerd worden. Het ontwerp documenteert bovendien welke ESP-completion blockers actief zijn; bijvoorbeeld dat BitLocker, Defender for Endpoint en Teams-configuratie voltooid moeten zijn voordat de gebruiker het bureaublad ziet. Door deze keuzes vast te leggen in een architectuurdocument kunnen leveranciers en interne teams hun werkwijzen hierop afstemmen.

Voor elk profiel hoort een Enrollment Status Page-configuratie met strikte timers. Het ontwerp eist dat installatieblokkades pas worden opgeheven nadat Intune-beleid, certificaten, Office-pakketten en securitytools zijn toegepast. De baseline stelt een device-setup-timeout van 60 minuten en een user-setup-timeout van 30 minuten vast zodat vastlopers zichtbaar worden. Telemetrie van ESP wordt doorgestuurd naar Log Analytics waardoor het projectteam exact weet welke stap struikelde. Bovendien worden dynamische Entra ID-groepen gebruikt voor toewijzing, gebaseerd op AutopilotGroupTag, OrderID en device model. Hierdoor kunnen nieuwe leveringen automatisch aan het juiste beleid worden gekoppeld zonder handmatige interventie. Het artikel beschrijft hoe deze groepen worden opgebouwd, hoe fouttolerantie is ingebouwd met fall-back-groepen en hoe tagging onderdeel wordt van het logistieke ontvangstproces.

Pre-provisioning (ook bekend als Windows Autopilot for Pre-provisioned deployment) is essentieel voor apparaten die bij de gebruiker kant-en-klaar moeten aankomen. Het ontwerp schrijft daarom voor dat logistieke partners een secure room gebruiken waar devices worden aangesloten op een vertrouwd netwerksegment met beperkte internettoegang. De provisioning-technicus meldt het apparaat aan, wacht tot alle policies, applicaties en security-agents zijn geïnstalleerd, en verzegelt vervolgens het apparaat. Alle stappen worden geregistreerd in het ITSM-systeem inclusief foto van de verzendklare device en een verwijzing naar het Autopilot-deploymentrapport. Door deze procedure is voor audits aantoonbaar dat geen onbeveiligde tussenstappen hebben plaatsgevonden en dat de gebruiker het device ontvangt in dezelfde staat waarin het door de organisatie is gevalideerd.

Het artikel behandelt ook hardwarevalidatie. Nieuwe modellen doorlopen een teststraat waarin BIOS-instellingen, TPM-status, batterijgedrag en drivercompatibiliteit worden gecontroleerd. Testresultaten worden opgeslagen naast de Autopilot-profielen, inclusief besliscriteria om het model vrij te geven of juist te blokkeren voor productie. Leveranciers krijgen toegang tot een gedeelde portal waar acceptatierapporten worden gedeeld en waar zij kunnen zien welke configuraties vereist zijn (Secure Boot aan, virtualization-based security verplicht, minimale firmwareversie). Door deze informatie-uitwisseling ontstaat een voorspelbare keten waarin elke wijziging aan hardware of firmware meteen wordt vertaald naar aangepaste Autopilot-instellingen.

Operaties, Monitoring en Respons

Gebruik PowerShell-script windows-autopilot-deployment.ps1 (functie Invoke-AutopilotOperations) – Maakt operationele samenvattingen van deploymentstatussen, levert CSV-export voor audits en signaleert devices zonder beleid..

Dagelijkse operatie draait op betrouwbare data. Autopilot-logboeken, Intune deployment status en Entra ID activiteit worden via Microsoft Graph ingezameld en gekoppeld aan het centrale datawarehouse. Het SOC ontvangt near-realtime meldingen wanneer een device langer dan twee uur in dezelfde ESP-fase blijft hangen of wanneer een onbekend serienummer wordt aangeboden. Door drempelwaarden per profiel te definiëren kunnen teams gericht reageren; een bestuursdevice krijgt prioriteit boven een labmachine. De operationsparagraaf beschrijft stap voor stap hoe webhooks, Azure Monitor alerts en ITSM-integraties worden ingericht en hoe incidenten automatisch worden verrijkt met Graph-exports zodat analisten meteen zien welke stap faalde.

Het script genereert een overzicht van alle geregistreerde devices inclusief deploymentState, laatste contactmoment en toegewezen profiel. Deze dataset wordt gebruikt voor dagelijkse voortgangsrapportages naar het provisioning board. Apparaten die langer dan 14 dagen na ontvangst nog niet zijn geactiveerd krijgen een rood label en worden automatisch gekoppeld aan een taak voor de logistieke partner. Devices die wel zijn geactiveerd maar geen compliance bereiken binnen 30 minuten worden gemarkeerd voor nader onderzoek; vaak blijkt een ontbrekende licentie of een foutieve dynamische groep de oorzaak. Door data te combineren ontstaat een sluitende ketencontrole van bestelling tot ingebruikname.

Operations gaat ook over gebruikerservaring. Servicedesks krijgen scenario-gebaseerde draaiboeken voor veelvoorkomende vragen, zoals "het device hangt op het scherm Applicaties voorbereiden" of "ik zie mijn bedrijfslogo niet tijdens de eerste aanmelding". Scripts leveren gerichte troubleshooting-informatie door logboeken van Autopilot-diagnostiek te exporteren, inclusief JSON-rapporten die de gebruiker kan mailen. Deze werkwijze beperkt appels naar onbetrouwbare handleidingen en verkort de gemiddelde afhandeltijd. Het artikel legt uit hoe servicedeskmedewerkers worden getraind, welke KPI’s zij rapporteren en hoe feedback terugvloeit naar het ontwerpteam.

Een robuust responsproces is noodzakelijk wanneer een deployment moet worden teruggedraaid. Het operationshoofdstuk beschrijft hoe rollback-scripts apparaten direct uit Autopilot verwijderen, waarom ook het Entra ID device object moet worden opgeschoond en hoe je voorkomt dat een device met oude policies opnieuw wordt uitgeleverd. Verder wordt beschreven hoe incidentcoördinatoren communiceren met gebruikers, welke compenserende maatregelen gelden (bijvoorbeeld tijdelijke blokkade in Conditional Access) en hoe lessons learned worden vastgelegd. Daarmee is Autopilot niet alleen een provisioningtool, maar ook een gecontroleerd herstelproces.

Audittrail, Bewijsvoering en Lerende Organisatie

Auditors vragen structureel om bewijs dat ieder device via hetzelfde proces is gegaan. Daarom legt de organisatie per apparaat een digitaal dossier aan met ordergegevens, leveringsbon, Autopilot-registratie, ESP-log en het moment waarop de gebruiker het apparaat heeft opgehaald. Deze dossiers worden automatisch gevuld via Graph-exporten en ITSM-workflows en zijn alleen-lezen voor de servicedesk zodat de integriteit behouden blijft. Het artikel beschrijft welke metadata minimaal aanwezig moet zijn (serienummer, hardwarehash, profiel, betrokken leverancier, change-nummer) en hoe retentiebeleid wordt ingesteld conform Archiefwet en BIO-paragraaf 10.

Naast bewijs voor provisioning is traceerbaarheid van wijzigingen cruciaal. Elke aanpassing aan Autopilot-profielen, ESP-configuraties of dynamische groepen wordt vastgelegd in Git en gekoppeld aan een CAB-ticket. De repository bevat versiebeheer, code reviews en release-notes, zodat exact te zien is wanneer bijvoorbeeld het device name template is gewijzigd of wanneer een nieuw model is goedgekeurd. Dit voorkomt discussies tijdens audits en maakt het eenvoudiger om wijzigingen terug te draaien als ze ongewenste effecten hebben. De combinatie van Git en ITSM zorgt ervoor dat techniek en proces in dezelfde tijdlijn worden gepresenteerd.

De organisatie voert elk kwartaal een interne maturity review uit waarbij KPI’s, incidenten en feedback van gebruikers worden geanalyseerd. Daarbij worden scenario’s getest, zoals de uitrol van 1.000 noodlaptops of een vereiste firmware-update voor alle veldapparaten. Resultaten worden besproken met het provisioning board, waarna verbeteracties in de backlog belanden. Denk aan het uitbreiden van pre-provisioningcapaciteit, het toevoegen van extra monitoringregels of het aanscherpen van leveranciers-SLA’s. Door deze PDCA-cyclus blijft Autopilot afgestemd op veranderende dreigingen en beleidswijzigingen.

Tot slot beschrijft het hoofdstuk hoe kennisdeling plaatsvindt. Nieuwe teamleden volgen een verplicht trainingsprogramma met hands-on labs, referentiearchitectuur en toetsing. Lessons learned uit audits of incidenten worden opgenomen in een centrale bibliotheek en gedeeld via brown bag-sessies. Leveranciers nemen deel aan halfjaarlijkse evaluaties waarin zij aantonen hoe zij aan de Nederlandse Baseline voor Veilige Cloud bijdragen. Hiermee ontstaat een lerende organisatie waarin Autopilot continu beter wordt in plaats van een eenmalig project dat langzaam veroudert.

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 Windows Autopilot deployments. .DESCRIPTION Verifieert of deploymentprofielen, ESP-configuraties en devices voldoen aan de Nederlandse Baseline voor Veilige Cloud en levert operationele statistieken of remediatie-instructies. .NOTES Filename : windows-autopilot-deployment.ps1 Author : Nederlandse Baseline voor Veilige Cloud Version : 1.0 Related : content/m365/device-management/windows-autopilot-deployment.json .EXAMPLE .\windows-autopilot-deployment.ps1 -Assessment -LocalDebug .EXAMPLE .\windows-autopilot-deployment.ps1 -Operations -ExportPath .\autopilot-status.csv #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph.DeviceManagement.Enrollment #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 ) $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Windows Autopilot Deployment Baseline" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Initialize-AutopilotContext { if ($LocalDebug) { Write-Verbose "LocalDebug actief: Microsoft Graph wordt niet benaderd." return } $context = Get-MgContext if (-not $context) { Write-Host "Verbinden met Microsoft Graph..." -ForegroundColor Yellow $null = Connect-MgGraph -Scopes @( 'DeviceManagementServiceConfig.Read.All', 'DeviceManagementConfiguration.Read.All', 'DeviceManagementManagedDevices.Read.All', 'DeviceManagementRBAC.Read.All' ) -ErrorAction Stop $context = Get-MgContext } if ($context.ApiVersion -ne 'beta') { Select-MgProfile -Name 'beta' } } function Get-AutopilotSampleData { $now = Get-Date return [pscustomobject]@{ Profiles = @( [pscustomobject]@{ displayName = 'NL-Kantoor-Profiel' description = 'Standaard werkplekken' language = 'nl-NL' deviceNameTemplate = 'RWS-%SERIAL%-KNT' assignments = @('EntraID:AP-NL-KTR') enrollmentStatusScreenSettings = @{ deviceSetupTimeoutInMinutes = 60 userSetupTimeoutInMinutes = 30 allowDeviceUseBeforeProfileAndAppInstallComplete = $false } }, [pscustomobject]@{ displayName = 'NL-Bestuurlijk' description = 'Burgemeester en directie' language = 'nl-NL' deviceNameTemplate = 'RWS-%SERIAL%-BST' assignments = @('EntraID:AP-BST') enrollmentStatusScreenSettings = @{ deviceSetupTimeoutInMinutes = 45 userSetupTimeoutInMinutes = 20 allowDeviceUseBeforeProfileAndAppInstallComplete = $false } } ) EspConfigs = @( [pscustomobject]@{ displayName = 'ESP-NL-Strict' installProgressTimeoutInMinutes = 60 blockDeviceSetupRetryByUser = $true assignments = @('EntraID:AP-NL-KTR','EntraID:AP-BST') } ) Devices = @( [pscustomobject]@{ displayName = 'RWS-LAP-0001' serialNumber = 'RWS0001' groupTag = 'Kantoor' orderIdentifier = 'PO-2025-0100' deploymentState = 'completed' assignedUserPrincipalName= 'gebruiker1@voorbeeld.nl' deploymentProfile = 'NL-Kantoor-Profiel' lastContactedDateTime = $now.AddHours(-6) }, [pscustomobject]@{ displayName = 'RWS-LAP-0500' serialNumber = 'RWS0500' groupTag = 'Bestuur' orderIdentifier = 'PO-2025-0101' deploymentState = 'inProgress' assignedUserPrincipalName= 'bestuur@voorbeeld.nl' deploymentProfile = 'NL-Bestuurlijk' lastContactedDateTime = $now.AddDays(-3) } ) DeploymentHistory = @( [pscustomobject]@{ deploymentId = 'DEP-001' profile = 'NL-Kantoor-Profiel' deviceCount = 250 completedCount = 248 failedCount = 2 } ) } } function Get-AutopilotInventory { Initialize-AutopilotContext if ($LocalDebug) { return Get-AutopilotSampleData } $profiles = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeploymentProfiles?`$expand=assignments" -ErrorAction Stop $devices = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeviceIdentities?`$top=999" -ErrorAction Stop $esp = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceEnrollmentConfigurations?`$filter=isof('microsoft.graph.windowsEnrollmentStatusPageConfiguration')&`$expand=assignments" -ErrorAction Stop return [pscustomobject]@{ Profiles = $profiles.value Devices = $devices.value EspConfigs = $esp.value DeploymentHistory= @() } } function Invoke-AutopilotAssessment { try { $inventory = Get-AutopilotInventory $issues = @() $profiles = @($inventory.Profiles) if (-not $profiles -or $profiles.Count -eq 0) { $issues += "Er zijn geen Windows Autopilot-profielen gevonden." } foreach ($profile in $profiles) { $assignments = @() if ($profile.PSObject.Properties['assignments']) { $assignments = @($profile.assignments) } if ($assignments.Count -eq 0) { $issues += "Profiel '$($profile.displayName)' heeft geen assignments." } $template = if ($profile.PSObject.Properties['deviceNameTemplate']) { $profile.deviceNameTemplate } else { '' } if (-not $template -or ($template -notmatch 'SERIAL')) { $issues += "Device name template ontbreekt of bevat geen serienummer in profiel '$($profile.displayName)'." } $espSettings = if ($profile.PSObject.Properties['enrollmentStatusScreenSettings']) { $profile.enrollmentStatusScreenSettings } else { $null } if ($espSettings) { $deviceTimeout = $espSettings.deviceSetupTimeoutInMinutes $userTimeout = $espSettings.userSetupTimeoutInMinutes if ($deviceTimeout -gt 90 -or -not $deviceTimeout) { $issues += "Device-setup-timeout in profiel '$($profile.displayName)' is te ruim (>$deviceTimeout minuten)." } if ($userTimeout -gt 45 -or -not $userTimeout) { $issues += "User-setup-timeout in profiel '$($profile.displayName)' is te ruim (>$userTimeout minuten)." } } else { $issues += "Profiel '$($profile.displayName)' ontbreekt Enrollment Status Page-instellingen." } } $espConfigs = @($inventory.EspConfigs) if (-not $espConfigs -or $espConfigs.Count -eq 0) { $issues += "Er zijn geen ESP-configuraties gevonden." } else { foreach ($espConfig in $espConfigs) { $assignments = if ($espConfig.PSObject.Properties['assignments']) { @($espConfig.assignments) } else { @() } if ($assignments.Count -eq 0) { $issues += "ESP-configuratie '$($espConfig.displayName)' heeft geen assignments." } $timeout = if ($espConfig.PSObject.Properties['installProgressTimeoutInMinutes']) { [int]$espConfig.installProgressTimeoutInMinutes } else { 0 } if ($timeout -gt 90 -or $timeout -eq 0) { $issues += "ESP '$($espConfig.displayName)' gebruikt een ongeldige installProgressTimeout ($timeout minuten)." } } } $devices = @($inventory.Devices) foreach ($device in $devices) { $state = if ($device.PSObject.Properties['deploymentState']) { $device.deploymentState } else { 'unknown' } $profileName = if ($device.PSObject.Properties['deploymentProfileDisplayName']) { $device.deploymentProfileDisplayName } elseif ($device.PSObject.Properties['deploymentProfile']) { $device.deploymentProfile } else { $null } if (-not $profileName) { $issues += "Device '$($device.displayName)' heeft geen gekoppeld profiel." } if ($state -notin @('completed','success')) { $issues += "Device '$($device.displayName)' staat in deploymentState '$state'." } } if ($issues.Count -eq 0) { Write-Host "COMPLIANT: alle gecontroleerde Autopilot-instellingen voldoen aan de baseline." -ForegroundColor Green return 0 } else { Write-Host "NON-COMPLIANT: $($issues.Count) aandachtspunten gevonden." -ForegroundColor Red $issues | ForEach-Object { Write-Host " - $_" -ForegroundColor Yellow } return 1 } } catch { Write-Host "ERROR tijdens Autopilot-assessment: $_" -ForegroundColor Red return 2 } } function Invoke-AutopilotOperations { param( [string]$ExportPath ) try { $inventory = Get-AutopilotInventory $now = Get-Date $summary = foreach ($device in $inventory.Devices) { $lastContact = if ($device.PSObject.Properties['lastContactedDateTime']) { [datetime]$device.lastContactedDateTime } elseif ($device.PSObject.Properties['lastSyncDateTime']) { [datetime]$device.lastSyncDateTime } else { $null } $daysSinceContact = if ($lastContact) { [math]::Round(($now - $lastContact).TotalDays, 2) } else { [double]::PositiveInfinity } [pscustomobject]@{ DeviceName = if ($device.PSObject.Properties['displayName']) { $device.displayName } else { $device.serialNumber } SerialNumber = if ($device.PSObject.Properties['serialNumber']) { $device.serialNumber } else { 'Onbekend' } DeploymentState= if ($device.PSObject.Properties['deploymentState']) { $device.deploymentState } else { 'unknown' } Profile = if ($device.PSObject.Properties['deploymentProfileDisplayName']) { $device.deploymentProfileDisplayName } elseif ($device.PSObject.Properties['deploymentProfile']) { $device.deploymentProfile } else { 'Onbekend' } GroupTag = if ($device.PSObject.Properties['groupTag']) { $device.groupTag } else { 'Onbekend' } OrderId = if ($device.PSObject.Properties['orderIdentifier']) { $device.orderIdentifier } else { 'Onbekend' } AssignedUser = if ($device.PSObject.Properties['assignedUserPrincipalName']) { $device.assignedUserPrincipalName } else { 'Geen' } DaysSinceContact = $daysSinceContact } } $stalled = $summary | Where-Object { $_.DeploymentState -notin @('completed','success') -or $_.DaysSinceContact -gt 7 } Write-Host ("Totaal geregistreerde devices: {0}" -f $summary.Count) -ForegroundColor Cyan Write-Host ("Devices met aandacht (state <> completed of >7 dagen geen contact): {0}" -f $stalled.Count) -ForegroundColor Yellow if ($ExportPath) { $directory = Split-Path -Parent $ExportPath if ($directory -and -not (Test-Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $summary | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8 Write-Host "Rapport geëxporteerd naar $ExportPath" -ForegroundColor Green } if ($stalled.Count -gt 0) { Write-Host "`nTop 5 aandachtspunten:" -ForegroundColor Cyan $stalled | Select-Object -First 5 | Format-Table -AutoSize | Out-String | Write-Host } return ($stalled.Count -gt 0) ? 1 : 0 } catch { Write-Host "ERROR tijdens Autopilot-operations: $_" -ForegroundColor Red return 2 } } function Invoke-AutopilotRemediation { try { Write-Host "Remediatiestappen Windows Autopilot:" -ForegroundColor Yellow Write-Host "1. Controleer of alle serienummers met correcte GroupTag en OrderIdentifier in Autopilot zijn geïmporteerd." -ForegroundColor Gray Write-Host "2. Valideer ESP-configuraties in Intune en zorg dat blokkades actief blijven tot BitLocker, Defender en kritieke apps zijn uitgepakt." -ForegroundColor Gray Write-Host "3. Synchroniseer problematische devices via Autopilot Reset of Fresh Start en koppel ze opnieuw aan het juiste profiel." -ForegroundColor Gray Write-Host "4. Registreer uitzonderingen in ITSM inclusief einddatum, verantwoordelijke manager en compenserende Conditional Access-maatregelen." -ForegroundColor Gray Write-Host "5. Informeer het provisioning board en documenteer wijzigingen met CAB- of RFC-nummers, zodat audits de volledige keten kunnen volgen." -ForegroundColor Gray if ($WhatIf) { Write-Host "`nWhatIf actief: er zijn geen wijzigingen aangebracht." -ForegroundColor Yellow } return 0 } catch { Write-Host "ERROR tijdens remediatie-instructies: $_" -ForegroundColor Red return 2 } } try { switch ($PSCmdlet.ParameterSetName) { 'Assessment' { $exitCode = Invoke-AutopilotAssessment exit $exitCode } 'Operations' { $exitCode = Invoke-AutopilotOperations -ExportPath $ExportPath exit $exitCode } 'Remediation' { $exitCode = Invoke-AutopilotRemediation 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: Zonder Autopilot met strakke governance blijft provisioning afhankelijk van handmatige stappen, lokale accounts en niet-gecontroleerde builds. Aanvallers kunnen supply-chain kwetsbaarheden misbruiken, devices bereiken productie zonder BitLocker of Defender en auditors zien geen sluitende keten. Dit leidt tot AVG-incidenten, NIS2-maatregelen en herstelkosten bij vervuilde werkplekken.

Management Samenvatting

Implementeer Windows Autopilot als standaard voor device-inzet, combineer profielen met ESP-blokkades en borg de keten via Graph-monitoring en auditbestanden. Zo ontstaat een herhaalbaar, veilig proces dat bestuurders vertrouwen geeft in schaalbare digitale diensten.