Versiebeheer Afdwingen In SharePoint En OneDrive

💼 Management Samenvatting

Versiebeheer is de veiligheidsriem van iedere SharePoint- en OneDrive-omgeving. Zonder gecontroleerde versiegeschiedenis ontbreekt juridisch bewijs, raakt herstel van fouten complex en is niet meer te reconstrueren welke wijzigingen aan privacygevoelige dossiers zijn uitgevoerd.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
140u (tech: 60u)
Van toepassing op:
SharePoint Online
OneDrive for Business
Microsoft Teams
Microsoft 365

Nederlandse overheidsorganisaties zijn verplicht om besluiten, adviezen en onderliggende documenten transparant, herleidbaar en integer te bewaren. Wanneer versiebeheer wordt uitgeschakeld of onvoldoende streng is ingericht, verdwijnen cruciale auditsporen: het is niet meer zichtbaar wie een passage heeft aangepast, een onbedoeld overschreven document kan niet worden teruggezet, en toezichthouders zoals de Autoriteit Persoonsgegevens of de Algemene Rekenkamer kunnen terecht vragen stellen over de betrouwbaarheid van digitale dossiers. Ook operationeel leidt ontbreken van versiebeheer tot incidenten: projectteams verliezen tijd aan manuele bestandsnaming, eindgebruikers downloaden kopieën die vervolgens ‘definitief’ worden verklaard, en ransomware-aanvallen hebben vrij spel omdat er geen consistente versiehistorie is waarop kan worden teruggevallen. Dit artikel beschrijft waarom versiebeheer een minimale eis is voor het behalen van BIO-borgingsniveau, het voldoen aan de Archiefwet, het kunnen uitvoeren van Woo-verzoeken en het aantoonbaar naleven van AVG-artikel 5 (integriteit en vertrouwelijkheid).

PowerShell Modules Vereist
Primary API: SharePoint Admin Center, PnP.PowerShell, Microsoft Graph
Connection: Connect-PnPOnline, Connect-MgGraph
Required Modules: PnP.PowerShell, Microsoft.Graph.Authentication

Implementatie

We combineren governance, techniek en operatie tot één besturingsmodel voor versiebeheer in SharePoint Online en OneDrive for Business. U leest hoe u risicogestuurde normen vastlegt, hoe u moderne site scripts en PowerShell inzet om instellingen te automatiseren, hoe u de opslagimpact beheerst en hoe u rapportages bouwt die bestuurders binnen dertig seconden inzicht geven. Het gekoppelde PowerShell-script `code/m365/sharepoint-onedrive/versioning-enabled.ps1` inventariseert bibliotheken, signaleert afwijkingen van de baseline, kan geautomatiseerde remediatie uitvoeren (met veilige WhatIf-ondersteuning) en levert ruwe data voor dashboards of Power BI-rapporten. Hiermee kunt u lokaal testen zonder productieverbinding (LocalDebug) en dezelfde logica aanroepen in productie pipelines.

Kaders voor versiebeheer en informatieclassificatie

Versiebeheer raakt juridische, beleidsmatige en technische kaders tegelijkertijd. Begin daarom met een bestuurlijk besluit dat versiebeheer een niet-onderhandelbare standaard is voor elke SharePoint-site, Microsoft Teams-omgeving en OneDrive. In dit besluit koppelt u versiebeheer direct aan de Archiefwet, de Woo en sectorale bewaarplichten: zonder volledige versiegeschiedenis kunt u noch authenticiteit, noch integriteit aantonen. Leg de verplichting vast in het informatiebeveiligingsbeleid, het recordsmanagementhandboek en het Cloud Center of Excellence-handboek, zodat alle betrokken disciplines dezelfde boodschap uitdragen.

Klassificeer vervolgens uw samenwerkingsomgevingen. Voor elk klassement (bijvoorbeeld Openbaar, Intern, Vertrouwelijk, Zeer Vertrouwelijk) definieert u de minimale versie-instellingen. Een hoog-risicodossier vereist bijvoorbeeld altijd major én minor versies, een minimum van 400 hoofdversies en conceptversies voor co-creatie, terwijl een generieke kennisbank mogelijk afkan met 100 hoofdversies zonder concepten. Door deze configuraties als normen te beschrijven en te koppelen aan gevoeligheidslabels, ontstaat een directe vertaling van risicoprofielen naar techniek. Dit maakt het ook mogelijk om in dashboards te rapporteren hoeveel bibliotheken van een bepaald label afwijken van de norm.

Governance gaat verder dan instellingen alleen. Zorg dat eigenaar- en beheerverschillen helder zijn: de proceseigenaar bepaalt welke documenten in een bibliotheek thuishoren, de informatiebeheerder borgt dat versiebeheer en retentie correct staan, en de IT-beheerder levert tooling om controles te automatiseren. Leg vast dat een bibliotheek geen productiegegevens mag bevatten zolang versiebeheer niet is gevalideerd. Koppel deze eis aan change management: iedere nieuwe Teams-template of SharePoint site design moet aantoonbaar versiebeheer inschakelen voordat de change door de CAB wordt goedgekeurd.

Vergeet bewustwording niet. Maak versiebeheer onderdeel van eigenaarschappen-trainingen, zodat teameigenaren begrijpen dat het beperken van versieaantallen niet louter schijfruimte bespaart, maar direct de audit trail verkort. Ontwikkel scenario’s die laten zien hoe versiebeheer helpt bij het herstellen van foutieve publicaties, het afhandelen van Woo-verzoeken en het onderbouwen van besluiten bij bezwaarprocedures. Door compliance-cases te delen groeit draagvlak en wordt versiebeheer gezien als kwaliteitsinstrument in plaats van technische overlast.

Tot slot: borg afwijkingen. Wanneer een proceseigenaar meent dat versiebeheer mag worden uitgezet (bijvoorbeeld voor tijdelijke staging-omgevingen), vereist u een formele risico-afweging, goedkeuring door CISO en FG, en een beperkte looptijd die automatisch verloopt. Registreer dergelijke uitzonderingen in hetzelfde register waarin u gasttoegangen en dataresidentie vastlegt. Zo blijft de organisatie aantoonbaar in control, zelfs wanneer maatwerk noodzakelijk is.

Technische inrichting in SharePoint en OneDrive

Technische borging begint bij consistente templates. Gebruik SharePoint site scripts, PnP-provisioning templates of Viva Engage provisioning (voor Teams) om versiebeheer altijd aan te zetten op het moment dat een site of team wordt aangemaakt. In deze templates definieert u per bibliotheek het aantal hoofdversies, of concepten bijhouden verplicht is, en of goedkeuring vereist is voor publicatie. Koppel de templates aan het selfservice-aanvraagproces zodat zelfs citizen administrators geen site kunnen leveren zonder versiebeheer.

Voor bestaande omgevingen gebruikt u PowerShell en PnP om instellingen massaal te inspecteren en te corrigeren. Scripts lezen via `Get-PnPList` de eigenschappen EnableVersioning, MajorVersionLimit, EnableMinorVersions en ItemCount uit. Organiseer deze scripts in pipelines (bijvoorbeeld Azure DevOps of GitHub Actions) die maandelijks draaien en resultaten centraal opslaan. Door deze controles te combineren met logische drempels – bijvoorbeeld minimaal 200 hoofdversies voor vertrouwelijke bibliotheken – krijgt u snel zicht op afwijkingen, zonder afhankelijk te zijn van incidentmeldingen.

OneDrive vraagt speciale aandacht. Hoewel Microsoft standaard versiebeheer aanzet, kunnen eindgebruikers instellingen wijzigen via de browser. Gebruik daarom tenant-instellingen om aanpassing van versieaantallen te blokkeren, koppel OneDrive-beleid aan dezelfde normen als SharePoint en monitor persoonlijke bibliotheken op afwijkingen. Voor Teams-channels (die onderliggend SharePoint-bibliotheken zijn) zorgt u ervoor dat standaardtabs zoals “Bestanden” dezelfde baseline erven. Zo voorkomt u dat Teams een achterdeur wordt waar versiebeheer alsnog wordt uitgezet.

Integreer versiebeheer met andere security-controls. Koppel bijvoorbeeld Microsoft Purview-retentielabels zodat het permanent verwijderen van oudere versies wordt geblokkeerd zolang een label actief is. Zorg dat eDiscovery-holds automatisch ook de versiegeschiedenis vastzetten. Combineer versiebeheer met DLP: wanneer een gebruiker vertrouwelijke informatie probeert te overschrijven, blijft de vorige versie beschikbaar waardoor u incidenten sneller kunt analyseren.

Meet tenslotte de impact op opslag. Versiebeheer kost ruimte, maar die ruimte is goedkoper dan het herstellen van verloren context. Gebruik Storage Metrics en Power BI om te laten zien welke bibliotheken de meeste versies produceren, welke gebruikers grote bestanden herhaaldelijk overschrijven en waar archivering zinvol is. Met deze inzichten kunt u gerichte optimalisaties uitvoeren (bijvoorbeeld pdf’s comprimeren of archiveren naar Azure Blob), zonder de baseline te verlagen.

Operationeel beheer, datahygiëne en kwaliteitsbewaking

Operationeel beheer draait om voorspelbaarheid. Leg in runbooks vast hoe vaak versiebeheer wordt gecontroleerd, welke rapportages naar het CISO-office gaan en welke KPI’s u hanteert (bijvoorbeeld percentage bibliotheken met conform versielimiet). Combineer automatische scans met steekproeven waarbij informatiebeheerders daadwerkelijk in bibliotheken kijken of oude versies logisch worden gebruikt en of gebruikers niet alsnog bestandsnamen als ‘definitief_v3.docx’ introduceren.

Beperk versie-explosie door gebruikersrichtlijnen en beleid. Stimuleer het gebruik van co-authoring in Office, verbied het handmatig aanmaken van kopiebestanden buiten versiebeheer en gebruik Power Automate om workflows te bouwen die veelgebruikte sjablonen steeds opnieuw vullen zonder dat gebruikers complete documenten dupliceren. Zo blijft de versiegeschiedenis schoon en blijft herstel eenvoudig.

Integreer versiebeheer met incident- en wijzigingsprocessen. Bij een datalek of Woo-verzoek kan uw SOC of privacy office direct naar de versiegeschiedenis verwijzen om te bepalen wie welke wijziging doorvoerde. Documenteer ook herstelprocedures: wie draait versie 211 terug wanneer een verkeerd besluit online is gezet? Hoe communiceert u dat naar burgers of ketenpartners? Door dit op te nemen in het crisisplaybook voorkomt u improvisatie op cruciale momenten.

Werk samen met opslag- en kostenbeheerteams. Hoewel versiebeheer schijfruimte kost, kan slim lifecyclemanagement veel besparen. Gebruik retentielabels om conceptversies na afronding automatisch te verwijderen, archiveer afgesloten dossiers naar records centers en maak afspraken over compressie van zware bestanden (video, CAD, GIS). Zo houdt u de opslagcurve onder controle terwijl de audit trail intact blijft.

Zorg tenslotte voor continue verbetering. Organiseer kwartaalreviews waarin informatiebeheerders, CISO, FG en product owners samen de rapportages doornemen, trends herkennen (bijvoorbeeld stijging in bibliotheken zonder conceptversies) en verbeteracties plannen. Koppel deze acties aan het reguliere portfolio, zodat versiebeheer dezelfde aandacht krijgt als identiteitsbeheer of netwerksegmentatie.

Automatisering, monitoring en rapportage

Monitoring start met zichtbaarheid. Verzamel per bibliotheek de sleutelparameters (EnableVersioning, MajorVersionLimit, MinorVersionLimit, EnableMinorVersions, ItemCount) en sla deze op in een centrale dataset. Gebruik Power BI of Microsoft Sentinel Workbooks om dashboards te maken die real-time tonen hoeveel bibliotheken afwijken, welke sites al lang geen validatie meer hebben gehad en waar uitzonderingen verlopen zijn.

Het PowerShell-script `versioning-enabled.ps1` is ontwikkeld om deze monitoring-consistentie te leveren. In Assessment-modus haalt het script via PnP.PowerShell en Microsoft Graph gegevens op, vergelijkt deze met instelbare drempels (standaard 200 hoofdversies en 20 conceptversies) en levert duidelijke exitcodes voor CI/CD-pijplijnen. Monitoring-modus genereert CSV-rapportages of JSON-output voor dashboards, terwijl Remediation-modus – mits WhatIf is uitgeschakeld – direct PnP-commando’s uitvoert om versiebeheer te activeren en limieten op te hogen. Dankzij LocalDebug kunnen teams de workflow lokaal testen zonder verbinding te maken met productie, wat aansluit op de eis om scripts altijd met veilige debug-instellingen te valideren.

Gebruik PowerShell-script versioning-enabled.ps1 (functie Invoke-VersioningAssessment / Invoke-VersioningMonitoring / Invoke-VersioningRemediation) – PowerShell-script dat bibliotheken inventariseert, afwijkingen signaleert en – waar toegestaan – versiebeheer automatisch activeert. Ondersteunt LocalDebug, WhatIf, export naar CSV en gebruik in DevOps-pijplijnen..

Koppel de scriptresultaten aan uw bredere observability-landschap. Stuur de CSV’s naar een Azure Storage-account, laat Azure Functions ze oppakken en schiet waarschuwingen naar Microsoft Teams of het SIEM wanneer een hoog-risicobibliotheek versiebeheer heeft uitgeschakeld. Voeg tags toe aan de output zodat u kunt filteren op organisatieonderdeel, informatieclassificatie of verantwoordelijk eigenaar. Zo verandert versiebeheer van een statische instelling in een dynamische control die aantoonbaar gemonitord wordt.

Documenteer tenslotte de volledige keten: van scriptconfiguratie tot dashboards en escalatieprocedures. Wanneer auditors vragen hoe u zeker weet dat versiebeheer overal aanstaat, kunt u dezelfde dataset tonen die ook door de operatie wordt gebruikt. Dit sluit aan op de filosofie van de Nederlandse Baseline voor Veilige Cloud: bewijs komt uit dezelfde bron als de dagelijkse besturing.

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 herstelt versiebeheerinstellingen voor SharePoint Online en OneDrive. .DESCRIPTION Dit script ondersteunt het artikel content/m365/sharepoint-onedrive/versioning-enabled.json binnen het programma "Nederlandse Baseline voor Veilige Cloud". Het inventariseert documentbibliotheken, vergelijkt de gevonden instellingen met de baseline en kan optioneel remediëren. LocalDebug levert voorbeelddata zodat tests altijd veilig kunnen worden uitgevoerd zonder cloudverbinding. .NOTES Filename : versioning-enabled.ps1 Author : Nederlandse Baseline voor Veilige Cloud Version : 1.0 Related : content/m365/sharepoint-onedrive/versioning-enabled.json Modules : PnP.PowerShell (monitoring en remediatie), Microsoft.Graph.Authentication (optioneel) .EXAMPLE .\versioning-enabled.ps1 -Assessment -SiteUrls https://tenant.sharepoint.com/sites/beleid .EXAMPLE .\versioning-enabled.ps1 -Monitoring -InventoryPath .\sites.csv -ExportPath .\versioning-report.csv .EXAMPLE .\versioning-enabled.ps1 -Remediation -SiteUrls https://tenant.sharepoint.com/sites/financien -WhatIf #> #Requires -Version 5.1 #Requires -Modules PnP.PowerShell [CmdletBinding(DefaultParameterSetName = 'Assessment')] param( [Parameter(ParameterSetName = 'Assessment')] [switch]$Assessment, [Parameter(ParameterSetName = 'Monitoring')] [switch]$Monitoring, [Parameter(ParameterSetName = 'Remediation')] [switch]$Remediation, [string[]]$SiteUrls, [string]$InventoryPath, [string]$AdminCenterUrl, [int]$MajorVersionThreshold = 200, [int]$MinorVersionThreshold = 20, [string]$ExportPath, [switch]$LocalDebug, [switch]$DeviceLogin, [switch]$WhatIf ) if (-not ($Assessment -or $Monitoring -or $Remediation)) { $Assessment = $true } Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' function Write-NbvcBanner { param([string]$Title) Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Versioning Enabled - $Title" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan } function Get-VersioningSampleData { return @( [pscustomobject]@{ SiteUrl = "https://contoso.sharepoint.com/sites/beleidsdossiers" Library = "Documenten" EnableVersioning = $true MajorVersionLimit = 400 MinorVersionLimit = 50 EnableMinorVersions = $true ItemCount = 12600 }, [pscustomobject]@{ SiteUrl = "https://contoso.sharepoint.com/sites/project-a" Library = "Projectdocumentatie" EnableVersioning = $false MajorVersionLimit = 0 MinorVersionLimit = 0 EnableMinorVersions = $false ItemCount = 980 }, [pscustomobject]@{ SiteUrl = "https://contoso-my.sharepoint.com/personal/demo_user" Library = "OneDrive" EnableVersioning = $true MajorVersionLimit = 25 MinorVersionLimit = 0 EnableMinorVersions = $false ItemCount = 2400 } ) } function Get-TargetSites { $targets = @() if ($SiteUrls) { $targets += $SiteUrls } if ($InventoryPath) { if (-not (Test-Path -Path $InventoryPath)) { throw "InventoryPath '$InventoryPath' bestaat niet." } $extension = [IO.Path]::GetExtension($InventoryPath) switch ($extension.ToLowerInvariant()) { '.csv' { $targets += (Import-Csv -Path $InventoryPath | ForEach-Object { $_.Url }) } '.json' { $json = Get-Content -Raw -Path $InventoryPath | ConvertFrom-Json if ($json -is [System.Collections.IEnumerable]) { $targets += ($json | ForEach-Object { $_.Url }) } } default { $targets += (Get-Content -Path $InventoryPath | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) } } } if (-not $targets -and -not $LocalDebug -and $AdminCenterUrl) { Write-Host " Geen sites meegegeven; ophalen via tenant $AdminCenterUrl..." -ForegroundColor Yellow $tenantConn = Connect-NbvcSite -Url $AdminCenterUrl $tenantSites = Get-PnPTenantSite -Connection $tenantConn -IncludeOneDriveSites $true -PageSize 50 | Select-Object -First 25 Disconnect-PnPOnline -Connection $tenantConn -ErrorAction SilentlyContinue $targets += ($tenantSites | ForEach-Object { $_.Url }) } if (-not $targets -and -not $LocalDebug) { throw "Geen sites gevonden. Geef -SiteUrls, -InventoryPath of -AdminCenterUrl op." } if ($LocalDebug -and -not $targets) { $targets = @("https://contoso.sharepoint.com/sites/beleidsdossiers") } return $targets | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Sort-Object -Unique } function Connect-NbvcSite { param( [Parameter(Mandatory = $true)][string]$Url ) if ($LocalDebug) { return $null } $connectParams = @{ Url = $Url ErrorAction = 'Stop' ReturnConnection = $true } if ($DeviceLogin) { $connectParams['DeviceLogin'] = $true } elseif ($env:NBVC_PNP_APPID -and $env:NBVC_PNP_TENANT -and $env:NBVC_PNP_CERTPATH) { $connectParams['ClientId'] = $env:NBVC_PNP_APPID $connectParams['Tenant'] = $env:NBVC_PNP_TENANT $connectParams['CertificatePath'] = $env:NBVC_PNP_CERTPATH if ($env:NBVC_PNP_CERTPASSWORD) { $secure = ConvertTo-SecureString -String $env:NBVC_PNP_CERTPASSWORD -AsPlainText -Force $connectParams['CertificatePassword'] = $secure } } else { $connectParams['Interactive'] = $true } return Connect-PnPOnline @connectParams } function Get-VersioningInventory { if ($LocalDebug) { Write-Host "LocalDebug actief: voorbeelddata wordt gebruikt." -ForegroundColor Yellow return Get-VersioningSampleData } $sites = Get-TargetSites $inventory = @() foreach ($site in $sites) { Write-Host " Inspecteer $site" -ForegroundColor Gray try { $connection = Connect-NbvcSite -Url $site $lists = Get-PnPList -Connection $connection -Includes EnableVersioning, EnableMinorVersions, MajorVersionLimit, MajorWithMinorVersionsLimit, BaseTemplate, Title, ItemCount foreach ($list in $lists) { if ($list.BaseTemplate -notin 101, 700) { continue } $inventory += [pscustomobject]@{ SiteUrl = $site Library = $list.Title EnableVersioning = [bool]$list.EnableVersioning MajorVersionLimit = [int]$list.MajorVersionLimit MinorVersionLimit = [int]$list.MajorWithMinorVersionsLimit EnableMinorVersions = [bool]$list.EnableMinorVersions ItemCount = [int]$list.ItemCount } } } catch { Write-Warning "Kon versiegegevens niet ophalen voor $site: $($_.Exception.Message)" $inventory += [pscustomobject]@{ SiteUrl = $site Library = "<Onbekend>" EnableVersioning = $false MajorVersionLimit = 0 MinorVersionLimit = 0 EnableMinorVersions = $false ItemCount = 0 } } finally { if ($connection) { Disconnect-PnPOnline -Connection $connection -ErrorAction SilentlyContinue } } } return $inventory } function Test-VersioningCompliance { param( [Parameter(Mandatory = $true)][array]$Inventory ) $result = [pscustomobject]@{ TotalLibraries = $Inventory.Count WithoutVersioning = @($Inventory | Where-Object { -not $_.EnableVersioning }).Count MajorBelowBaseline = @($Inventory | Where-Object { $_.EnableVersioning -and $_.MajorVersionLimit -lt $MajorVersionThreshold }).Count MinorMissing = @($Inventory | Where-Object { $_.EnableVersioning -and -not $_.EnableMinorVersions -and $_.ItemCount -gt 0 }).Count MinorBelowBaseline = @($Inventory | Where-Object { $_.EnableMinorVersions -and $_.MinorVersionLimit -lt $MinorVersionThreshold }).Count Details = $Inventory } $result | Add-Member -NotePropertyName NonCompliantLibraries -NotePropertyValue ( $Inventory | Where-Object { (-not $_.EnableVersioning) -or ($_.MajorVersionLimit -lt $MajorVersionThreshold -and $_.EnableVersioning) -or ($_.EnableMinorVersions -and $_.MinorVersionLimit -lt $MinorVersionThreshold) } ) return $result } function Export-VersioningReport { param( [array]$Inventory ) if (-not $ExportPath) { return } $directory = Split-Path -Parent $ExportPath if ($directory -and -not (Test-Path -Path $directory)) { New-Item -ItemType Directory -Path $directory -Force | Out-Null } $Inventory | Export-Csv -Path $ExportPath -Encoding UTF8 -NoTypeInformation Write-Host "Rapport opgeslagen naar $ExportPath" -ForegroundColor Green } function Invoke-VersioningAssessment { Write-NbvcBanner -Title "Assessment" $inventory = Get-VersioningInventory $result = Test-VersioningCompliance -Inventory $inventory Write-Host "Bibliotheken geanalyseerd : $($result.TotalLibraries)" -ForegroundColor White Write-Host "Zonder versiebeheer : $($result.WithoutVersioning)" -ForegroundColor ($result.WithoutVersioning -eq 0 ? "Green" : "Red") Write-Host "Major limit onder baseline: $($result.MajorBelowBaseline)" -ForegroundColor ($result.MajorBelowBaseline -eq 0 ? "Green" : "Yellow") Write-Host "Geen conceptversies : $($result.MinorMissing)" -ForegroundColor ($result.MinorMissing -eq 0 ? "Green" : "Yellow") if ($result.NonCompliantLibraries.Count -gt 0) { Write-Host "`nNiet-conforme bibliotheken:" -ForegroundColor Red foreach ($library in $result.NonCompliantLibraries | Select-Object -First 10) { Write-Host (" - {0} :: {1} (Major={2}, Minor={3}, Drafts={4})" -f $library.SiteUrl, $library.Library, $library.MajorVersionLimit, $library.MinorVersionLimit, $library.EnableMinorVersions) -ForegroundColor Gray } Write-Host "Toon de volledige lijst via -Monitoring -ExportPath." -ForegroundColor Yellow return 1 } Write-Host "`nCOMPLIANT: alle bibliotheken voldoen aan de baseline." -ForegroundColor Green return 0 } function Invoke-VersioningMonitoring { Write-NbvcBanner -Title "Monitoring" $inventory = Get-VersioningInventory $result = Test-VersioningCompliance -Inventory $inventory $statusColor = if ($result.WithoutVersioning -eq 0 -and $result.MajorBelowBaseline -eq 0 -and $result.MinorBelowBaseline -eq 0) { "Green" } else { "Yellow" } Write-Host ("Totaal bibliotheken: {0}, Afwijkingen: {1}" -f $result.TotalLibraries, $result.NonCompliantLibraries.Count) -ForegroundColor $statusColor Export-VersioningReport -Inventory $inventory return ($result.NonCompliantLibraries.Count -eq 0) ? 0 : 1 } function Invoke-VersioningRemediation { Write-NbvcBanner -Title "Remediation" if ($LocalDebug) { Write-Host "Remediatie niet beschikbaar in LocalDebug. Gebruik -Monitoring om logica te testen." -ForegroundColor Yellow return 0 } $inventory = Get-VersioningInventory $targets = $inventory | Where-Object { (-not $_.EnableVersioning) -or ($_.MajorVersionLimit -lt $MajorVersionThreshold) -or ($_.EnableMinorVersions -and $_.MinorVersionLimit -lt $MinorVersionThreshold) } if ($targets.Count -eq 0) { Write-Host "Geen bibliotheken die remediatie nodig hebben." -ForegroundColor Green return 0 } foreach ($group in $targets | Group-Object SiteUrl) { Write-Host "Site: $($group.Name)" -ForegroundColor Cyan $connection = Connect-NbvcSite -Url $group.Name foreach ($library in $group.Group) { $message = " - $($library.Library): versiebeheer aanzetten/limieten verhogen" if ($WhatIf) { Write-Host "$message (WhatIf)" -ForegroundColor Gray continue } try { Set-PnPList -Connection $connection -Identity $library.Library -EnableVersioning:$true -MajorVersions $MajorVersionThreshold -ErrorAction Stop | Out-Null if ($MinorVersionThreshold -gt 0) { Set-PnPList -Connection $connection -Identity $library.Library -EnableMinorVersions:$true -MinorVersions $MinorVersionThreshold -ErrorAction Stop | Out-Null } Write-Host "$message uitgevoerd." -ForegroundColor Green } catch { Write-Warning "Kon $($library.Library) niet aanpassen: $($_.Exception.Message)" } } Disconnect-PnPOnline -Connection $connection -ErrorAction SilentlyContinue } if ($WhatIf) { Write-Host "`nWhatIf: er zijn geen wijzigingen aangebracht." -ForegroundColor Yellow } return 0 } try { if ($Assessment) { exit (Invoke-VersioningAssessment) } elseif ($Monitoring) { exit (Invoke-VersioningMonitoring) } elseif ($Remediation) { exit (Invoke-VersioningRemediation) } } catch { Write-Host "Onverwachte fout: $($_.Exception.Message)" -ForegroundColor Red exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Ontbrekend versiebeheer leidt tot niet-herstelbare dataverlies, onbewijsbare besluiten en verhoogde kans op sancties onder AVG, Archiefwet en Woo. Ransomware- en insider-incidenten kunnen niet meer forensisch worden onderzocht.

Management Samenvatting

Maak versiebeheer een verplichte standaard voor iedere SharePoint- en OneDrive-bibliotheek, automatiseer de configuratie via templates en PowerShell, monitor continu met het script `versioning-enabled.ps1` en koppel resultaten aan dashboards en auditdossiers.