Powershell : extraction des adresses du champ "To" d'une entête SMTP

J'ai développé en Powershell un script permettant d'extraire les adresses mail d'une en-tête SMTP. Mon but était de récupérer dans un fichier CSV une liste d'adresses pour effectuer sur ces adresses un traitement supplémentaire.

Dans Outlook, il suffit donc d'ouvrir l'entête SMTP du mail en question, de copier-coller le champ "To" dans un fichier texte et de le passer en paramètre lors de l'exécution du script pour obtenir la liste des adresses dans l'output console Powershell ainsi que dans le fichier CSV passé en paramètre. On peut donc l'appeler ainsi :

.\regex-to-smtp-header.ps1 -Header to.txt -CsvOutput addresses.csv

Voici le script, la version commentée est disponible après celui-ci.

param([Parameter(Mandatory=$true)][string]$Header, [Parameter(Mandatory=$true)][string]$CsvOutput)
$CsvExport = @()
$smtpheader = Get-Content -Path $Header -Raw -ErrorAction stop
while($smtpheader.IndexOf("<") -ne -1) {
    $ls = $smtpheader.IndexOf("<")
    $rs = $smtpheader.IndexOf(">")
    $adrlgt = $rs-$ls
    $adr = $smtpheader.SubString(($ls+1),($adrlgt-1))
    echo $adr
    $adrcsv=@{Address=$adr}
    $adrexp = New-Object PSObject -Property $adrcsv
    $CsvExport+=$adrexp
    $smtpheader = $smtpheader.Substring($rs+1,(($smtpheader.Length-$rs)-1))
}
$CsvExport | Export-CSV $CsvOutput -NoTypeInformation

Exchange et Powershell : uniformisation des adresses mail

Ce script Powershell récupère la liste des mailbox présentes pour les utilisateurs membres de l'OU spécifiée et ajoute comme adresse mail principale une adresse au format prenom.nom@domaine.tld.

Ce script permet donc d'uniformiser les adresses mail en gérant les divers caractères spéciaux et accents, tout en conservant les anciennes adresses qui peuvent servir comme alias, évitant d'avoir à communiquer par rapport à sa nouvelle adresse.

function process {
	Param([string] $name)
	$specials = @("- '","âä","éèëê","ïîì","ôö","üûù","ÿ")
	for($i=0; $i -lt $specials.Length; $i++) {
		for($j=0; $j -lt $specials[$i].Length; $j++) {
			switch($i) {
				"0" { $l = "" }
				"1" { $l = "a" }
				"2" { $l = "e" }
				"3" { $l = "i" }
				"4" { $l = "o" }
				"5" { $l = "u" }
				"6" { $l = "y" }
			}
			$name = $name.Replace(($specials[$i].SubString($j,1)),$l)
		}
	}
	return $name
}
 
$mailboxes = Get-Mailbox | Where-Object { $_.OrganizationalUnit -like "dundermifflin.inc/USERS/*"}
foreach ($mailbox in $mailboxes) {
	$adUser = Get-AdUser $mailbox.Name
	$newsmtp = ((process($adUser.GivenName))+"."+(process($adUser.Surname))).ToLower()+"@dundermifflin.inc"
	Set-Mailbox $mailbox -PrimarySmtpAddress $newsmtp
}

Comme toujours, vous pouvez télécharger le script dans une version commentée grâce au lien suivant.

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