EDIT: Se volete uno script pronto per archiviare una cassetta postale, che accetta parametri etc...
... sto lavorando a un nuovo POST.
Iscrivetevi come follower al BLOG (o con il vostro lettore di notizie RSS): verrete avvisati quando pubblicherò l'articolo! :-)
A volte ci si trova nella necessità di creare delle
esportazioni di cassetta postale in file che possano essere esaminati o aperti
in momenti successivi.
É il caso, ad esempio, di quando si hanno lavoratori remoti
(smart-working o personale con funsioni principalmente esterne) e una
connessione “limitata”.
Il problema che si pone in quel caso è che archiviare un PST
su un file server (perché possa essere sottoposto a backup e non sia a rischio
di rottura del disco fisso del PC) risulta un’operazione che satura tutta la
larghezza di banda… Questo perché il client deve tenere aperto il file e, non
so perché in dettaglio, manda dati avanti e indietro come un pazzo…
La soluzione quick & dirty sarebbe di creare il file PST
in locale e poi spostarlo sul server… tuttavia anche questa ha parecchie
limitazioni, così ovvie che non le scrivo qui.
Quindi, cosa fare per essere sicuri di archiviare
automaticamente le mail in una cassetta postale con powershell (Exchange Management
Console) in Microsoft Exchange Server 2010 SP3 (ma anche nelle versioni
successive)?
Ecco i comandi che ci possono essere utili:
- New-MailboxExportRequest (iniziare la richiesta di esportazione)
- Get-MailboxExportRequest (ottenere le richieste di esportazione in corso, e anche terminate)
- Get-MailboxExportRequestStatistics (ottenere le satistiche circa l’avanzamento della richiesta)
- Remove-MailboxExportRequest (rimuove la request dalla coda, utile soprattutto per far pulizia).
Premesse
Caricare la snap-in di exchange (ovvio)
Tutti questi comandi vanno lanciati da una powershell con la
snap-in di Microsoft Exchange, quindi, se avete una powershell normale,
lanciate:
if ( (Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction SilentlyContinue) -eq $null ){
add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010
}
E avrete la snap-in amministrativa caricata.
Non si può salvare in un percorso LOCALE del server
deve essere una share
di rete (anche se potete usare tranquillamente \\NOMESERVER\C$)
(o almeno IO non posso, dato che ho un DAG – un cluster di
exchange – ma suppongo sia così per tutti).
Accesso share di destinazione
La share di rete deve permettere l’accesso in scrittura agli
account COMPUTER dei server Exchange nella vostra organizzazione.
Quindi, autorizzate, altrimenti riceverete un bel “Access
Denied”
FINE DELLE PREMESSE
Esportazione di tutta la cassetta postale
Ve la faccio breve: ecco come fare se si vuole esportare TUTTO il contenuto della
cassetta postale.
New-MailboxExportRequest cassetta.postale@dominio.it -FilePath "\\server\share\...\archivioCassettaPostale.pst"
Le opzioni di New-MailboxExportRequest
Ecco qui le opzioni da get-help del comando.
New-MailboxExportRequest
[-Mailbox]
-FilePath
[-AcceptLargeDataLoss]
[-AssociatedMessagesCopyOption ]
[-BadItemLimit
]
[-BatchName
]
[-CompletedRequestAgeLimit
]
[-Confirm]
[-ConflictResolutionOption
]
[-ContentFilter
]
[-ContentFilterLanguage
]
[-DomainController ]
[-ExcludeDumpster]
[-ExcludeFolders
]
[-IncludeFolders
]
[-InternalFlags
]
[-IsArchive]
[-LargeItemLimit
]
[-MRSServer ]
[-Name ]
[-Priority ]
[-RemoteCredential
]
[-RemoteHostName
]
[-SkipMerging
]
[-SourceRootFolder
]
[-Suspend]
[-SuspendComment
]
[-TargetRootFolder
]
[-WhatIf]
[-WorkloadType ]
[]
Focalizziamoci per ora solo su:
-BadItemLimit
-ContentFilter
-ContentFilterLanguage
BadItemLimit: consentire l’errore su N items e proseguire
Con questa opzione possiamo specificare quanti errori “tollerare”
prima che il job fallisca. In base alle necessità si può variare il numero,
tuttavia ho riscontrato che i job lanciati con il default falliscono un po’
troppo spesso. Quindi, se vogliamo tollerare un po’ di perdita, per
consentirci di lanciare il comando unattended, sarà bene aumentare un po’…
ContentFilter: un filtro per selezionare i messaggi da esportare
… e qui abbiamo a disposizione un intero arsenale di opzioni,
pari quasi alle proprietà dei singoli messaggi….
Prendiamo ad esempio questo filtro
{(body -like "*company*") -and (body -like "*profit*") -and (Received -lt "01/01/2018")}
Ci consente di esportare solo i
messaggi che contengono le parole company e profit nel corpo del messaggio e
che sono ricevuti prima del primo Gennaio 2018.
ContentFilterLanguage : possiamo specificare la localizzazione (culture) del
filtro
A che mi serve, direte voi?
Perché se usate filtri con il nome delle cartelle o con il
nome di determinati altri parametri che sono soggetti a localizzazione (quindi
hanno un nome diverso se la cassetta postale è impostata per la localizzazione
in Italiano, rispetto che in inglese, ad esempio), dovrete specificare il che “culture”
è il filtro che usate…
se avete bisogno di altre opzioni ecco il link ufficiale
(non cambia da Exchange 2010 al 2019):
Esportazione di una cassetta postale con Filtro.
Ecco un classico filtro che potete applicare per un job di
archiviazione ricorsivo. Usiamo le date con le operazioni, per identificare un intervallo
ed esportare solo le mail inviate o ricevute entro quell’intervallo.
$a = get-date
New-MailboxExportRequest cassetta.postale@dominio.it -FilePath "\\server\share\...\archivioCassettaPostale.pst" -ContentFilter {(received -lt (get-date).AddDays(-60).AddHours(-1*$a.Hour).AddMinutes(-1*$a.Minute)) -and (received -gt (get-date).AddDays(-90).AddHours(-1*$a.Hour).AddMinutes(-1*$a.Minute) )}
Come vedete, memorizzo prima la data attuale in $a, quindi vado
a togliere le ore e i minuti dalla data, per riportarla a mezzanotte del giorno
selezionato.
Qui selezioniamo tutti i messaggi inviati o ricevuti tra i
60 e i 90 giorni prima dalla data attuale, con
received -lt (less than) e received -gt (greater than)
Alcuni Trucchetti
ottenere il primo ed ultimo giorno del mese corrente (o di una data in
mezzo al mese), con Powershell
Primo giorno del mese in powershell
$a.AddDays(-1*($a.Day-1))
#se invece il mese è definito (SO già che è MARZO):
get-date("03/2019")
Ultimo giorno del mese in powershell
(Get-date(($a.Month+1).ToString()+”/”+$a.Year.ToString())).AddDays(-1)
Questi esempi assumono $a = una data ottenuta con get-date
Fare Pulizia delle mailboxExportRequest
Come vedete nello screenshot più in basso, le richieste,
anche quando vengono completate, rimangono in “storico”. Questo per consentire
a chi dovesse lanciarne molte di visualizzarne i risultati.
Ecco quindi come fare pulizia, una volta che sono tutte
terminate, in un modo o nell’altro:
get-MailboxExportRequest | Remove-MailboxExportRequest
ed ecco il risultato
Bene, spero di aver stuzzicato anche oggi la vostra voglia di scriptare... vi mando il solito augurio:
HAPPY SCRIPTING A TUTTI!