Archives For PowerShell per Office 365

La funzione di Message Trace di Office 365, quindi Exchange in cloud, funziona abbastanza bene. Si dichiara l’intervallo da analizzare e il mittente o il destinatario sul quale devi effettuare delle verifiche. A quel punto ti basterà mettere la visualizzazione in ordine di oggetto mail e cercare ciò che ti interessa realmente. E se invece si potesse saltare questo step, avere da subito maggiore profondità (in giorni) e cercare per oggetto della mail senza specificare un mittente o un destinatario? Si può fare, basta aggirare l’ostacolo passando –come spesso accade– da PowerShell.

PowerShell: un Message Trace basato sull'oggetto della mail

Ho cercato sul web qualcuno con la mia stessa esigenza. L’ho trovato e ho potuto osservarne il lavoro. Tutto parte dallo script proposto su blogs.perficient.com/microsoft/2016/03/office-365-script-to-perform-message-trace-by-subject. È la giusta base di partenza alla quale vanno modificate solo un paio di cose, soprattutto per quello che riguarda il modo di trattare il parametro di data e ora, secondo quanto spiegato qui.

La modifica è banale e riguarda esclusivamente il modo in cui viene formato l’output del Get-Date, parametro senza il quale lo script va in errore e non è capace di svolgere correttamente il suo lavoro:

[DateTime]$DateEnd = Get-Date -format "MM/dd/yyyy HH:mm"

Così facendo, non è necessario intervenire ulteriormente sullo script originale (a meno che tu non voglia modificare il formato di output nelle 3 volte in cui viene richiamato nel corso dello script, nda). Ho caricato la versione modificata dello script su GitHub, ed è entrata a far parte della “suite” dedicata all’amministrazione di Office 365 via PowerShell: github.com/gioxx/o365/blob/master/Get-MessageTraceBySubject.ps1

Il risultato funziona, impiega il suo tempo, presenta infine le mail che è riuscito a individuare e che contengono quell’oggetto ricercato (attento, usa le wildcard quanto non sei sicuro del titolo completo dato a una mail). Il file di log viene prodotto nella stessa cartella in cui risiede lo script, a meno di andare a lanciare lo stesso con il parametro -LogFile $percorso, per esempio .\Get-MessageTraceBySubject.ps1 -LogFile C:\MessageTrace.txt

Buon lavoro :-)

Condividi l'articolo con i tuoi contatti:

Pillole

Le pillole sono articoli di veloce lettura dedicati a notizie, script o qualsiasi altra cosa possa essere "divorata e messa in pratica" con poco. Uno spazio del blog riservato ai post "a bruciapelo"!

Consigli pratici di sopravvivenza: si tratta di una modifica (del documento) dello scorso agosto ma che ancora oggi miete vittime abbastanza facilmente. Si tratta dei tempi di Recovery per la posta elettronica eliminata dal cestino di Outlook, quella ancora recuperabile da server, tramite apposito “Recupera posta eliminata“. Se ti stai chiedendo quanti giorni hai a disposizione in questa fase, probabilmente la risposta è 14, e non ti piacerà.

Change how long permanently deleted items are kept for an Exchange Online mailbox

La più classica delle ricerche in Google suggerisce un come fare, per l’esattezza “Change how long permanently deleted items are kept for an Exchange Online mailbox“, ed è così che si finisce in Technet a leggere ciò che Microsoft spiega a tal proposito. Secondo l’ultimo ritocco, i giorni di Recovery di una mailbox (predefiniti) sono 14, pochissimi considerando che una persona ha (sempre di default) una policy che pulisce automaticamente il cestino dopo 30 giorni, ma che non gli impedisce di pulirlo autonomamente all’uscita dal client, per esempio. Ciò vuol dire che si hanno, nella peggiore delle ipotesi, al massimo 14 giorni per accorgersi di aver fatto una stupidata, oltre i quali diventa definitiva.

Ho voluto modificare questo comportamento, ritoccando la policy di pulizia del Cestino (ECP → Compliance Management → Retention Tags → Deleted Items) e portandola a 60 giorni, quindi facendo girare un’istruzione PowerShell per portare i 14 giorni di Recovery a 30, il massimo offerto da Office 365:

Get-Mailbox -ResultSize unlimited | Set-Mailbox -RetainDeletedItemsFor 30

L’istruzione modificherà il comportamento di ogni casella attualmente presente su Exchange in cloud. Il problema però te l’ho appena riportato tra le righe. Così facendo modificherai il periodo di retention delle caselle fino a ora presenti sul server, non lo farai per quelle future, dovrai quindi prevedere un automatismo che lo faccia anche per le prossime caselle di posta che andrai a creare, oppure dovrai ricordarti ogni volta di lanciare lo stesso comando via PowerShell (io, avendo già uno script PowerShell che rifinisce un utente appena creato, ho aggiunto l’istruzione a quelle solitamente eseguite).

A quel punto, per recuperare qualcosa di apparentemente perso, basterà mettere in pratica quanto suggerito da Microsoft stessa:

Buon lavoro.

Condividi l'articolo con i tuoi contatti:

Pillole

Le pillole sono articoli di veloce lettura dedicati a notizie, script o qualsiasi altra cosa possa essere "divorata e messa in pratica" con poco. Uno spazio del blog riservato ai post "a bruciapelo"!

Per la serie “sbagliando si impara“, anche se in realtà vale anche quella che dice che l’errore davanti ai propri occhi è anche quello che continua a sfuggire pure alla centesima rilettura, oggi prendo appunti su PowerShell e ordinamento dei risultati richiesti.

Nello specifico volevo ottenere una lista di contatti con un preciso dominio impostato nel PrimarySMTPAddress (WindowsEmailAddress), ho pensato bene quindi di lanciare un comando semplice (il Get-MailContact), filtrare in output solo ciò che mi interessava e pretendere di ordinare l’output dopo averlo già generato:

PS C:\PS1\PS1> Get-MailContact -ResultSize unlimited | where {$_.WindowsEmailAddress -like "*@contoso.com"} | ft name,Alias,WindowsEmailAddress | sort name
out-lineoutput : L'oggetto di tipo "Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData" non è valido oppure non è stato specificato nella sequenza corretta. L'errore dipende probabilmente da un comando "format-*" specificato dall'utente in conflitto con la formattazione predefinita.
    + CategoryInfo          : InvalidData: (:) [out-lineoutput], InvalidOperationException
    + FullyQualifiedErrorId : ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand

Per una illogica del mio unico neurone alla ricerca di aria fresca, mi ostinavo a chiedere un sort in seguito alla formattazione della tabella in output, quando in realtà il sort va chiesto prima di preparare i risultati da mostrare a video (cosa abbastanza normale a pensarci a sangue freddo, non trovi?). Il modo giusto per chiederlo è quindi anteporlo al Format-Table:

Get-MailContact -ResultSize unlimited | where {$_.WindowsEmailAddress -like "*@contoso.com"} | sort name | ft name,Alias,WindowsEmailAddress

Che produce un risultato a video assolutamente preciso, secondo richiesta impartita:

Sbagliando si impara: PowerShell, Sort e Format-Table

Metto da parte, lezione imparata, nel frattempo mi bastono da solo.

G

Condividi l'articolo con i tuoi contatti:

Pillole

Le pillole sono articoli di veloce lettura dedicati a notizie, script o qualsiasi altra cosa possa essere "divorata e messa in pratica" con poco. Uno spazio del blog riservato ai post "a bruciapelo"!

Uno di quei consigli che sono facili da ricordare e da recuperare con una ricerca nel blog, in case of emergency. Gestisci un tenant con centinaia (se non di più) persone registrate e non puoi certo ricordare uno a uno gli indirizzi di posta gestiti, soprattutto quando si parla di persone con uno o più alias a testa, shared mailbox, contatti e chissà quanto altro ancora, Exchange è un mondo infinito, nella sua soluzione cloud è poi in continua evoluzione.

Come cerchi un indirizzo di posta elettronica all’interno del tenant? Come capisci a chi o cosa è stato assegnato? Tutto sommato semplice: usi l’ennesima query.

Get-Recipient -Filter {EmailAddresses -like "*mario.rossi*"}

Powershell office 365 cercare un indirizzo di posta

In un solo colpo trovi qualsiasi cosa abbia uno specifico (o parte del) indirizzo di posta elettronica tra quelli a lui assegnati, a prescindere che si tratti di una mailbox (personal o shared non importa), un contatto mail, un mail user. Nella query che ho riportato qui sopra il *mario.rossi* cerca qualunque indirizzo contenga quel nome.cognome, a prescindere dalla sua posizione, ignorando totalmente il dominio. Funziona, è immediato, è maledettamente comodo, soprattutto quando ti ritrovi di fronte alla domanda secca di un tuo superiore oppure un errore di PowerShell quando si tenta di creare una casella di posta elettronica con lo stesso indirizzo di posta di qualcosa di già esistente.

Per ovvi motivi, il filtro può funzionare con qualsiasi parametro facente compatibile con il Get-Recipient, basterà modificare un tantinello la richiesta da far eseguire a PowerShell, per esempio:

Get-Recipient -Filter { Name -like "*alessio*"}

Ricercherà qualsiasi cosa abbia “Alessio” nel campo nome, a prescindere -ancora una volta- che si tratti di casella di posta, contatto o gruppo (e non solo).

Buon lavoro.

G

Condividi l'articolo con i tuoi contatti: