PowerShell: verificare i permessi di calendario degli utenti Office 365

| |

PowerShell Logo Gioxx.org

Chi è abituato a lavorare con Office 365 interfacciandolo con iPhone (una configurazione abbastanza comune, casella di posta e profilo Microsoft Exchange) probabilmente sa che un permesso applicato in maniera sbagliata potrebbe portare ad avere su iPhone un calendario (e relativi alert) che non si dovrebbe poter visualizzare, un dettaglio che può sfuggire invece nel client di Outlook sul PC perché – contrariamente allo smartphone – questo non attiva in maniera predefinita la visibilità degli appuntamenti fissati.

Come si può risolvere il problema? Sanando situazioni sbagliate, informando gli utenti per farli agire autonomamente oppure intervenendo in maniera diretta quando la situazione è un pelo più delicata. In soldoni questo si traduce con l’estrazione completa dei permessi di calendario applicati su ogni casella personale o condivisa, verificando poi le anomalie in un momento subito successivo.

Estrazione dei permessi di calendario

Ringrazio ogni singola fonte dalla quale ho appreso e preso a piene mani ispirazione o pezzi di codice che mi hanno poi permesso di imbastire uno script che si adatta all’esigenza che avevo. Più sono gli utenti gestiti con Exchange in Cloud, più sarà difficile lanciare uno script che analizza ogni singola mailbox estraendo il dato che si vuole ottenere, questo perché sarà facilissimo incorrere nei limiti di operazioni che uno script PowerShell può eseguire nei confronti dell’Exchange online (quadrotech-it.com/blog/office-365-exchange-online-powershell-throttling o support.microsoft.com/en-us/help/2881759/micro-delay-applied-warning-or-delays-when-you-run-scripts-and-cmdlets). La mia proposta si basa quindi sull’estrazione dei permessi di calendario partendo da un file CSV che – questo è il mio consiglio – non superi le 150/200 caselle di posta per volte.

Ti mostro lo script e dopo ti spiego meglio cosa va a fare:

Param( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] [string] $CSV )
$Result=@()
$totalMailboxes = Get-Content $CSV | Measure-Object –Line
$totalMailboxes = $totalMailboxes.Lines - 1
$i = 1 
Import-CSV $CSV | ForEach-Object {
    $mailbox = $_
    Write-Progress -activity "Verifico $($_.Displayname)" -status "$i di $totalMailboxes completati"
    $calendarFolder = Get-MailboxFolderStatistics -Identity "$($_.PrimarySMTPAddress)" -FolderScope Calendar | Select Name -ExpandProperty Name -First 1
    $folderPerms = Get-MailboxFolderPermission -Identity "$($_.PrimarySMTPAddress):\$($calendarFolder)" | where { $_.AccessRights -notlike "AvailabilityOnly" -and $_.AccessRights -notlike "None"} 
    $folderPerms | ForEach-Object {
        $Result += New-Object PSObject -property @{ 
        MailboxName = $mailbox.DisplayName
        User = $_.User
        Permissions = $_.AccessRights
        }
    }
    $i++
}
$Result | Select MailboxName, User, Permissions |
Export-CSV "C:\temp\CalendarPermissions.CSV" -NoTypeInformation -Encoding UTF8 -Delimiter ";" -Append

Dato un elenco CSV all’interno del quale ho ipotizzato esistesse una colonna contenente il nome completo dell’utente (Displayname, per esempio “Mario Rossi”) e una seconda colonna contenente l’indirizzo di posta elettronica principale (PrimarySMTPAddress, quindi mario.rossi@contoso.com), lo script andrà a cercare il nome della cartella di calendario che può chiamarsi in maniera differente in base alla lingua impostata come predefinita sulla casella di posta elettronica (nel mio Gruppo ho tantissimi utenti che utilizzano una casella en-US e altrettanti che hanno it-IT, generando così il problema di avere a che fare con la cartella “Calendar” o “Calendario” a seconda dell’utente analizzato):

$calendarFolder = Get-MailboxFolderStatistics -Identity "$($_.PrimarySMTPAddress)" -FolderScope Calendar | Select Name -ExpandProperty Name -First 1

(espando la proprietà Name della cartella che funge da Calendario – FolderScope Calendar – e seleziono il primo valore Name che corrisponde nella totalità dei casi a Calendar per le caselle in inglese o Calendario per quelle in italiano).

Grazie a questo piccolo escamotage posso andare a estrarre i permessi di calendario di ogni singolo utente escludendo quelli generalmente sempre presenti (AvailabilityOnly e None)

$folderPerms = Get-MailboxFolderPermission -Identity "$($_.PrimarySMTPAddress):\$($calendarFolder)" | where { $_.AccessRights -notlike "AvailabilityOnly" -and $_.AccessRights -notlike "None"}

Ripeti queste operazioni per ciascuna casella di posta da analizzare e popola un file CSV che conterrà – ovviamente – la casella analizzata, l’utente e i relativi suoi accessi al calendario di quella casella di posta. Da questo momento in poi parte il lavoro di analisi e pulizia degli accessi, ma è altra storia. Quello che sembra essere uno stupido file scritto in qualche minuto in realtà mi è costato un paio di ragionamenti malati (e un paio di ore) che alla fine però hanno permesso di ottenere il risultato sperato.

Il codice su GitHub

Il codice spiegato poco sopra si trova chiaramente nel mio spazio GitHub, nel repository dedicato agli script PS1 per Office 365, più precisamente qui: github.com/gioxx/o365/blob/master/ListCalendarPermission-CSV.ps1. Un differente approccio basato invece non su un CSV di origine ma su un’analisi lanciata a tappeto su tutti gli utenti Office 365 del tuo tenant (sconsigliato se ne hai un numero consistente) è invece disponibile puntando il browser all’indirizzo github.com/gioxx/o365/blob/master/ListCalendarPermission.ps1, in tal caso cambia anche – di poco – il metodo utilizzato per individuare il corretto nome della cartella di calendario ma non quello di escludere permessi assolutamente inutili e normali ai fini dell’analisi postuma:

$_.AccessRights -notlike "AvailabilityOnly" -and $_.AccessRights -notlike "None"

In caso di dubbi, domande o suggerimenti per miglioramenti – come al solito – sai bene che l’area commenti è a tua totale disposizione.

#StaySafe


Immagine di copertina Estée Janssens on Unsplash
Riconoscimenti:
morgantechspace.com/2019/09/get-calendar-permissions-for-all-users-using-powershell.html
itsallinthecode.com/exchange-powershell-get-calendar-folder-permissions-in-any-language
stackoverflow.com/questions/1408042/output-data-with-no-column-headings-using-powershell
techcommunity.microsoft.com/t5/office-365/report-on-default-calendar-permissions-if-they-are-set-to/m-p/155060

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Gioxx's Wall

Se hai correzioni o suggerimenti puoi lasciare un commento nell'apposita area qui di seguito o contattarmi privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! Satispay / PayPal / Buy Me A Coffee / Patreon

Condividi l'articolo con i tuoi contatti: