OneDrive van gedeelde postvakken verwijderen
Gebruik dit PowerShell-script nadat bij de uitdiensttreding is vastgesteld dat OneDrive-sites van gedeelde postvakken niet meer nodig zijn. Begin met -WhatIf, controleer elke koppeling tussen postvak en site en gebruik -Purge pas wanneer de beslissing over retentie en herstel definitief is.
Het script zoekt gedeelde postvakken in Exchange Online, koppelt hun user principal names aan OneDrive-eigenaars in SharePoint Online en vraagt om bevestiging voordat elke gevonden site naar Verwijderde sites wordt verplaatst.
Het beste voor
- Tenantbrede controles op OneDrive-sites die nog eigendom zijn van gedeelde postvakken.
- Uitdienstprocessen waarin de beslissingen over postvak, account en OneDrive apart worden vastgelegd.
- Beheerders die elke gevonden site afzonderlijk willen bevestigen.
- Gecontroleerd opschonen waarbij vóór elke wijziging
-WhatIfmoet worden gebruikt.
Niet gebruiken voor
- Het verwijderen van OneDrive-sites voordat de gegevenseigenaar, retentie-eigenaar en IT hebben afgesproken wat er met de inhoud moet gebeuren.
- De OneDrive van één bekend account verwijderen wanneer een rechtstreeks en afzonderlijk beoordeeld commando duidelijker is.
- Sites automatisch uitsluiten van retentiebeleid of eDiscovery-holds.
- Onbeheerde automatisering; het script gebruikt interactieve verbindingen met Exchange Online en SharePoint Online.
Vereisten en machtigingen
Voer het script uit in Windows PowerShell 5.1 en installeer deze modules:
Install-Module -Name ExchangeOnlineManagement, Microsoft.Online.SharePoint.PowerShell -Scope CurrentUser
Het aangemelde account heeft rechten nodig om gedeelde postvakken in Exchange Online te lezen en de relevante OneDrive-sites in SharePoint Online te beheren. Microsoft documenteert dat Connect-SPOService de rol SharePoint Administrator of SharePoint Embedded Administrator vereist. Role-based access control bepaalt welke Exchange Online-cmdlets en objecten het account mag gebruiken.
Veilig uitvoeren
-
Open Windows PowerShell 5.1 en beoordeel het script voordat je het uitvoert.
-
Begin met
-WhatIf:.\remove-onedrive-from-shared-mailboxes.ps1 -WhatIf -
Controleer of elk getoond gedeeld postvak bij de getoonde OneDrive-URL hoort.
-
Voer het script zonder
-WhatIfuit om afzonderlijk goedgekeurde sites naar Verwijderde sites te verplaatsen. -
Gebruik
-Purgealleen wanneer permanente verwijdering is goedgekeurd. Voeg-SkipConfirmationalleen toe in een apart beheerd proces waarin de beoordeelde invoer en het bewijs worden bewaard.
Geef -SharePointAdminUrl https://contoso-admin.sharepoint.com op wanneer het script de tenantbeheer-URL niet betrouwbaar kan afleiden.
-Purge roept Remove-SPODeletedSite aan nadat een geselecteerde site in Verwijderde sites staat. Microsoft beschrijft die bewerking als permanent. Retentiebeleid of een eDiscovery-hold kan verwijdering ook blokkeren. Onderzoek dat beleid in plaats van het alleen te verzwakken om het script te laten slagen.
Hoe de koppeling werkt
Het script laadt alle persoonlijke sites, indexeert ze op de kleineletterswaarde van Owner en vraagt daarna alle gedeelde Exchange Online-postvakken op. Een site wordt alleen geselecteerd wanneer de eigenaar exact overeenkomt met de user principal name van het gedeelde postvak.
Die exacte vergelijking vermindert giswerk, maar bewijst niet dat de inhoud mag worden verwijderd. Leg eigenaar, doel, retentiebesluit en resultaat buiten het script vast, zodat het opruimen controleerbaar blijft.
Volledig script
Het codeblok en de download gebruiken hetzelfde bestand uit de repository. Wanneer het .ps1-bestand wordt bijgewerkt, verschijnt de nieuwe bron bij de volgende ontwikkelrefresh of sitebuild.
#Requires -Version 5.1
#Requires -Modules ExchangeOnlineManagement
#Requires -Modules Microsoft.Online.SharePoint.PowerShell
<#
.SYNOPSIS
Removes OneDrive sites that belong to shared mailboxes.
.DESCRIPTION
Finds shared mailboxes in Exchange Online, looks up their associated OneDrive
sites, and removes the selected sites. Use -Purge to permanently remove sites
from Deleted Sites.
This script is provided as-is, without guarantees. Test it thoroughly in a
safe environment before using it in production.
Install the required modules once before first use:
Install-Module -Name ExchangeOnlineManagement, Microsoft.Online.SharePoint.PowerShell -Scope CurrentUser
.PARAMETER SharePointAdminUrl
Optional SharePoint Online admin center URL. When omitted, the script derives
the URL from the Exchange Online tenant.
.PARAMETER SkipConfirmation
Skips confirmations for all deletions. When combined with -Purge, it also skips
confirmations for permanent removal.
.PARAMETER Purge
After all selected OneDrive sites have been moved to Deleted Sites, permanently
removes them. Unless -SkipConfirmation is specified, the script asks for
confirmation for every site that is purged.
.NOTES
Author: Dwayne Selsig
Website: https://m365wizard.com
#>
[CmdletBinding(SupportsShouldProcess)]
param(
[string]$SharePointAdminUrl,
[switch]$SkipConfirmation,
[switch]$Purge
)
$ErrorActionPreference = "Stop"
function Confirm-Deletion {
[CmdletBinding(SupportsShouldProcess)]
param(
[Parameter(Mandatory)]
[System.Management.Automation.PSCmdlet]$Cmdlet,
[Parameter(Mandatory)]
[string]$Target,
[Parameter(Mandatory)]
[string]$Action,
[Parameter(Mandatory)]
[bool]$SkipConfirmation
)
if ($WhatIfPreference) {
return $Cmdlet.ShouldProcess($Target, $Action)
}
if (-not $SkipConfirmation) {
$question = "$Action`n$Target"
if (-not $Cmdlet.ShouldContinue($question, "Confirm deletion")) {
return $false
}
}
return $Cmdlet.ShouldProcess($Target, $Action)
}
Connect-ExchangeOnline -ShowBanner:$false
if ([string]::IsNullOrWhiteSpace($SharePointAdminUrl)) {
$initialDomain = Get-AcceptedDomain |
Where-Object {
$_.DomainName -like "*.onmicrosoft.com" -and
$_.DomainName -notlike "*.mail.onmicrosoft.com"
} |
Select-Object -First 1 -ExpandProperty DomainName
if ([string]::IsNullOrWhiteSpace($initialDomain)) {
throw "Could not determine the tenant's .onmicrosoft.com domain. Specify -SharePointAdminUrl explicitly."
}
$tenantName = $initialDomain -replace '\.onmicrosoft\.com$', ''
$SharePointAdminUrl = "https://$tenantName-admin.sharepoint.com"
}
Write-Verbose "Using SharePoint admin URL: $SharePointAdminUrl"
Connect-SPOService -Url $SharePointAdminUrl
Write-Progress `
-Activity "Loading OneDrive sites" `
-Status "Retrieving personal sites from SharePoint Online" `
-PercentComplete 0
[array]$personalSites = @(Get-SPOSite `
-Filter "Url -like '-my.sharepoint.com/personal/'" `
-IncludePersonalSite $true `
-Limit All)
$personalSitesByOwner = @{}
foreach ($personalSite in $personalSites) {
$owner = [string]$personalSite.Owner
if (-not [string]::IsNullOrWhiteSpace($owner)) {
$personalSitesByOwner[$owner.ToLowerInvariant()] = $personalSite
}
}
Write-Progress -Activity "Loading OneDrive sites" -Completed
[array]$sharedMailboxes = @(Get-EXOMailbox `
-RecipientTypeDetails SharedMailbox `
-ResultSize Unlimited `
-Properties UserPrincipalName, PrimarySmtpAddress)
$mailboxCount = $sharedMailboxes.Count
$mailboxIndex = 0
$removedSites = [System.Collections.Generic.List[object]]::new()
foreach ($mailbox in $sharedMailboxes) {
$mailboxIndex++
$percentComplete = [math]::Round(($mailboxIndex / $mailboxCount) * 100)
Write-Progress `
-Activity "Processing shared mailbox OneDrives" `
-Status "$mailboxIndex of ${mailboxCount}: $($mailbox.PrimarySmtpAddress)" `
-PercentComplete $percentComplete
$upn = [string]$mailbox.UserPrincipalName
if ([string]::IsNullOrWhiteSpace($upn)) {
continue
}
$site = $personalSitesByOwner[$upn.ToLowerInvariant()]
if (-not $site) {
Write-Host "No personal site found for $upn."
continue
}
$personalUrl = [string]$site.Url
Write-Host ""
Write-Host "Shared mailbox: $($mailbox.PrimarySmtpAddress)"
Write-Host "OneDrive URL: $personalUrl"
Write-Host "Storage used: $($site.StorageUsageCurrent) MB"
$removeApproved = Confirm-Deletion `
-Cmdlet $PSCmdlet `
-Target $personalUrl `
-Action "Remove OneDrive personal site" `
-SkipConfirmation ([bool]$SkipConfirmation)
if ($removeApproved) {
Remove-SPOSite `
-Identity $personalUrl `
-Confirm:$false
Write-Host "Moved to Deleted Sites."
$removedSites.Add([pscustomobject]@{
SharedMailbox = [string]$mailbox.PrimarySmtpAddress
OneDriveUrl = $personalUrl
})
}
elseif ($WhatIfPreference -and $Purge) {
$removedSites.Add([pscustomobject]@{
SharedMailbox = [string]$mailbox.PrimarySmtpAddress
OneDriveUrl = $personalUrl
})
}
}
Write-Progress -Activity "Processing shared mailbox OneDrives" -Completed
if ($removedSites.Count -gt 0) {
Write-Host ""
if ($WhatIfPreference) {
Write-Host "OneDrive sites that would be moved to Deleted Sites:"
}
else {
Write-Host "OneDrive sites moved to Deleted Sites:"
}
$removedSites | Format-Table SharedMailbox, OneDriveUrl -AutoSize | Out-Host
}
if ($Purge -and $removedSites.Count -gt 0) {
$removedSiteCount = $removedSites.Count
$removedSiteIndex = 0
foreach ($removedSite in $removedSites) {
$removedSiteIndex++
$percentComplete = [math]::Round(($removedSiteIndex / $removedSiteCount) * 100)
Write-Progress `
-Activity "Purging deleted OneDrive sites" `
-Status "$removedSiteIndex of ${removedSiteCount}: $($removedSite.SharedMailbox)" `
-PercentComplete $percentComplete
if ($WhatIfPreference) {
Confirm-Deletion `
-Cmdlet $PSCmdlet `
-Target $removedSite.OneDriveUrl `
-Action "Permanently remove OneDrive personal site" `
-SkipConfirmation ([bool]$SkipConfirmation) | Out-Null
continue
}
do {
Start-Sleep -Seconds 5
$deletedSite = Get-SPODeletedSite `
-Identity $removedSite.OneDriveUrl `
-ErrorAction SilentlyContinue
}
until ($deletedSite)
if (Confirm-Deletion `
-Cmdlet $PSCmdlet `
-Target $removedSite.OneDriveUrl `
-Action "Permanently remove OneDrive personal site" `
-SkipConfirmation ([bool]$SkipConfirmation)) {
Remove-SPODeletedSite `
-Identity $removedSite.OneDriveUrl `
-Confirm:$false
Write-Host "Permanently removed: $($removedSite.OneDriveUrl)"
}
}
Write-Progress -Activity "Purging deleted OneDrive sites" -Completed
}
Disconnect-ExchangeOnline -Confirm:$false
Disconnect-SPOService
Bron en documentatie
- Download remove-onedrive-from-shared-mailboxes.ps1
- Verbinding maken met Exchange Online PowerShell
- Get-EXOMailbox
- Aan de slag met de SharePoint Online Management Shell
- Remove-SPOSite
- Remove-SPODeletedSite
- Siteverwijdering geblokkeerd door retentie of eDiscovery