Script to Fix IMCEAEX #550 5.1.1 RESOLVER.ADR.ExRecipNotFound; not found ##

Below Script fixes recipients for whom you are getting IMCEAEX user not found NDR.


Useage Examples:
#copy and paste the entire NDR to a File
#To convert to x500 from csv   : .\Fix-IMCEAEX-From-NDR.ps1 -NDRFile File.txt
#To make changes to user Account : .\Fix-IMCEAEX-From-NDR.ps1 -NDRFile File.txt -edit True
#To Verify the Changes to Account : .\Fix-IMCEAEX-From-NDR.ps1 -NDRFile File.txt -CheckX500 True


NOTE: This Script would need both Exchange and ActiveDirectory PowerShell, run the script in Exchange Management Shell and make sure AD module is Installed.

Download link

#Author: Sunil Chauhan
#EMail: Sunilkms@gmail.com
#Blog: sunil-chauhan.blogspot.com
#Fix Recipient for whome you are getting IMCEAEX user not found NDR.
# Useage Examples:
# copy and paste the entire NDR to a File
#To convert to x500 from csv   : .\Fix-IMCEAEX-From-NDR.ps1 -NDRFile File.txt
#To make changes to user Account : .\Fix-IMCEAEX-From-NDR.ps1 -NDRFile File.txt -edit True
#To Verify the Changes to Account : .\Fix-IMCEAEX-From-NDR.ps1 -NDRFile File.txt -CheckX500 True
# 

#"Note: This script useses ACtiveDirectory powershell Module please make sure the same in install"

param ($edit,$CheckX500,$NdrFile)

$m=(Get-Module | ? {$_.Name -like "Activedirectory"})
if (!$m) {"Connecting AD"; Import-Module ACtiveDirectory} else {"Already Connnected AD Skip.."}

$ndr = get-content $NDRFile
$in = 0 ; foreach ($line in $ndr) { if ($line -match "Received:") {Break} else {$in++}}
$ndr = $ndr | select -Index (0..$in)
$inn = 0 ; foreach ($line in $ndr) { if ($line -match "admini") {Break} else {$inn++}}
$NameHeader= $ndr | select -Index (0..$inn)
$user=@();$n=0 ; foreach ($l in $NameHeader) {$n++ ; if ($NameHeader[$n] -match "helpdesk.") {$user+=$NameHeader[$n - 1]}}
$IMC = $ndr | ? {$_ -match "IMC"}

$file=@()
$c=0
if ($user.count -le 1) 
  {
   $newEntry = New-Object -TypeName PSObject
   $newEntry | Add-Member -MemberType NoteProperty -Name DisplayName -Value $user[0]
   $newEntry | Add-Member -MemberType NoteProperty -Name IMC -Value $IMC
   $file+=$newEntry
  }
  else {
  foreach ($u in $user) 
   {
    $newEntry = New-Object -TypeName PSObject
    $newEntry | Add-Member -MemberType NoteProperty -Name DisplayName -Value $u
    $newEntry | Add-Member -MemberType NoteProperty -Name IMC -Value $IMC[$c]
    $file+=$newEntry
    $c++
   }

   }

if ($file.count -gt 2) {$file | ft -AutoSize } else {$file | fl}

Function CleanLegacyExchangeDN ([string]$imceaex) 
 
 {
   $imceaex = $imceaex.Replace("IMCEAEX-","")
   $imceaex = $imceaex.Replace("_","/")
   $imceaex = $imceaex.Replace("+5F","_")
   $imceaex = $imceaex.Replace("+20"," ")
   $imceaex = $imceaex.Replace("+28","(")
   $imceaex = $imceaex.Replace("+29",")")
   $imceaex = $imceaex.Replace("+2E",".")
   $imceaex = $imceaex.Replace("+2C",",")
   $imceaex = $imceaex.Replace("+21","!")
   $imceaex = $imceaex.Replace("+2B","+")
   $imceaex = $imceaex.Replace("+3D","=")
   $regex = New-Object System.Text.RegularExpressions.Regex('@.*')
   $imceaex = $regex.Replace($imceaex,"")
   $imceaex # return object
 }

function AddX500
 { 
  param (
    $user,
    $X500
     ) 
   Set-ADUser $user -Add @{proxyAddresses=$X500}
 }

$data=@()
foreach ($entry in $file) 
 {
  try {
   $us = Get-Recipient $Entry.DisplayName.replace("'","" ) -ErrorAction Stop
   if ($us.count -gt 1) 
     { 
     write-host "Multiple Recipient found for user:" -n -f yellow
     write-host $Entry.DisplayName -f cyan -n
     write-host " Match SMTP from NDR" -f yellow
     Add-content -value $Entry.Displayname -path "log.txt"
     Add-content -value $(CleanLegacyExchangeDN $Entry.imc) -path "log.txt"
     $usr =$us[0].PrimarySmtpAddress.toString()
     }
   else  {
      $usr =$us.PrimarySmtpAddress.toString()
     }
    
   $newEntry = New-Object -TypeName PSObject
   $newEntry | Add-Member -MemberType NoteProperty -Name user -Value $usr
   $newEntry | Add-Member -MemberType NoteProperty -Name X500 -Value $("X500:" + $(CleanLegacyExchangeDN $entry.IMC))
   $data += $newEntry
   }
    catch{
   if ($error[0].exception -match "null-valued") 
     {                
                    write-host "Could'nt Catch Display Name From NDR." -f Red 
                    Write-host "Error Exception:" $error[0].Exception.Message
                    ""
     }
   else  {
                     write-host "Recipient Not Found or not in Correct Format" -f yellow -n 
              ""        
     }
     Add-content -value $error[0].Exception  -path "log.txt" 
    }

 }

if ($data.count -gt 2) {$data | ft -AutoSize }else {$data | fl}

function getcuX500
 {
   param ($id)
  (Get-Recipient $id).EmailAddresses | ? {$_.Prefix -match "X500"} | % {$_.ProxyAddressString}
 }

# Add X500 proxy address on user account

if ($edit) 
 {
 foreach ($u in $data) 
  {
  write-host "checking if X500 Already Exist " -f cyan
  $currentX500 = getcuX500 -id $u.User
  if ($currentX500 -like $u.x500) 
   {
    Write-Host "X500 Already Exist for:"$u.User -f green
   }
     else{ 
   Write-host "Fixing:" $u.User
   Write-host "X500Add:" $u.X500
   Addx500 -user ((Get-Recipient $u.user).SamAccountName) -X500 $u.X500 
      } 
    }
 }

# Check X500 currently availble on user Acccount
 
if ($checkX500)
  {
  foreach ($u in $data) 
   {
   ""
   write-host "Below are the currently Stampled X500 for:"$u.User -f Yellow
   $x=(Get-Recipient $u.User).EmailAddresses | ? {$_.Prefix -match "X500"} | % {$_.ProxyAddressString}
   if ($x -eq $null) 
     {
     Write-Host "No X500 Address found in Recipient ProxyAddresses List"-f cyan
     }
   else {$x}
   }
  }

Comments