Backup Microsoft 365 con PowerShell: guida pratica con script pronti all’uso per sistemisti

Generato con IA
()

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:

  1. Non salvare tutto, salva ciò che conta
    Definisci priorità: utenti critici, dati sensibili, reparti strategici.
  2. Testa il restore
    Un backup non testato è solo una speranza.
  3. Separa storage
    Non salvare i backup nello stesso tenant.
  4. Usa naming coerente
    Evita caos quando devi recuperare.
  5. 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


How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?

- / 5
Grazie per aver votato!

Notifiche push abilitate

Grazie per aver abilitato le notifiche!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *