Se gestisci Microsoft 365 in azienda, lo sai già: il backup non è un “nice to have”. È una necessità. Eppure, ancora oggi, c’è molta confusione su cosa sia davvero protetto nel cloud e cosa invece rischi di perdere da un momento all’altro.
In questa guida andiamo dritti al punto. Niente teoria fine a sé stessa. Ti spiego cosa devi salvare davvero, perché gli strumenti nativi non bastano, e soprattutto come costruire un sistema di backup concreto usando PowerShell, con script pronti all’uso che puoi adattare al tuo ambiente.
Microsoft 365 ha già il backup? Spoiler: no
Partiamo da un concetto fondamentale che spesso viene frainteso.
Microsoft 365 offre:
- alta disponibilità
- replica dei dati
- protezione contro guasti infrastrutturali
Ma non offre un vero backup nel senso classico.
Questo significa che:
- se un utente cancella una mail e supera il retention period, è persa
- se un ransomware sincronizza file cifrati su OneDrive, vengono replicati
- se un admin elimina dati per errore, non sempre puoi recuperarli
In altre parole: Microsoft protegge l’infrastruttura, non i tuoi dati da errori umani o logici. Ed è qui che entra in gioco un backup indipendente.
Cosa devi davvero salvare in Microsoft 365
Prima di scrivere una riga di codice, devi sapere cosa ha senso proteggere.
Gli asset principali sono:
- Exchange Online (mailbox)
- OneDrive for Business (file utente)
- SharePoint Online (documenti e siti)
- Teams (che in realtà poggia su SharePoint + Exchange)
Un errore comune è concentrarsi solo sulla posta. In realtà, oggi il valore è quasi sempre nei file.
Approccio PowerShell: quando ha senso davvero
Chiariamo subito una cosa: PowerShell non è un sistema di backup enterprise completo. Però è perfetto se:
- vuoi una soluzione personalizzata
- devi esportare dati periodicamente
- vuoi avere copie offline rapide
- non vuoi subito investire in tool di terze parti
E soprattutto, è lo strumento ideale per chi fa il tuo lavoro: controllo totale, automazione, scripting.
Prerequisiti: cosa ti serve prima di iniziare
Prima di partire con gli script, assicurati di avere:
- PowerShell 5.1 o superiore (meglio PowerShell 7)
- Moduli Microsoft:
- ExchangeOnlineManagement
- Microsoft.Graph
- PnP.PowerShell
Installazione rapida:
- Install-Module ExchangeOnlineManagement
- Install-Module Microsoft.Graph
- Install-Module PnP.PowerShell
- Backup Exchange Online: esportare le mailbox
Microsoft non permette più esportazioni dirette in PST via PowerShell in modo semplice come una volta. Però hai comunque una strada pratica: usare eDiscovery o esportare contenuti via Graph.
Qui ti mostro un approccio concreto per esportare le mailbox in formato leggibile.
Connessione a Exchange Online
Connect-ExchangeOnline
Esportazione base delle mailbox (metadati e contenuti)
$mailboxes = Get-Mailbox -ResultSize Unlimited
foreach ($mb in $mailboxes) {
$name = $mb.PrimarySmtpAddress
$path = “C:\Backup\M365\Mailboxes\$name.txt”
Get-MailboxFolderStatistics $name | Out-File $path}
Questo non è un backup completo stile PST, ma è un primo livello utile per audit e recovery parziale.
Se vuoi fare le cose seriamente, devi passare a Graph API o eDiscovery export automatizzato.
Backup OneDrive: esportare i file degli utenti
Qui le cose si fanno interessanti. OneDrive è spesso il vero cuore dei dati aziendali.
Connessione a Microsoft Graph
Connect-MgGraph -Scopes “Files.Read.All”,”Sites.Read.All”
Script base per scaricare file OneDrive
$users = Get-MgUser -All
foreach ($user in $users) {
$userDrive = Get-MgUserDrive -UserId $user.Id
$items = Get-MgDriveItemChild -DriveId $userDrive.Id -ItemId root
foreach ($item in $items) {
if ($item.File) {
$outPath = "C:\Backup\M365\OneDrive\$($user.UserPrincipalName)\$($item.Name)"
Invoke-MgGraphRequest -Method GET -Uri $item.'@microsoft.graph.downloadUrl' -OutFile $outPath
}
}}
Nota importante: questo è un esempio base. In produzione devi gestire:
struttura cartelle
file grandi
retry
logging
Backup SharePoint Online: metodo affidabile
Per SharePoint, il modulo migliore è PnP.PowerShell.
Connessione
Connect-PnPOnline -Url “https://tenant.sharepoint.com” -Interactive
Download document library
$sites = Get-PnPTenantSite
foreach ($site in $sites) {
Connect-PnPOnline -Url $site.Url -Interactive
$lists = Get-PnPList | Where-Object {$_.BaseType -eq "DocumentLibrary"}
foreach ($list in $lists) {
$items = Get-PnPListItem -List $list.Title
foreach ($item in $items) {
$file = Get-PnPProperty -ClientObject $item -Property File
if ($file) {
$outFile = "C:\Backup\M365\SharePoint\$($site.Url.Replace('https://',''))\$($file.Name)"
Get-PnPFile -Url $file.ServerRelativeUrl -Path (Split-Path $outFile) -FileName $file.Name -AsFile
}
}
}}
Questo è uno script che, se ben rifinito, può diventare una base solida per backup reali.
Automazione: schedulare il backup
Uno script senza automazione serve a poco.
Usa Task Scheduler su Windows:
- Salva lo script in .ps1
- Crea attività pianificata
- Usa questo comando:
- powershell.exe -ExecutionPolicy Bypass -File “C:\Scripts\backup-m365.ps1”
Consiglio pratico:
- esegui come account di servizio
- usa autenticazione app-based quando possibile
- salva log su file
- Logging serio: non saltarlo
Un backup senza log è inutile quando serve davvero.
Aggiungi sempre:
Start-Transcript -Path “C:\Backup\log.txt”
E alla fine:
Stop-Transcript
Limiti reali dell’approccio PowerShell
Qui serve essere onesti. Questa soluzione:
- non è un vero backup incrementale
- non ha versioning avanzato
- non è veloce su grandi volumi
- richiede manutenzione
Per ambienti enterprise, valuta tool dedicati.
Ma per:
- PMI
- ambienti di test
- export periodici
- controllo dati
è perfettamente valida.
Strategia intelligente: ibrido PowerShell + tool
La soluzione migliore spesso è:
- PowerShell per export rapidi e controllo
- software dedicato per backup continuo
In questo modo hai:
- indipendenza
- visibilità
- recovery veloce
Best practice che fanno davvero la differenza
Qui non trovi teoria, ma cose che in produzione cambiano tutto:
- Non salvare tutto, salva ciò che conta
Definisci priorità: utenti critici, dati sensibili, reparti strategici. - Testa il restore
Un backup non testato è solo una speranza. - Separa storage
Non salvare i backup nello stesso tenant. - Usa naming coerente
Evita caos quando devi recuperare. - Automatizza notifiche
Email o alert se lo script fallisce.
Esempio script completo (semplificato)
Ecco una base reale da cui partire:
Start-Transcript -Path “C:\Backup\log.txt”
Connessioni
Connect-ExchangeOnline
Connect-MgGraph -Scopes “Files.Read.All”
Connect-PnPOnline -Url “https://tenant.sharepoint.com” -Interactive
Backup OneDrive (semplificato)
$users = Get-MgUser -All
foreach ($user in $users) {
try {
$drive = Get-MgUserDrive -UserId $user.Id
Write-Output “Backup OneDrive: $($user.UserPrincipalName)”
} catch {
Write-Output “Errore su $($user.UserPrincipalName)”
}
}
Stop-Transcript
Non è completo, ma è una struttura reale da evolvere.
Conclusione: il punto chiave che molti ignorano
Il backup di Microsoft 365 non è un problema tecnico. È una responsabilità.
Se aspetti che succeda qualcosa per pensarci, sei già in ritardo.
PowerShell ti dà un vantaggio enorme: controllo totale e zero costi iniziali. Ma va usato con criterio.
Se fai il sistemista, questa è una di quelle aree dove puoi davvero fare la differenza tra un disservizio gestibile e un disastro.
E fidati, quando serve davvero un backup, non hai seconde possibilità.
Fonti
Microsoft Learn – Exchange Online PowerShell
Microsoft Learn – Microsoft Graph API
Microsoft Learn – PnP PowerShell per SharePoint Online
Documentazione ufficiale Microsoft 365 Data Protection
Best practice Microsoft per retention e data governance
