Loopbaanpaden Voor Microsoft 365 Security Operations

💼 Management Samenvatting

Een volwassen Security Operations Center binnen Microsoft 365 staat of valt met goed doordachte loopbaanpaden. Zonder ontwikkelroute blijven detectie, respons en automatisering afhankelijk van individuele zwaargewichten die bij vertrek een gat achterlaten. Door competenties en doorgroeipaden structureel vast te leggen ontstaat een veerkrachtig team dat incidenten sneller verwerkt en innovatie daadwerkelijk volhoudt.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
7/10
Implementatie
200u (tech: 80u)
Van toepassing op:
Microsoft 365
Security Operations Center
Rijksoverheid
Gemeenten
ZBO's
Kritieke leveranciers

Nederlandse overheidsorganisaties hebben te maken met een krappe arbeidsmarkt, toegenomen NIS2-verplichtingen en een hoog verwachtingspatroon van burgers en toezichthouders. Wanneer security operations geen transparant loopbaanmodel hanteert, ontstaat ongecontroleerde uitstroom naar commerciële partijen, raakt kennis gefragmenteerd over tijdelijke inhuur en wordt het vrijwel onmogelijk om aantoonbaar aan BIO-eisen te voldoen. Zonder structurele ontwikkeling blijven runbooks onbeheerd, blijft integratie met Microsoft 365 Defender steken in pilots en worden auditors telkens geconfronteerd met dezelfde verbeterpunten. Een loopbaanarchitectuur vormt daarom evenzeer een beveiligingsmaatregel als een HR-instrument.

PowerShell Modules Vereist
Primary API: Microsoft Graph directory data, Defender XDR incident API, Purview auditlog-export
Connection: Gebruik van Connect-MgGraph met Directory.Read.All en SecurityEvents.Read.All voor rapportages; optioneel CSV-export van HR-systemen
Required Modules: Microsoft.Graph

Implementatie

Dit artikel vertaalt de Nederlandse Baseline voor Veilige Cloud naar concrete richtlijnen voor loopbaanpaden binnen Microsoft 365 security operations. We behandelen het strategisch kader met competentieprofielen, beschrijven hoe rollen worden gemapt op Microsoft 365-functionaliteit en tonen hoe het PowerShell-script `career-paths.ps1` helpt bij het analyseren van skill-gaps, opleidingsplanning en rapportage richting bestuurders. De nadruk ligt op praktische toepasbaarheid: elk hoofdstuk koppelt beleidskeuzes aan datagedreven inzichten, zodat SOC-leads en CISO's loopbanen net zo aantoonbaar kunnen beheersen als technische controls.

Strategisch loopbaan- en competentiekader

Een strategisch loopbaanmodel start bij een duidelijk beeld van de opdracht van het Security Operations Center binnen Microsoft 365. De meeste overheidsorganisaties combineren identiteitsbeveiliging, Microsoft Defender XDR, Purview en business-applicaties in één keten. Daardoor moeten loopbaanpaden niet per dienstonderdeel worden ontworpen, maar vanuit de gehele detectie- en responscyclus. Het kader beschrijft per maturiteitsniveau – trainee, analist, specialist, architect en leidinggevende – welke verantwoordelijkheden horen bij proactieve detectie, incidentcoördinatie, automatisering en rapportage aan bestuurders. Door deze verantwoordelijkheden nadrukkelijk te koppelen aan Microsoft 365-diensten (zoals Entra ID, Defender for Office 365, Sentinel of Purview) ontstaat een matrix waarop medewerkers hun groei kunnen projecteren terwijl het management exact ziet waar lacunes in expertise dreigen.

Het competentiekader bevat meer dan alleen technische skills. NIS2 en BIO vereisen dat security operations incidenten koppelt aan governance, risico en juridische processen. Daarom worden vaardigheden zoals stakeholdercommunicatie, crisisbesluitvorming, privacybeoordelingen en ketensamenwerking expliciet opgenomen. Elke vaardigheid wordt beschreven met observabele gedragingen, zodat leidinggevenden op basis van feitelijke prestaties kunnen bepalen of iemand klaar is voor een volgende stap. Dit voorkomt willekeur en maakt loopbaanbesluiten reproduceerbaar richting ondernemingsraden en HR. Het kader benoemt bovendien welke certificeringen, Microsoft 365-trainingspaden en Nederlandse opleidingen (bijvoorbeeld NCSC-cursussen of Rijksacademie-programma's) aansluiten op de verschillende niveaus, zodat medewerkers niet zelf hoeven te zoeken naar relevante scholing.

Om te voorkomen dat het model een papieren werkelijkheid blijft, wordt het geïntegreerd in bestaande HR-processen. Functieprofielen, beoordelingsformulieren en opleidingsbudgetten verwijzen naar dezelfde competenties, waardoor managers niet voor elke medewerker aparte afspraken hoeven te maken. Informatie uit Microsoft 365 – zoals de complexiteit van behandelde incidenten, bijdrages aan playbooks, of deelname aan automatiseringsprojecten – wordt gebruikt als objectieve indicator voor voortgang. Dit betekent dat security operations en HR gezamenlijke dashboards ontwikkelen waarin loopbaanstatus, certificering en inzetbaarheid zichtbaar zijn. De combinatie van HR-data en operationele metrics geeft bestuurders vertrouwen dat loopbaanbeleid daadwerkelijk effect heeft op de weerbaarheid van de organisatie.

Een strategisch kader beschrijft ten slotte hoe schaarse expertise wordt beschermd. Voor cruciale rollen, zoals use-case engineers of threat hunters met diepgaande kennis van Microsoft 365, wordt een successieplanning opgenomen inclusief buddy-systemen, job rotation en documentatie-eisen. Daarmee wordt voorkomen dat kennis verdwijnt wanneer iemand langdurig afwezig is. Het kader koppelt deze maatregelen aan concrete risicoscenario's, bijvoorbeeld escalaties waarbij alleen een specifieke specialist scripts kan aanpassen. Door de risico's te kwantificeren ontstaat bestuurlijke steun voor gerichte loopbaaninvesteringen: het is aantoonbaar goedkoper om opleidingstrajecten te financieren dan incidenten te accepteren die vanwege kennisgebrek weken open blijven.

Het strategisch kader krijgt extra gewicht door expliciete koppelvlakken met ondernemingsstrategie en begrotingscycli. Jaarplannen van de CISO-organisatie bevatten nu een paragraaf waarin loopbaanprioriteiten worden vertaald naar begrotingsposten, zoals studie-uren, licenties voor oefenplatformen en samenwerkingen met opleiders. Deze koppeling maakt het mogelijk om loopbaaninvesteringen te beoordelen op dezelfde manier als technologieprojecten: via businesscases, risicoanalyses en voortgangsrapportages. Door financiële en organisatorische planning te integreren, wordt talentontwikkeling een vast agendapunt in bestuurlijke overleggen, waardoor beslissingen over bijvoorbeeld regionale SOC-samenwerking, outsourcing of shared services worden genomen op basis van feitelijke capaciteitsdata in plaats van buikgevoel.

Ontwerp, uitvoering en meting van loopbaanprogramma's

Gebruik PowerShell-script career-paths.ps1 (functie Invoke-CareerReadiness) – Analyseert configuratiegegevens over rollen, vaardigheden en trainingsstatussen en berekent waar hiaten bestaan in het loopbaanportfolio..

Wanneer het strategisch kader staat, verschuift de aandacht naar de daadwerkelijke inrichting van programma's. Een loopbaanprogramma maakt inzichtelijk welke medewerkers zich in welke fase bevinden en welke interventies nodig zijn om een volgend niveau te bereiken. Het ontwerp bevat intakegesprekken, skill-assessments op basis van Microsoft 365 use-cases, en opdrachten die reflecteren hoe iemand onder druk beslissingen neemt. Door assessments te koppelen aan realistische scenario's – denk aan het reconstrueren van een aanvaller in Defender XDR of het bouwen van een automatiseringsrunbook in Power Automate – wordt meteen getest of kennis toepasbaar is. Het programma definieert ook tijdslijnen: binnen welke periode moet een analist bijvoorbeeld doorstromen naar medior-niveau, en hoe wordt bepaald of extra begeleiding nodig is.

Het PowerShell-script `Invoke-CareerReadiness` ondersteunt deze fase door gegevens uit een configuratiebestand te analyseren. Het bestand bevat rollen, essentiële vaardigheden, opleidingsstatus en gekoppelde medewerkers. Het script controleert of er voldoende bezetting is voor 24x7-diensten, of kritieke vaardigheden (zoals KQL, incidentcommand of Purview-forensics) minimaal door twee personen worden beheerst, en of verplichte trainingen niet verlopen zijn. De output geeft een readiness-score per team en benoemt welke loopbaanpaden extra aandacht nodig hebben. Omdat het script uitsluitend werkt met lokale configuratiebestanden en optionele CSV-exporten, blijft het toepasbaar in streng gescheiden overheidsnetwerken zonder extra modules. De resultaten kunnen direct met HR worden gedeeld om prioriteit te geven aan opleidingen of werving.

Uitvoering gaat verder dan individuele ontwikkeling. Het loopbaanprogramma borgt dat kennisdeling en pair programming onderdeel worden van het rooster. Medewerkers draaien periodiek mee in andere diensten, bijvoorbeeld threat intelligence of automatisering, zodat zij inzicht krijgen in de volledige waardeketen. Dit bevordert innovatie en voorkomt eilandvorming. De programma's beschrijven hoe coaches worden ingezet, welke feedbackvormen worden gebruikt (bijvoorbeeld 360-graden-feedback na incidenten) en hoe successen zichtbaar worden gemaakt naar bestuurders. Door deze elementen expliciet te documenteren ontstaat een consistent leerklimaat waarin medewerkers weten wat er van hen wordt verwacht en waarin leidinggevenden de voortgang objectief kunnen volgen.

Tot slot bevat het programma duidelijke KPI's waarop bestuurders kunnen sturen. Denk aan het percentage openstaande rollen binnen een loopbaanpad, gemiddelde doorlooptijd naar senioriteit, aantal medewerkers met actuele Microsoft-certificeringen en het aandeel incidenten waarbij een trainee zelfstandig de eerste analyse uitvoert. Deze indicatoren worden afgestemd op bestaande SOC-metrics zodat loopbaanontwikkeling een integraal onderdeel van de prestatiecyclus wordt. Door regelmatig rapportages te delen in CISO- of CIO-overleggen wordt loopbaanbeleid zichtbaar als onderdeel van risicomanagement, waardoor financiering en prioriteit beter geborgd blijven.

Voor duurzame uitvoering is ook governance essentieel. Het loopbaanprogramma benoemt een product owner, een stuurgroep met vertegenwoordigers van HR, security operations en lijnmanagement, en een overlegstructuur waarin afwijkingen tijdig worden besproken. Besluiten over uitzonderingen – bijvoorbeeld het versneld promoveren van een specialist vanwege acute behoefte – worden vastgelegd inclusief argumentatie en looptijd. Hierdoor blijft het programma eerlijk en uitlegbaar, zelfs wanneer politieke druk of incidenten vragen om snelle ingrepen. Deze governance-laag zorgt ervoor dat loopbaanmaatregelen niet verzanden in goedbedoelde initiatieven, maar daadwerkelijk onderdeel vormen van een gecontroleerde veranderagenda.

Remediatie, opleiding en continue verbetering

Gebruik PowerShell-script career-paths.ps1 (functie Publish-CareerPathReport) – Genereert een rapport met aanbevelingen, opleidingsacties en opvolging per rol zodat bestuurders inzicht krijgen in loopbaandekking..

Geen enkel loopbaanprogramma is vanaf dag één perfect. Remediatie begint met een nulmeting: welke rollen zijn vandaag ingevuld, welke vaardigheden ontbreken en welk risico brengt dat mee voor Microsoft 365-beveiliging? De nulmeting wordt gekoppeld aan incidenthistorie: wanneer blijkt dat meervoudige incidenten vertraagd zijn door een gebrek aan KQL-expertise, krijgt dat direct prioriteit in de opleidingsplanning. Het programma beschrijft hoe een verbeterplan wordt opgesteld inclusief budget, trainers, examendata en evaluaties. Belangrijk is dat deze verbeteringen niet vrijblijvend zijn; het rapport `Publish-CareerPathReport` maakt zichtbaar welke commitments het management heeft gedaan en of deadlines worden gehaald. Hierdoor kunnen auditors aantonen dat loopbaanrisico's actief worden beheerd.

Opleidingstrajecten worden ingericht volgens het principe 'train as you operate'. Dat betekent dat medewerkers tijdens Microsoft 365-incidentoefeningen nieuwe vaardigheden direct toepassen. Tabletop-oefeningen en live drills bevatten expliciete doelstellingen per loopbaanfase: trainees leren escalatiecriteria formuleren, medior-analisten oefenen met het leiden van een bridge-call, en senioren focussen op cross-organisatorische coördinatie. Evaluaties worden vastgelegd in hetzelfde configuratiebestand dat door het script wordt gelezen, zodat lessen automatisch terugkomen in de volgende rapportage. Dit houdt het programma actueel en voorkomt dat feedback verdwijnt in losse documenten of e-mails.

Continu verbeteren betekent ook dat uitstroom, inhuur en ketensamenwerking worden meegenomen. Het loopbaanbeleid voorziet in exit-interviews waarin kennisoverdracht verplicht is, en benoemt welke documentatie moet worden bijgewerkt voordat iemand het team verlaat. Voor tijdelijke specialisten wordt vastgelegd welke kennis zij moeten overdragen en hoe zij Nederlandse wet- en regelgeving toepassen in hun werk. Door deze afspraken vast te leggen, voorkomt de organisatie dat externe partijen kritieke kennis monopolistisch vasthouden. Het beleid beschrijft bovendien hoe ketenpartners (zoals andere ministeries of veiligheidsregio's) worden betrokken bij gezamenlijke loopbaanprogramma's, zodat uitwisseling van talent een gecontroleerd proces wordt in plaats van een noodgreep tijdens incidenten.

Tot slot sluit continue verbetering aan op de bredere kwaliteitscyclus van de Nederlandse Baseline voor Veilige Cloud. Bevindingen uit audits, red-team-oefeningen en lessons learned uit incidenten worden vertaald naar aangepaste competenties en nieuwe leerlijnen. Het rapport uit het script geeft per kwartaal een overzicht van behaalde certificeringen, openstaande acties, resourceplanning en verwachte instroom van trainees. Bestuurders gebruiken deze informatie om investeringsbeslissingen te onderbouwen, bijvoorbeeld extra FTE voor automatisering of het financieren van een Microsoft 365-expertprogramma. Door loopbaaninformatie te integreren met de enterprise risk dashboards ontstaat één verhaal: organisatorische ontwikkeling is geen nice-to-have, maar een aantoonbare maatregel tegen dreigingen die Microsoft 365 raken.

Een volwassen remediatieproces sluit af met transparante communicatie naar medewerkers. Elke rapportage uit het script wordt vertaald naar acties die tijdens teamstand-ups en dialooggesprekken worden gedeeld. Medewerkers weten daardoor precies waarom bepaalde trainingen verplicht zijn, hoe voortgang wordt gemeten en welke kansen er ontstaan bij goede prestaties. Deze openheid vergroot vertrouwen en maakt het mogelijk om feedback uit de praktijk snel terug te koppelen naar het programmabureau. Zo ontstaat een lerende organisatie waarin Microsoft 365 security operations niet alleen technisch, maar ook menselijk voortdurend verbetert.

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 Loopbaan- en competentiebeheer voor Microsoft 365 security operations. .DESCRIPTION Dit script ondersteunt SOC- en CISO-teams bij het analyseren van skill-gaps, het genereren van opleidingsplannen en het rapporteren over loopbaanpaden binnen Microsoft 365 security operations. Het werkt met een lokaal configuratiebestand zodat het eenvoudig te gebruiken is in gescheiden netwerken. .NOTES Project : Nederlandse Baseline voor Veilige Cloud Author : Nederlandse Baseline voor Veilige Cloud Team File : career-paths.ps1 .EXAMPLE .\career-paths.ps1 -Remediation Maakt een basisconfiguratie aan of werkt een bestaande configuratie bij. .EXAMPLE .\career-paths.ps1 -Assess Voert een skill-gap-analyse uit en toont readiness-scores per rol. .EXAMPLE .\career-paths.ps1 -Report Genereert een samenvattend rapport met aanbevelingen voor bestuurders. #> #Requires -Version 5.1 [CmdletBinding(DefaultParameterSetName = 'Help')] param( [Parameter(ParameterSetName = 'Assess')] [switch]$Assess, [Parameter(ParameterSetName = 'Generate')] [switch]$GeneratePlan, [Parameter(ParameterSetName = 'Report')] [switch]$Report, [Parameter(ParameterSetName = 'Remediation')] [switch]$Remediation, [Parameter(ParameterSetName = 'Revert')] [switch]$Revert, [Parameter(Mandatory = $false)] [switch]$WhatIf ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' Write-Host "`n===============================================" -ForegroundColor Cyan Write-Host "Loopbaanmonitor Microsoft 365 Security Operations" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "===============================================`n" -ForegroundColor Cyan function Get-ConfigPath { $scriptDir = Split-Path -Parent $PSCommandPath return (Join-Path -Path $scriptDir -ChildPath 'career-paths.config.json') } function Get-PlanPath { $scriptDir = Split-Path -Parent $PSCommandPath return (Join-Path -Path $scriptDir -ChildPath 'career-paths.plan.csv') } function Initialize-DefaultConfig { $today = (Get-Date).ToString('yyyy-MM-dd') $config = [ordered]@{ version = '1.0' lastUpdated = $today owner = 'SOC Manager' targets = [ordered]@{ minSeniorAnalysts = 4 minAutomationSpecialists = 2 minCoveragePerSkillPct = 200 reviewIntervalDays = 180 } roles = @( [ordered]@{ name = 'SOC Analyst' level = 'Medior' coverageNeeded = 6 staff = @('Analist 1','Analist 2','Analist 3') criticalSkills = @('KQL','Incident Triage','Purview Audit','Defender XDR') certifications = @('SC-200') lastReview = $today }, [ordered]@{ name = 'Use Case Engineer' level = 'Senior' coverageNeeded = 3 staff = @('Engineer 1') criticalSkills = @('Automation','PowerShell','Sentinel Rules','Threat Modeling') certifications = @('SC-100') lastReview = '' }, [ordered]@{ name = 'Incident Commander' level = 'Senior' coverageNeeded = 2 staff = @() criticalSkills = @('Crisiscommunicatie','Compliance','Stakeholdermanagement') certifications = @('CISSP','SC-100') lastReview = '' } ) trainings = @( [ordered]@{ id = 'TRN-001' title = 'Microsoft 365 Incident Simulation' targetRole = 'SOC Analyst' dueDate = (Get-Date).AddDays(60).ToString('yyyy-MM-dd') status = 'Planned' }, [ordered]@{ id = 'TRN-002' title = 'Advanced KQL Deep Dive' targetRole = 'Use Case Engineer' dueDate = (Get-Date).AddDays(45).ToString('yyyy-MM-dd') status = 'Planned' } ) } return $config } function Save-Config { param( [Parameter(Mandatory = $true)] [hashtable]$Config ) $configPath = Get-ConfigPath $configJson = $Config | ConvertTo-Json -Depth 6 if ($WhatIf) { Write-Host "[WhatIf] Configuratie zou worden geschreven naar $configPath" -ForegroundColor Yellow Write-Host $configJson return } $configDir = Split-Path -Parent $configPath if (-not (Test-Path -Path $configDir)) { New-Item -ItemType Directory -Path $configDir -Force | Out-Null } $configJson | Out-File -FilePath $configPath -Encoding UTF8 -Force Write-Host "[OK] Configuratie opgeslagen op $configPath" -ForegroundColor Green } function Get-ConfigData { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { throw "Geen configuratiebestand gevonden. Voer '.\career-paths.ps1 -Remediation' uit om een basisconfiguratie aan te maken." } $raw = Get-Content -Path $configPath -Raw return ($raw | ConvertFrom-Json -Depth 6) } function Invoke-Remediation { try { $configPath = Get-ConfigPath if (Test-Path -Path $configPath) { $backup = "$configPath.bak_{0}" -f (Get-Date -Format 'yyyyMMddHHmmss') if (-not $WhatIf) { Copy-Item -Path $configPath -Destination $backup -Force } Write-Host "[INFO] Back-up opgeslagen als $backup" -ForegroundColor Cyan } $config = Initialize-DefaultConfig Save-Config -Config $config } catch { Write-Host "[FAIL] Remediatie mislukt: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Assess { try { $config = Get-ConfigData $now = Get-Date $coverageFindings = @() foreach ($role in $config.roles) { $headcount = ($role.staff | Measure-Object).Count $coverage = if ($role.coverageNeeded -gt 0) { [math]::Round(($headcount / $role.coverageNeeded) * 100, 0) } else { 0 } $hasReview = -not [string]::IsNullOrWhiteSpace($role.lastReview) $lastReviewAge = if ($hasReview) { (New-TimeSpan -Start (Get-Date $role.lastReview) -End $now).Days } else { $null } $reviewStatus = if ($hasReview) { "{0} dagen" -f $lastReviewAge } else { "geen review geregistreerd" } $coverageFindings += [pscustomobject]@{ Role = $role.name Level = $role.level Needed = $role.coverageNeeded Assigned = $headcount CoveragePct = $coverage LastReviewDays = $lastReviewAge ReviewStatus = $reviewStatus MissingSkills = if ($headcount -lt $role.coverageNeeded) { ($role.criticalSkills | Measure-Object).Count } else { 0 } } } $insufficientCoverage = $coverageFindings | Where-Object { $_.CoveragePct -lt 100 } $staleReviews = $coverageFindings | Where-Object { ($null -eq $_.LastReviewDays) -or ($_.LastReviewDays -gt $config.targets.reviewIntervalDays) } Write-Host "Readiness overzicht:" -ForegroundColor Cyan $coverageFindings | Sort-Object Role | Format-Table -AutoSize if ($insufficientCoverage) { Write-Host "`n[WARN] Rollen met onvoldoende bezetting:" -ForegroundColor Yellow foreach ($item in $insufficientCoverage) { Write-Host (" - {0}: {1}/{2} bezet ({3}% dekking)" -f $item.Role, $item.Assigned, $item.Needed, $item.CoveragePct) -ForegroundColor Yellow } } else { Write-Host "`n[OK] Alle rollen voldoen aan de minimale bezetting." -ForegroundColor Green } if ($staleReviews) { Write-Host ("`n[WARN] Rollen zonder recente beoordeling (> {0} dagen):" -f $config.targets.reviewIntervalDays) -ForegroundColor Yellow foreach ($item in $staleReviews) { $ageDescription = if ($null -eq $item.LastReviewDays) { "geen review geregistreerd" } else { "{0} dagen sinds laatste review" -f $item.LastReviewDays } Write-Host (" - {0}: {1}" -f $item.Role, $ageDescription) -ForegroundColor Yellow } } else { Write-Host "`n[OK] Alle rollen zijn binnen de reviewtermijn beoordeeld." -ForegroundColor Green } } catch { Write-Host "[FAIL] Assessment mislukt: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-GeneratePlan { try { $config = Get-ConfigData $planDir = Split-Path -Parent (Get-PlanPath) if (-not (Test-Path -Path $planDir)) { New-Item -ItemType Directory -Path $planDir -Force | Out-Null } $plan = foreach ($training in $config.trainings) { [pscustomobject]@{ TrainingId = $training.id Title = $training.title TargetRole = $training.targetRole DueDate = $training.dueDate Status = $training.status } } if ($WhatIf) { Write-Host "[WhatIf] Trainingsplan zou worden geschreven naar $(Get-PlanPath)" -ForegroundColor Yellow $plan | Format-Table -AutoSize return } $plan | Export-Csv -Path (Get-PlanPath) -NoTypeInformation -Encoding UTF8 Write-Host "[OK] Trainingsplan geëxporteerd naar $(Get-PlanPath)" -ForegroundColor Green } catch { Write-Host "[FAIL] Genereren van plan mislukt: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Report { try { $config = Get-ConfigData $reportPath = Join-Path -Path (Split-Path -Parent $PSCommandPath) -ChildPath 'career-paths-report.txt' $now = Get-Date $lines = @() $lines += "Rapport: Loopbaanpaden Microsoft 365 Security Operations" $lines += "Datum : $now" $lines += "Eigenaar: $($config.owner)" $lines += "" $lines += "Samenvatting per rol:" foreach ($role in $config.roles) { $headcount = ($role.staff | Measure-Object).Count $coverage = if ($role.coverageNeeded -gt 0) { [math]::Round(($headcount / $role.coverageNeeded) * 100, 0) } else { 0 } $lines += ("- {0} ({1}) - dekking {2}/{3} ({4}%)" -f $role.name, $role.level, $headcount, $role.coverageNeeded, $coverage) } $lines += "" $lines += "Open trainingsacties:" foreach ($training in $config.trainings | Where-Object { $_.status -ne 'Completed' }) { $lines += ("- {0} ({1}) -> vervaldatum {2}" -f $training.title, $training.targetRole, $training.dueDate) } if (-not $WhatIf) { $lines | Out-File -FilePath $reportPath -Encoding UTF8 -Force Write-Host "[OK] Rapport opgeslagen op $reportPath" -ForegroundColor Green } else { Write-Host "[WhatIf] Rapport zou worden opgeslagen op $reportPath" -ForegroundColor Yellow $lines | ForEach-Object { Write-Host $_ } } } catch { Write-Host "[FAIL] Rapportage mislukt: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Revert { try { $configPath = Get-ConfigPath $planPath = Get-PlanPath $reportPath = Join-Path -Path (Split-Path -Parent $PSCommandPath) -ChildPath 'career-paths-report.txt' $paths = @($configPath, $planPath, $reportPath) foreach ($path in $paths) { if (Test-Path -Path $path) { if ($WhatIf) { Write-Host "[WhatIf] Bestand zou worden verwijderd: $path" -ForegroundColor Yellow } else { Remove-Item -Path $path -Force Write-Host "[OK] Bestand verwijderd: $path" -ForegroundColor Green } } } } catch { Write-Host "[FAIL] Revert mislukt: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } try { switch ($PSCmdlet.ParameterSetName) { 'Assess' { Invoke-Assess; break } 'Generate' { Invoke-GeneratePlan; break } 'Report' { Invoke-Report; break } 'Remediation' { Invoke-Remediation; break } 'Revert' { Invoke-Revert; break } default { Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Remediation Maak of update de basisconfiguratie" -ForegroundColor Gray Write-Host " -Assess Controleer bezetting en skill-gaps" -ForegroundColor Gray Write-Host " -GeneratePlan Exporteer het trainingsplan naar CSV" -ForegroundColor Gray Write-Host " -Report Genereer een managementrapport" -ForegroundColor Gray Write-Host " -Revert Verwijder configuratie en rapportages (optioneel -WhatIf)" -ForegroundColor Gray } } } catch { Write-Host "[FAIL] Onverwachte fout: $($_.Exception.Message)" -ForegroundColor Red exit 2 } finally { Write-Host "`n===============================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: De organisatie blijft kwetsbaar voor kennisverlies, kan incidenten niet consistent afhandelen en faalt op de aantoonbaarheidseisen van BIO en NIS2 rondom personeel en governance.

Management Samenvatting

Ontwerp loopbaanpaden die Microsoft 365-processen volgen, meet skill-gaps met `career-paths.ps1` en veranker opleiding, rapportage en successieplanning in governance zodat security operations duurzaam bemenst blijft.