Cyberweerbare Directies En Toezicht

💼 Management Samenvatting

Cyberweerbaarheid is pas geloofwaardig wanneer de volledige directie dezelfde digitale taal spreekt, scenario’s kan duiden en realtime zicht heeft op de staat van Microsoft 365. Dit artikel vertaalt de Nederlandse Baseline voor Veilige Cloud naar een bestuurlijk programma dat leiders gewapend met actuele kennis, meetbare competenties en duidelijke escalatieroutes laat opereren.

Aanbeveling
PLAN_EN_IMPLEMENTEER
Risico zonder
Hoog
Risk Score
8/10
Implementatie
220u (tech: 80u)
Van toepassing op:
Raden van Bestuur
College van B&W
Secretarissen-Generaal
Directies Publieke Sector
CISO-office
Chief Risk Officers

Inspecties naar Wbni, NIS2 en BIO tonen dat bestuurders vaak wel beleidsnotities goedkeuren maar geen aantoonbare training hebben gevolgd, geen vaste KPI’s ontvangen en bij incidenten terugvallen op ad-hoc communicatie. Tegelijkertijd eisen toezichthouders dat directies kunnen uitleggen waarom bepaalde risico’s acceptabel zijn, welke maatregelen in Microsoft 365 draaien en hoe externe ketenpartners worden beoordeeld. Zonder structurele cybergeletterdheid ontstaan vertragingen bij strategische investeringen, worden incidenten te laat opgeschaald en verliest de organisatie vertrouwen bij burgers en parlement. Een programma dat leerdoelen koppelt aan concrete Microsoft 365-telemetrie voorkomt deze kloof en maakt het bestuur toetsbaar.

PowerShell Modules Vereist
Primary API: Microsoft Graph Reports API, Microsoft Graph Learning Provider API, Microsoft Teams attendance reports
Connection: Connect-MgGraph voor identity- en leerdata, aangevuld met PowerShell-exports uit Viva Learning en Teams vergaderrapporten
Required Modules: Microsoft.Graph.Authentication, Microsoft.Graph.Users, Microsoft.Graph.Reports, Microsoft.Graph.Beta.EmployeeExperience

Implementatie

We beschrijven hoe u een directieprogramma ontwerpt, bestuurt en monitort. Eerst schetsen we de wettelijke verwachtingen en het gewenste gedrag aan de top. Vervolgens werken we een curriculum en ondersteunende instrumenten uit, inclusief simulaties, gezamenlijke dashboards en afspraken met toezichthouders. Tot slot presenteren we een datagedreven aanpak met het PowerShell-script director-cyber-literacy.ps1 dat automatische rapportages levert over deelname, maturiteit en open acties. Het resultaat is een samenhangende aanpak die zowel cultuur als techniek adresseert.

Bestuurlijke verantwoordelijkheid, wettelijke verwachtingen en cultuur

Cyberweerbaarheid is voor Nederlandse overheidsorganisaties geen gedelegeerde taak van de CISO maar een formele verantwoordelijkheid van het volledige bestuur. De recente evaluaties van de Baseline Informatiebeveiliging Overheid en de invoering van NIS2 tonen dat toezichthouders expliciet vragen hoe vaak bestuurders inhoudelijke sessies over dreigingen volgen, welk besluitvormingsritme is vastgelegd en welke triggers leiden tot onmiddellijke escalatie naar de voorzitter. Directies die deze vragen niet overtuigend beantwoorden lopen het risico dat auditors constateren dat de “beheerste organisatie” niet kan worden aangetoond. Daarom moeten leidinggevenden dezelfde taal spreken als security-architecten en begrijpen hoe Microsoft 365 zich verhoudt tot vitale processen zoals belastinginning, vergunningverlening of zorglogistiek. Pas wanneer bestuurders de technische en juridische implicaties in één verhaal kunnen samenvatten, ontstaat vertrouwen bij ministeries, raden en ketenpartners.

De urgentie wordt versterkt door incidenten in Europese overheden waarbij bestuursleden phishing-simulaties negeerden, applicatiebeperkingen terugdraaiden uit ongemak of tijdens crisissituaties op onbeveiligde kanalen communiceerden. Zulke situaties laten zien dat kennisachterstand direct leidt tot strategische fouten. Het programma voor cybergeletterdheid moet daarom verder gaan dan een losse training: het omvat scenario-oefeningen, gezamenlijke review van Secure Score en Purview-rapporten, en reflecties op ethische dilemma’s rond AI en dataresidentie. Elke sessie koppelt technische signalen aan bestuurlijke keuzes, bijvoorbeeld hoe Conditional Access beleid de toegankelijkheid voor wethouders beïnvloedt of welke contractuele afspraken nodig zijn met leveranciers van bestuurlijke dashboards. Door incidentcases uit de Nederlandse context te analyseren, ontstaat bewustzijn dat cyberrisico geen abstract fenomeen is maar direct de continuïteit van publieke dienstverlening bedreigt.

Culturele verandering is minstens zo belangrijk als kennisoverdracht. Besturen moeten expliciet maken dat digitale veiligheid onderdeel is van de kernopdracht en dat ieder directielid eigenaar is van een risicodomein: identiteit, data, operatie of keten. In de praktijk betekent dit dat vergaderrituelen veranderen. Elke bestuursvergadering bevat een cyberparagraaf waarin voortgang op Microsoft 365-roadmaps, openstaande auditbevindingen en lessons learned uit oefeningen worden besproken. Besluiten worden vastgelegd in een register dat tevens voeding vormt voor intranetcommunicatie en compliance-audits. Door deze discipline wordt cybersecurity geen agendapunt dat wegvalt bij tijdgebrek, maar een integraal onderdeel van bestuurlijke dialoog en risicogestuurd werken. Het programma legt vast dat directies alleen besluiten mogen herzien wanneer impactanalyses zijn gedeeld en dat uitzonderingen altijd worden voorzien van tijdelijke beheersmaatregelen.

Tot slot vereist de cultuurverandering dat bestuurders zichtbaar het goede voorbeeld geven. Zij registreren zich als eerste voor passwordless authenticatie, gebruiken alleen goedgekeurde apparaten en laten hun eigen accounts periodiek testen in red-team-oefeningen. Door die voorbeeldrol gaan middenmanagement en medewerkers zien dat regels niet alleen voor operationele teams gelden. Het programma koppelt voorbeeldgedrag aan meetbare indicatoren zoals het percentage directieleden met actuele MFA-methoden, deelname aan ‘tabletop’ sessies en snelheid van besluitvorming bij incidenten. Deze transparantie maakt duidelijk dat cyberweerbaarheid niet kan worden uitbesteed: het is een collectieve verantwoordelijkheid waarbij de directie vooroploopt en de toon zet voor de gehele organisatie.

Curriculum, competenties en governance van het directieprogramma

Een volwassen directieprogramma combineert kennis, vaardigheden en gedrag in een meerjarig curriculum met duidelijke toetsmomenten. In de Nederlandse Baseline voor Veilige Cloud onderscheiden we vijf competentiedomeinen: strategisch begrip van dreigingen, interpretatie van Microsoft 365-telemetrie, besluitvorming onder tijdsdruk, regulatorische verantwoording en ketensamenwerking. Elk domein kent leerdoelen met meetbare uitkomsten. Zo moet een bestuurder kunnen verklaren hoe Secure Score zich verhoudt tot investeringsbeslissingen, of beschrijven welke stappen worden doorlopen wanneer een Purview-waarschuwing wijst op datalekken. De leeractiviteiten variëren van verdiepende colleges met NCSC-experts tot simulaties waarin bestuurders binnen 30 minuten beslissingen moeten nemen over het afsluiten van tenant-functionaliteit terwijl een collegevergadering onderbreking eist. Door deze oefeningen ontstaat spiergeheugen dat in echte crisissituaties direct kan worden ingezet.

Het curriculum integreert Microsoft 365-instrumenten. Viva Learning documenteert modules over zero trust, data-classificatie en identiteitsbeheer, terwijl Teams wordt gebruikt voor virtuele intervisies en reflectiesessies. Iedere module eindigt met een praktijkopdracht waarbij bestuurders dashboards beoordelen of een besluitnota redigeren met expliciete verwijzing naar technische randvoorwaarden. Deze aanpak dwingt hen om jargon te vertalen naar bestuurlijke taal en houdt de brug tussen techniek en bestuur intact. Documentbeheerders slaan bewijs automatisch op in een governancebibliotheek zodat auditors later kunnen verifiëren dat trainingen daadwerkelijk zijn gevolgd. Bovendien worden kennisleiders aangewezen per thema zodat continuiteit is geborgd wanneer bestuursleden wisselen. Deze kennisleiders onderhouden een “leerdossier” waarin de relevantie voor BIO, AVG en NIS2 per module is beschreven.

Governance rond het programma is cruciaal. Het CISO-office fungeert als programmabureau en rapporteert elk kwartaal aan de auditcommissie over deelnamegraad, leerresultaten en opvolging van afspraken. De secretaris-generaal of gemeentesecretaris is sponsor en borgt dat sessies prioriteit krijgen, ook tijdens drukke begrotingsperiodes. Juridische afdelingen controleren of trainingscontent in lijn is met privacy en arbeidsrecht, vooral wanneer bestuurders tijdens oefeningen worden beoordeeld. De ondernemingsraad en adviesraden voor personeel worden betrokken zodat de organisatie begrijpt dat investeringen in directievaardigheden bijdragen aan veiligheid voor iedereen. Tot slot voorziet het programma in een jaarlijkse herijking waarin lessons learned uit echte incidenten worden vertaald naar nieuwe modules of aangescherpte scenario’s.

Een onderscheidend element is de koppeling met externe stakeholders. Toezichthouders en ketenpartners worden periodiek uitgenodigd om feedback te geven op het programma en om gezamenlijke oefeningen te draaien, bijvoorbeeld over regionale crisiscommunicatie of uitwijk binnen samenwerkingsverbanden. Hierdoor ontstaat vertrouwen dat de organisatie niet alleen intern maar ook in de keten bestuurlijk volwassen handelt. Overeenkomsten met leveranciers bevatten clausules die bestuurders verplicht informeren over wijzigingen in beveiligingsdiensten, zodat zij hun toezichtrol proactief kunnen invullen. Door het programma op deze manier te verankeren ontstaat een continu leerproces dat het bestuur in staat stelt om geloofwaardig richting te geven aan grote digitale transformaties binnen Microsoft 365.

Datagedreven monitoring, rapportage en remediatie

Gebruik PowerShell-script director-cyber-literacy.ps1 (functie Invoke-DirectorCyberLiteracy) – Verzamelt deelnemerslijsten, trainingsvoortgang en besluitvormingsacties uit Microsoft Graph en levert een rapportage die direct in bestuurspakketten kan worden opgenomen..

Transparante monitoring is noodzakelijk om aan te tonen dat cybergeletterdheid daadwerkelijk wordt geborgd. Het programma gebruikt Microsoft Graph om leden van directiegroepen, deelname aan Viva Learning-modules en Teams-vergaderlogboeken te koppelen. Daardoor is direct zichtbaar welke bestuurders een module hebben afgerond, welke oefening is gemist en of crisisoverleggen binnen de afgesproken tijd werden geopend. Het PowerShell-script director-cyber-literacy.ps1 vormt de spil van deze monitoring. De functie Invoke-DirectorCyberLiteracy haalt alle relevante gegevens op, normaliseert ze tot één dataset en voorziet elke record van context zoals leerdoel, datum en vastgelegde besluiten. Het script bevat een DebugMode zodat lokale teams binnen vijftien seconden kunnen testen met voorbeelddata zonder productieverbindingen. Hierdoor blijft de kwaliteit van rapportages hoog, zelfs wanneer meerdere provincies of gemeenten dezelfde tooling hergebruiken.

Rapportages worden niet beperkt tot aanwezigheidslijsten maar tonen volwassenheidsindicatoren die bestuurders direct begrijpen. Een cyberliteracy-score combineert deelname, evaluaties en gedragsindicatoren zoals het gebruik van goedgekeurde apparaten. Het rapport geeft aan hoeveel dagen een directielid achterloopt, welke besluiten nog follow-up vereisen en hoe lang het duurde voordat een incidentbesluit werd bekrachtigd. Deze inzichten voeren direct druk op om actie te ondernemen zonder dat de CISO elke keer handmatig moet nabellen. Bovendien maakt het model inzichtelijk welke leeronderdelen het meeste impact hebben op Secure Score of Purview-incidenten, zodat bestuurders hun tijd besteden aan modules die aantoonbaar resultaten leveren.

De datagedreven aanpak ondersteunt ook remediatie. Wanneer een bestuurder structureel trainingen mist, genereert het script een actieplan met concrete stappen, waaronder nieuwe deadlines en vervangende modules. Dit plan kan automatisch via Teams of e-mail naar de bestuurssecretaris worden verzonden. Door logbestanden te bewaren ontstaat een volledig audit trail dat aantoont dat de organisatie proactief heeft gestuurd op naleving. Voor externe audits kunnen exports worden gedeeld via beveiligde kanalen of rechtstreeks in een governance dashboard worden geladen. Het programma beschrijft bovendien hoe gegevens worden geclassificeerd en hoe privacy wordt gewaarborgd: resultaten zijn alleen zichtbaar voor geautoriseerde rollen en worden na de afgesproken bewaartermijn automatisch gearchiveerd.

Tot slot koppelt de rapportage aan besluitvormingscycli. Voor iedere bestuursvergadering genereert het script een samenvatting met drie kernvragen: welke competenties zijn vernieuwd, waar staan rode vlaggen en welke ketenpartners vragen aandacht. Het verslag wordt voorzien van context uit Microsoft 365, zoals recente wijzigingen in Conditional Access of openstaande Purview-onderzoeken, zodat bestuurders begrijpen waarom hun persoonlijke ontwikkeling direct bijdraagt aan organisatorische risicobeheersing. Deze geïntegreerde aanpak maakt het mogelijk om cyberweerbaarheid aantoonbaar te verankeren in de bestuurscyclus en vermindert het risico dat opleidingen worden gezien als bijzaak.

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 Meet en rapporteert cybergeletterdheid van directies. .DESCRIPTION Het script ondersteunt het artikel "Cyberweerbare directies en toezicht" en levert een datagedreven overzicht van deelname aan leerprogramma's, aanwezigheid bij crisissimulaties, adoptie van beveiligingsmaatregelen en open acties voor bestuurders. Het script werkt in drie modi: - Invoke-DirectorCyberLiteracy : bouwt een object met actuele inzichten - Publish-DirectorReport : exporteert het rapport naar JSON - Measure-LearningGaps : toont hiaten per bestuurder DebugMode genereert voorbeelddata en voert geen cloudverbindingen uit zodat lokale testen binnen 15 seconden kunnen worden afgerond. .NOTES Filename : director-cyber-literacy.ps1 Author : Nederlandse Baseline voor Veilige Cloud Created : 2025-11-27 JSON : content/m365/governance/director-cyber-literacy.json Workload : Microsoft 365 - Governance Required : Microsoft.Graph PowerShell SDK .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\director-cyber-literacy.ps1 -DebugMode Toont voorbeelddata voor snelle validatie tijdens ontwikkeling. .EXAMPLE .\director-cyber-literacy.ps1 -Function Publish-DirectorReport -DirectorGroupId 00000000-0000-0000-0000-000000000000 Exporteert een volledig rapport voor de opgegeven directiegroep. #> #Requires -Version 5.1 #Requires -Modules Microsoft.Graph.Authentication [CmdletBinding()] param( [switch]$DebugMode, [ValidateSet("Invoke-DirectorCyberLiteracy", "Publish-DirectorReport", "Measure-LearningGaps")] [string]$Function = "Invoke-DirectorCyberLiteracy", [string]$OutputPath, [string]$DirectorGroupId, [ValidateRange(30, 365)] [int]$RollingDays = 90 ) Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' if (-not $OutputPath) { $OutputPath = Join-Path -Path (Get-Location) -ChildPath "director-cyber-literacy-report.json" } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Director Cyber Literacy (M365)" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Connect-DirectorContext { <# .SYNOPSIS Maakt verbinding met Microsoft Graph indien nodig. #> [CmdletBinding()] param() if ($DebugMode) { Write-Host "DebugMode actief: er worden geen cloudverbindingen gemaakt." -ForegroundColor Yellow return } if (-not $DirectorGroupId) { throw "Parameter -DirectorGroupId is verplicht wanneer DebugMode is uitgeschakeld." } $scopes = @( "Directory.Read.All", "Group.Read.All", "Reports.Read.All", "AuditLog.Read.All", "Learning.Read.All" ) try { Write-Host "Verbinding maken met Microsoft Graph..." -ForegroundColor Gray Connect-MgGraph -Scopes $scopes -NoWelcome -ErrorAction Stop | Out-Null Write-Host "Verbonden met Microsoft Graph." -ForegroundColor Green } catch { throw "Kon geen verbinding maken met Microsoft Graph: $_" } } function Get-DateWindow { [CmdletBinding()] param() $end = Get-Date $start = $end.AddDays(-1 * $RollingDays) return [PSCustomObject]@{ Start = $start End = $end } } function Get-DirectorRoster { <# .SYNOPSIS Haalt de lijst met directieleden op. #> [CmdletBinding()] param() if ($DebugMode) { return @( [PSCustomObject]@{ Id = "1111"; DisplayName = "Drs. M. van Rijn"; Mail = "m.vanrijn@example.nl"; Role = "Voorzitter"; Region = "Rijk"; HasPasswordless = $true }, [PSCustomObject]@{ Id = "2222"; DisplayName = "Ir. M. de Graaf"; Mail = "m.degraaf@example.nl"; Role = "CFO"; Region = "Noord"; HasPasswordless = $false }, [PSCustomObject]@{ Id = "3333"; DisplayName = "Dr. M. Singh"; Mail = "m.singh@example.nl"; Role = "CIO"; Region = "Zuid"; HasPasswordless = $true } ) } $uri = "https://graph.microsoft.com/v1.0/groups/$DirectorGroupId/members?`$select=id,displayName,mail,jobTitle" $members = Invoke-MgGraphRequest -Method GET -Uri $uri -ErrorAction Stop $result = @() while ($true) { foreach ($member in $members.value) { $result += [PSCustomObject]@{ Id = $member.id DisplayName = $member.displayName Mail = $member.mail Role = $member.jobTitle Region = "Onbekend" HasPasswordless = $false } } if ($members.'@odata.nextLink') { $members = Invoke-MgGraphRequest -Method GET -Uri $members.'@odata.nextLink' -ErrorAction Stop } else { break } } return $result } function Get-AuthenticationSignals { <# .SYNOPSIS Controleert passwordless adoptie en MFA. #> [CmdletBinding()] param( [Parameter(Mandatory)] [array]$Roster ) if ($DebugMode) { return @{ Registrations = @( @{ Id = "1111"; Passwordless = $true; MfaMethods = 3 }, @{ Id = "2222"; Passwordless = $false; MfaMethods = 1 }, @{ Id = "3333"; Passwordless = $true; MfaMethods = 2 } ) } } $registrations = @() foreach ($member in $Roster) { try { $url = "https://graph.microsoft.com/beta/reports/authenticationMethods/userRegistrationDetails?`$filter=userPrincipalName eq '$($member.Mail)'" $response = Invoke-MgGraphRequest -Method GET -Uri $url -ErrorAction Stop if ($response.value) { $detail = $response.value[0] $registrations += @{ Id = $member.Id Passwordless = [bool]($detail.methodsRegistered -contains "windowsHelloForBusiness" -or $detail.methodsRegistered -contains "fido2") MfaMethods = $detail.methodsRegistered.Count } } } catch { Write-Warning "Kon authenticatiegegevens niet ophalen voor $($member.DisplayName): $_" } } return @{ Registrations = $registrations } } function Get-LearningProgress { <# .SYNOPSIS Haalt leeractiviteiten van bestuurders op. #> [CmdletBinding()] param( [Parameter(Mandatory)] [array]$Roster, [Parameter(Mandatory)] [pscustomobject]$Window ) if ($DebugMode) { return @( @{ Id = "1111"; Completed = 5; LastCompleted = (Get-Date).AddDays(-12); MandatoryMissing = 0 }, @{ Id = "2222"; Completed = 2; LastCompleted = (Get-Date).AddDays(-65); MandatoryMissing = 2 }, @{ Id = "3333"; Completed = 4; LastCompleted = (Get-Date).AddDays(-20); MandatoryMissing = 1 } ) } $activities = @() foreach ($member in $Roster) { try { $query = "https://graph.microsoft.com/beta/employeeExperience/learningProviders/microsoft/learningCourseActivities?`$filter=userId eq '$($member.Id)'" $response = Invoke-MgGraphRequest -Method GET -Uri $query -ErrorAction Stop $completed = ($response.value | Where-Object { $_.completedDateTime -ge $Window.Start }).Count $last = ($response.value | Sort-Object completedDateTime -Descending | Select-Object -First 1).completedDateTime $activities += @{ Id = $member.Id Completed = $completed LastCompleted = if ($last) { [datetime]$last } else { $null } MandatoryMissing = [Math]::Max(0, 3 - $completed) } } catch { Write-Warning "Kon leerdata niet ophalen voor $($member.DisplayName): $_" } } return $activities } function Get-EngagementSignals { <# .SYNOPSIS Meet deelname aan crisis- en boardmeetings. #> [CmdletBinding()] param( [Parameter(Mandatory)] [array]$Roster, [Parameter(Mandatory)] [pscustomobject]$Window ) if ($DebugMode) { return @( @{ Id = "1111"; CrisisExercises = 3; AttendanceRate = 0.95 }, @{ Id = "2222"; CrisisExercises = 1; AttendanceRate = 0.62 }, @{ Id = "3333"; CrisisExercises = 2; AttendanceRate = 0.88 } ) } $signals = @() foreach ($member in $Roster) { try { $uri = "https://graph.microsoft.com/beta/communications/onlineMeetings?`$filter=CreatedDateTime ge $($Window.Start.ToString("o"))" $meetings = Invoke-MgGraphRequest -Method GET -Uri $uri -ErrorAction Stop $attendance = 0 $total = 0 foreach ($meeting in $meetings.value) { if ($meeting.participants -and $meeting.participants.organizer.identity.user.id -eq $member.Id) { continue } $total++ $attendance += 1 } $signals += @{ Id = $member.Id CrisisExercises = [Math]::Min($total, 5) AttendanceRate = if ($total -eq 0) { 0 } else { [Math]::Round($attendance / $total, 2) } } } catch { Write-Warning "Kon vergadergegevens niet ophalen voor $($member.DisplayName): $_" } } return $signals } function Measure-CyberLiteracyScore { [CmdletBinding()] param( [Parameter(Mandatory)] [array]$Roster, [Parameter(Mandatory)] [array]$Learning, [Parameter(Mandatory)] [array]$Engagement, [Parameter(Mandatory)] [hashtable]$AuthSignals ) $scores = @() foreach ($member in $Roster) { $learningInfo = $Learning | Where-Object { $_.Id -eq $member.Id } $engagementInfo = $Engagement | Where-Object { $_.Id -eq $member.Id } $authInfo = $AuthSignals.Registrations | Where-Object { $_.Id -eq $member.Id } $learningScore = if ($learningInfo) { [Math]::Min(1, $learningInfo.Completed / 4) } else { 0 } $attendanceScore = if ($engagementInfo) { $engagementInfo.AttendanceRate } else { 0 } $passwordless = if ($authInfo) { [bool]$authInfo.Passwordless } else { $false } $securityScore = if ($passwordless) { 1 } else { 0.5 } $composite = [Math]::Round(((0.45 * $learningScore) + (0.35 * $attendanceScore) + (0.20 * $securityScore)) * 100, 1) $scores += [PSCustomObject]@{ Id = $member.Id DisplayName = $member.DisplayName Mail = $member.Mail Role = $member.Role Region = $member.Region CompositeScore = $composite Passwordless = $passwordless CompletedModules = $learningInfo.Completed MandatoryMissing = $learningInfo.MandatoryMissing CrisisExercises = $engagementInfo.CrisisExercises AttendanceRate = $engagementInfo.AttendanceRate MfaMethods = if ($authInfo) { $authInfo.MfaMethods } else { 0 } } } return $scores } function Invoke-DirectorCyberLiteracy { [CmdletBinding()] param() Connect-DirectorContext $window = Get-DateWindow $roster = Get-DirectorRoster $learning = Get-LearningProgress -Roster $roster -Window $window $engagement = Get-EngagementSignals -Roster $roster -Window $window $auth = Get-AuthenticationSignals -Roster $roster $scores = Measure-CyberLiteracyScore -Roster $roster -Learning $learning -Engagement $engagement -AuthSignals $auth $averageScore = if ($scores) { [Math]::Round(($scores.CompositeScore | Measure-Object -Average).Average, 1) } else { 0 } $mandatoryGaps = ($scores | Where-Object { $_.MandatoryMissing -gt 0 }) return [PSCustomObject]@{ Script = "director-cyber-literacy.ps1" GeneratedAt = Get-Date DebugMode = [bool]$DebugMode RollingWindow = @{ Days = $RollingDays Start = $window.Start End = $window.End } Summary = @{ DirectorsTracked = $roster.Count AverageScore = $averageScore PasswordlessCoverage = [Math]::Round(((($scores | Where-Object { $_.Passwordless }).Count / [Math]::Max(1, $scores.Count)) * 100), 1) MandatoryLearningGaps = $mandatoryGaps.Count } DirectorScores = $scores LearningDetails = $learning Engagement = $engagement Authentication = $auth Recommendations = @( "Plan binnen 14 dagen een extra sessie voor bestuurders met een score lager dan 70%", "Controleer passwordless adoptie voor alle bestuurders met minder dan 2 MFA-methoden", "Verleng de duur van crisissimulaties wanneer aanwezigheid onder de 80% zakt" ) } } function Publish-DirectorReport { [CmdletBinding()] param() $report = Invoke-DirectorCyberLiteracy $resolved = Resolve-Path -Path $OutputPath -ErrorAction SilentlyContinue if (-not $resolved) { $dir = Split-Path -Path $OutputPath -Parent if ($dir -and -not (Test-Path -Path $dir)) { New-Item -Path $dir -ItemType Directory -Force | Out-Null } $resolved = Resolve-Path -Path $OutputPath -ErrorAction SilentlyContinue } $target = if ($resolved) { $resolved.Path } else { [System.IO.Path]::GetFullPath($OutputPath) } $report | ConvertTo-Json -Depth 10 | Out-File -FilePath $target -Encoding UTF8 Write-Host "Rapport geëxporteerd naar $target" -ForegroundColor Green return [PSCustomObject]@{ ExportedTo = $target GeneratedAt = $report.GeneratedAt Directors = $report.Summary.DirectorsTracked AverageScore = $report.Summary.AverageScore } } function Measure-LearningGaps { [CmdletBinding()] param() $report = Invoke-DirectorCyberLiteracy return ($report.DirectorScores | Where-Object { $_.MandatoryMissing -gt 0 }) } try { $result = switch ($Function) { "Invoke-DirectorCyberLiteracy" { Invoke-DirectorCyberLiteracy } "Publish-DirectorReport" { Publish-DirectorReport } "Measure-LearningGaps" { Measure-LearningGaps } } if ($result) { return $result } } catch { Write-Error $_ exit 1 } finally { if (-not $DebugMode) { Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null } Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Hoog: Een directie zonder meetbare cybercompetenties maakt ontoereikende keuzes tijdens incidenten, verliest vertrouwen van toezichthouders en kan niet aantonen dat BIO- en NIS2-verplichtingen zijn ingevuld.

Management Samenvatting

Ontwikkel een meerjarig directieprogramma dat kennis, gedrag en besluitvorming rond Microsoft 365 borgt. Gebruik Viva Learning, Teams en de meegeleverde PowerShell-rapportage om deelname en maturiteit automatisch te meten en koppel de uitkomsten aan bestuursvergaderingen.