# bjdc-del-emailaddr
#
# Supprimer toutes les addresses smtp liées à un domaine
#
# Condition : les objets ne doivent pas être soumis à une Email Address Policy qui repositionne le domaine à enlever
#
# Entree :
#  Domain : nom de domaine, obligatoire
#  Type : type d'objet à sauvegarder, obligatoire, choisir entre Mailbox, Contact ou DistrGroup
#  NewDomain : le nouveau domaine à mettre en PrimarySmtpAddress si besoin

# Author Bruce JDC

param(
[parameter(Mandatory=$true,Position=0)]
[ValidateNotNullOrEmpty()]
[String] $Domain,
[parameter(Mandatory=$true,Position=1)]
[ValidateNotNullOrEmpty()]
[ValidateSet("Mailbox","Contact","DistrGroup")]
[String] $Type,
[parameter(Mandatory=$true,Position=2)]
[ValidateNotNullOrEmpty()]
[String] $NewDomain
)

# chargement du snapin EMS
if (!(get-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin)) {
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin
}

# filtre pipeline
filter filter_domain {
 if ($_.SmtpAddress -like $Fdomain) {
  Write-Output $_
 }
}

switch ($Type) {
 "Mailbox" {$cmd = 'Get-Mailbox' ; break }
 "Contact" {$cmd = 'Get-MailContact' ; break }
 "DistrGroup" {$cmd = 'Get-DistributionGroup' ; break }
 # si on passe dans default, c'est qu'il y a un gros problème
 default {exit}
}

$FDomain = '*@'+ $Domain 


$r = Invoke-Expression ($cmd + ' -ResultSize unlimited -Filter { Emailaddresses -like $Fdomain }')
if ($r) {
 foreach ($mb in $r) {
  # Si le domaine est utilisé dans la primary, on doit changer celui ci
  if ($mb.PrimarySmtpAddress -like $FDomain) {
   Write-Host ("Changement d'adresse principale : " + $mb.PrimarySmtpAddress + " devient " + ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain))
   switch ($Type) {
    "Mailbox" {$mb |Set-Mailbox -PrimarySmtpAddress ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain) -EmailAddressPolicyEnabled $false}
    "Contact" {$mb | Set-MailContact -PrimarySmtpAddress ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain)-EmailAddressPolicyEnabled  $false}
    "DistrGroup" {$mb | Set-DistributionGroup -PrimarySmtpAddress ($mb.PrimarySmtpAddress.Local + '@'+$NewDomain) -EmailAddressPolicyEnabled $false}
    # si on passe dans default, c'est qu'il y a un gros problème
    default {exit}
   } 
  }
  
  
  $mb = $mb | Update-List -Property EmailAddresses -Remove ($mb.emailaddresses | filter_domain)
  switch ($Type) {
   "Mailbox" {$mb | Set-Mailbox}
   "Contact" { $mb.ExternalEmailAddress = ($mb.PrimarySmtpAddress.ToString()) ;
   $mb.HiddenFromAddressListsEnabled = $true ;
   $mb | Set-MailContact}
   "DistrGroup" {$mb | Set-DistributionGroup}
   # si on passe dans default, c'est qu'il y a un gros problème
   default {exit}
  }
 }
} else {
 Write-Host "Aucun résultat"
}