Exchange et Powershell : listes de distribution et propriétaires

Ce script permet de lister l'intégralité des listes de distribution et leur propriétaire (attribut-objet ManagedBy) pour en faire un export CSV.

Si cela peut paraître simple de prime abord, il est nécessaire de traiter l'objet ManagedBy en faisant un cast en chaîne de caractères car il n'est pas possible d'accéder directement aux propriétés de l'objet. En le convertissant en chaîne de caractères, on peut ensuite manipuler le CanonicalName qu'il contient pour garder uniquement le nom de l'utilisateur.

$Output=@()
$DistList = Get-DistributionGroup -Result unlimited | Select Name, ManagedBy
foreach($Dist in $DistList){
	$object = New-Object PSCustomObject
	$object | Add-Member -MemberType NoteProperty -Name "Name" -Value $Dist.Name
	$ManBy = [string]$Dist.ManagedBy
	$object | Add-Member -MemberType NoteProperty -Name "Owner" -Value ($ManBy | ForEach { $_.Split("/")[-1] })
	$Output+=$Object
} 
$Output | Export-CSV DistributionGroupsOwners.csv -Encoding UTF8

Quelques snippets pour Exchange Management Shell

Travaillant de plus en plus sur Exchange ces derniers temps, j'essaye de maximiser mon utilisation courante du Exchange Management Shell. Je vais partager quelques snippets permettant de récupérer des informations qu'il est plus difficile voire impossible de récupérer via la console graphique. Ces snippets peuvent être de bonnes bases pour ensuite peaufiner une recherche, ou simplement avoir la syntaxe pour obtenir une autre information, ou encore pour être intégrés dans un script. A noter que j'ai utilisé ce code sur un Exchange on Premise, il est possible que certaines commandes soient à adapter pour un usage sur Exchange Online.


Liste des mailbox n'ayant pas OWA activé

Get-CasMailbox | Where-Object { $_.OWAEnabled -eq $false }

Liste des mailbox n'ayant pas ActiveSync activé

Get-CasMailbox | Where-Object { $_.ActiveSyncEnabled -eq $false }

La commande Get-CasMailbox permet de retourner d'autres informations, il suffit donc de modifier la propriété que l'on utilise comme critère pour obtenir un nouveau filtre.


Récupération de la taille des mailbox

Get-Mailbox | Get-MailboxStatistics | sort TotalItemSize | ft DisplayName, TotalItemSize, Database

Liste des mailbox n'étant pas sous la règle du quota par défaut de la database

Get-Mailbox | Where-Object {$_.UseDatabaseQuotaDefaults -eq $false} | sort ProhibitSendQuota | ft DisplayName, Database, ProhibitSendQuota

Vérifier les permissions d'un utilisateur sur les mailbox

Get-Mailbox | Get-MailboxPermission | Where-Object {$_.User -like "DOMAINE\enguerrand"} | ft AccessRights, IsInherited, Deny -GroupBy identity

Pour ce snippet, il suffit d'ajouter un paramètre à l'instruction Get-Mailbox pour cibler une boîte particulière.


Lister toutes les mailbox par type

Get-Mailbox | sort RecipientTypeDetails | ft DisplayName, Alias, PrimarySmtpAddress -GroupBy RecipientTypeDetails

Visualiser le trafic sur une mailbox

Get-TransportServer | Get-MessageTrackingLog -Start "01/01/1990 02:00:00" -End "02/01/1990 03:00:00" -Recipients enguerrand@domaine.local

Il est possible de remplacer le paramètre -Recipients par -Sender si l'on souhaite avoir un autre point de vue. Les deux paramètres sont cumulables, permettant de centrer la recherche sur un émetteur et un destinataire. Le paramètre -EventID pouvant prendre les valeurs SEND ou RECEIVE par exemple offre la possibilité de n'afficher uniquement les mails effectivement reçus ou envoyés.

Lister les mails reçus sur une mailbox

Get-TransportServer | Get-MessageTrackingLog -Start "01/01/1990 02:00:00" -End "02/01/1990 03:00:00" -Recipients enguerrand@domaine.local -EventID Receive

Vérifier si une mailbox a des éléments supprimés récupérables

Get-Mailbox enguerrand | Get-MailboxFolderStatistics | Where-Object { $_.Name -like "Recoverable Items" -and $_.ItemsInFolder -gt 0 }

Lister les mailbox attachées à des utilisateurs présents dans une OU

Get-Mailbox | Where-Object {$_.DistinguishedName -like "*OU=Sales*"} | select alias

Exchange et Powershell : usage des databases

Ce script renvoie le nombre de boîtes aux lettres stockées dans une database Exchange ainsi que sa taille.

Le script peut s'appeler avec le nom de la database en paramètre ; si aucun paramètre n'est spécifié, alors le script parcourt toutes les databases.

Par exemple, pour récupérer les informations sur la database DBEXCHFR1, il suffira d'appeler le script de cette manière :

.\exch_dbusage.ps1 -db dbexchfr1

Le script est téléchargeable dans une version commentée.

Param([string]$db)
if($db -eq $null) { $mbxdbs = Get-MailboxDatabase -status | select Name,DatabaseSize }
else { $mbxdbs = Get-MailboxDatabase -status | select Name,DatabaseSize | Where-Object { $_.Name -eq $db } }
foreach($mbxdb in $mbxdbs){
$mbxindb = Get-Mailbox | Where-Object { $_.Database -eq $mbxdb.Name }
Write-Host "Database"$mbxdb.Name
Write-Host "Number of mailboxes on that database:"$mbxindb.Count
Write-Host "Size:"$mbxdb.DatabaseSize`r`n
}

Exchange et Powershell : duplication de mailbox

Ayant remis un peu les mains sur Exchange, j'ai dû réaliser la création de multiples Equipment Mailbox ; voilà qui était donc une excellente idée de départ pour mon tout premier script Powershell pour Exchange.

Ce script permet donc de dupliquer une mailbox existante vers une autre, en gardant la quasi-totalité de ses propriétés et privilèges accordés. Ensuite, le script gère les paramètres propres aux réservations, mais il est bien évidemment possible de mettre cette portion en commentaire.

Write-Host "Equipment Mailbox Duplication Script"
 Write-Host "====================================`r`n"
 $srcmbxname = Read-Host "Source Equipment Mailbox Name or Alias"
 $srcmbx = Get-Mailbox $srcmbxname -ErrorAction Stop
 $srccal = Get-CalendarProcessing $srcmbxname -ErrorAction Stop
 $srcperm = Get-MailboxPermission $srcmbxname
 $newmbxname = Read-Host "New Equipment Mailbox Name"
 $newmbxalias = Read-Host "New Equipment Mailbox Alias"
 $newmbxaddr = Read-Host "New Equipment Mailbox Address"
 Write-Host "Creating the new mailbox…"
 New-Mailbox -Name $newmbxname -Alias $newmbxalias -UserPrincipalName $newmbxaddr -SamAccountName $newmbxalias -OrganizationalUnit $srcmbx.OrganizationalUnit -Equipment -ErrorAction Stop
 Write-Host "Copying basic mailbox properties."
 Set-Mailbox $newmbxalias -UseDatabaseRetentionDefaults $srcmbx.UseDatabaseRetentionDefaults -RetainDeletedItemsUntilBackup $srcmbx.RetainDeletedItemsUntilBackup -GrantSendOnBehalfTo $srcmbx.GrantSendOnBehalfTo -DeliverToMailboxAndForward $srcmbx.DeliverToMailboxAndForward -LitigationHoldEnabled $srcmbx.LitigationHoldEnabled -SingleItemRecoveryEnabled $srcmbx.SingleItemRecoveryEnabled -RetentionHoldEnabled $srcmbx.RetentionHoldEnabled -CalendarRepairDisabled $srcmbx.CalendarRepairDisabled -MessageTrackingReadStatusEnabled $srcmbx.MessageTrackingReadStatusEnabled -RetainDeletedItemsFor $srcmbx.RetainDeletedItemsFor -RecipientLimits $srcmbx.RecipientLimits -AntispamBypassEnabled $srcmbx.AntispamBypassEnabled -CalendarVersionStoreDisabled $srcmbx.CalendarVersionStoreDisabled -HiddenFromAddressListsEnabled $srcmbx.HiddenFromAddressListsEnabled -MaxSendSize $srcmbx.MaxSendSize -MaxReceiveSize $srcmbx.MaxReceiveSize -EmailAddressPolicyEnabled $srcmbx.EmailAddressPolicyEnabled -RequireSenderAuthenticationEnabled $srcmbx.RequireSenderAuthenticationEnabled -SendModerationNotifications $srcmbx.SendModerationNotifications -ExternalOofOptions $srcmbx.ExternalOofOptions -ProhibitSendQuota $srcmbx.ProhibitSendQuota -ProhibitSendReceiveQuota $srcmbx.ProhibitSendReceiveQuota -DowngradeHighPriorityMessagesEnabled $srcmbx.DowngradeHighPriorityMessagesEnabled -UseDatabaseQuotaDefaults $srcmbx.UseDatabaseQuotaDefaults -IssueWarningQuota $srcmbx.IssueWarningQuota -RemoteRecipientType $srcmbx.RemoteRecipientType -AuditEnabled $srcmbx.AuditEnabled -AuditLogAgeLimit $srcmbx.AuditLogAgeLimit -AuditAdmin $srcmbx.AuditAdmin -AuditDelegate $srcmbx.AuditDelegate -AuditOwner $srcmbx.AuditOwner -AcceptMessagesOnlyFromDLMembers $srcmbx.AcceptMessagesOnlyFromDLMembers -ArbitrationMailbox $srcmbx.ArbitrationMailbox -BypassModerationFromSendersOrMembers $srcmbx.BypassModerationFromSendersOrMembers -CustomAttribute1 $srcmbx.CustomAttribute1 -CustomAttribute2 $srcmbx.CustomAttribute2 -CustomAttribute3 $srcmbx.CustomAttribute3 -CustomAttribute4 $srcmbx.CustomAttribute4 -CustomAttribute5 $srcmbx.CustomAttribute5 -CustomAttribute6 $srcmbx.CustomAttribute6 -CustomAttribute7 $srcmbx.CustomAttribute7 -CustomAttribute8 $srcmbx.CustomAttribute8 -CustomAttribute9 $srcmbx.CustomAttribute9 -CustomAttribute10 $srcmbx.CustomAttribute10 -CustomAttribute11 $srcmbx.CustomAttribute11 -CustomAttribute12 $srcmbx.CustomAttribute12 -CustomAttribute13 $srcmbx.CustomAttribute13 -CustomAttribute14 $srcmbx.CustomAttribute14 -CustomAttribute15 $srcmbx.CustomAttribute15 -ExtensionCustomAttribute1 $srcmbx.ExtensionCustomAttribute1 -ExtensionCustomAttribute2 $srcmbx.ExtensionCustomAttribute2 -ExtensionCustomAttribute3 $srcmbx.ExtensionCustomAttribute3 -ExtensionCustomAttribute4 $srcmbx.ExtensionCustomAttribute4 -ExtensionCustomAttribute5 $srcmbx.ExtensionCustomAttribute5 -ModeratedBy $srcmbx.ModeratedBy -ModerationEnabled $srcmbx.ModerationEnabled -RejectMessagesFromDLMembers $srcmbx.RejectMessagesFromDLMembers -SimpleDisplayName $srcmbx.SimpleDisplayName -MailTip $srcmbx.MailTip -MailTipTranslations $srcmbx.MailTipTranslations -ErrorAction Stop
 Write-Host "Done. Now copying calendar processing properties."
 Set-CalendarProcessing -Identity $newmbxalias -AutomateProcessing $srccal.AutomateProcessing -AllowConflicts $srccal.AllowConflicts -BookingWindowInDays $srccal.BookingWindowInDays -MaximumDurationInMinutes $srccal.MaximumDurationInMinutes -AllowRecurringMeetings $srccal.AllowRecurringMeetings -EnforceSchedulingHorizon $srccal.EnforceSchedulingHorizon -ScheduleOnlyDuringWorkHours $srccal.ScheduleOnlyDuringWorkHours -ConflictPercentageAllowed $srccal.ConflictPercentageAllowed -MaximumConflictInstances $srccal.MaximumConflictInstances -ForwardRequestsToDelegates $srccal.ForwardRequestsToDelegates -DeleteAttachments $srccal.DeleteAttachments -DeleteComments $srccal.DeleteComments -RemovePrivateProperty $srccal.RemovePrivateProperty -DeleteSubject $srccal.DeleteSubject -AddOrganizerToSubject $srccal.AddOrganizerToSubject -DeleteNonCalendarItems $srccal.DeleteNonCalendarItems -TentativePendingApproval $srccal.TentativePendingApproval -EnableResponseDetails $srccal.EnableResponseDetails -OrganizerInfo $srccal.OrganizerInfo -ResourceDelegates $srccal.ResourceDelegates -RequestOutOfPolicy $srccal.RequestOutOfPolicy -AllRequestOutOfPolicy $srccal.AllRequestOutOfPolicy -BookInPolicy $srccal.BookInPolicy -AllBookInPolicy $srccal.AllBookInPolicy -RequestInPolicy $srccal.RequestInPolicy -AllRequestInPolicy $srccal.AllRequestInPolicy -AddAdditionalResponse $srccal.AddAdditionalResponse -AdditionalResponse $srccal.AdditionalResponse -RemoveOldMeetingMessages $srccal.RemoveOldMeetingMessages -AddNewRequestsTentatively $srccal.AddNewRequestsTentatively -ProcessExternalMeetingMessages $srccal.ProcessExternalMeetingMessages -RemoveForwardedMeetingNotifications $srccal.RemoveForwardedMeetingNotifications -ErrorAction Stop
 Write-Host "Done. Now setting up permissions."
 foreach($perm in $srcperm){
     if($perm.Deny.IsPresent -eq $false) { Add-MailboxPermission -Identity $newmbxalias -User $perm.User -AccessRights $perm.AccessRights }
     else { Add-MailboxPermission -Identity $newmbxalias -User $perm.User -AccessRights $perm.AccessRights -Deny }
 }
 Write-Host "All done. Successfully created mailbox"$newmbxalias

Le script est téléchargeable dans une version commentée.