Salvare in un PST le singole cartelle di Exchange

RefillPuò capitare di voler fare un backup supplementare rispetto a quello canonico di alcune cartelle di Exchange per alcuni utenti.

Lo scopo di quanto segue è fornire uno strumento schedulabile con il servizio integrato di Windows che consenta di salvare con cadenza regolare tutta o una parte di una mailbox di Exchange su un file PST.

Questa procedura non sostituisce il normale backup, ma lo affianca, in quanto potrebbe essere eseguita con una frequenza diversa rispetto al backup e il file generato può essere aperto dall’utente in maniera autonoma o con un minimo di supporto.

La procedura deve essere eseguita su un’installazione di Windows in cui è presente PowerShell con le estensioni per Exchange. L’esempio che segue è stato verificato con Exchange 2010 su un server Windows 2008.

Come prima cosa bisogna confrontarsi con le peculiarità di PowerShell, che alcune volte sembra progettata dallo stesso gruppo di perversi che ha inventato il COBOL.

I comandi che servono non sono abilitati di default e, se vengono eseguiti, la shell restituisce lo stesso errore che restituirebbe se venisse eseguito un comando che non esiste. Per rimuovere questo blocco bisogna dare una tantum il comando

New-ManagementRoleAssignment –Role "mailbox import export" –User "Utente"

Ovviamente al posto di Utente c’è il nome dell’utente con cui vengono eseguiti i comandi di esportazione. Una volta assegnati, questi ruoli rimangono fino a successivi cambiamenti attraverso un nuovo New-ManagementRoleAssignment.

Nell’esempio che segue viene illustrato uno script che esporta su un disco di rete i contatti di un utente con rotazione settimanale, assegnando ad ogni file PST il nome breve del giorno della settimana in cui è stato esportato.

#
# Giorno della settimana
$d = Get-Date -Format "ddd"
#
# Path del file
$exportname = "\\netbackup\mail\contatti-" + $d +".pst"
#
# Rimozione dei job terminati
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$false
#
# Nuovo job di esportazione
New-MailboxExportRequest -Mailbox "Paolino Paperino" -Filepath $exportname -IncludeFolders "#Contacts#" -BatchName ExportContacts -Name ExportContacts

La prima riga imposta la parte variabile del nome del file, per la spiegazione del formato vedere i riferimenti in fondo all’articolo.

La seconda riga crea il nome del file PST in cui verranno esportati i dati; New-MailboxExportRequest richiede espressamente che il path del file di esportazione sia in formato UNC.

Dal momento che l’esportazione avviene in modalità batch e non interattiva (sembra di parlare dell’AS/400…), la terza riga toglie di mezzo tutti i job terminati, per evitare che la coda dei job si riempia.

L’ultima riga è quella in cui viene accodata l’esportazione; dal momento che il lavoro è eseguito in batch, al termine del comando il file PST non è ancora disponibile.

Il parametro -IncludeFolders specifica le cartelle da esportare (se omesso, viene esportata l’intera mailbox dell’utente). Il parametro accetta come argomento anche delle stringhe che iniziano e terminano con il carattere ‘#’ per indicare i nomi delle mailbox di sistema (Inbox, Contacts, Calendar, eccetera) in un formato indipendente dalla localizzazione di Exchange, quindi "#Contacts#" identifica la cartella predefinita dei contatti indipendentemente dalla lingua in cui è visualizzata.

Una volta che il job viene accodato, si può controllare il suo stato con il comando Get-MailboxExportRequest.

Resta da schedulare lo script perché venga eseguito ogni giorno. Nel Task Scheduler di Windows bisogna creare uno task da eseguire con privilegi elevati indipendentemente dal fatto che un utente sia collegato o meno. Nelle azioni bisogna mettere come programma

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

e come parametro

-command ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1' ; Connect-ExchangeServer -auto ; c:\ps-script\pst-giornaliero.ps1"

dove c:\ps-script\pst-giornaliero.ps1 è il path dello script illustrato sopra. Il path esatto di RemoteExchange.ps1 può cambiare a seconda dell’installazione di Exchange e lo si può vedere nelle proprietà dello shortcut che esegue la Exchange Management Shell.

Riferimenti:

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento