Thursday, September 13, 2012

Exchange 2010/2013: Verwijder alle mailadressen met een bepaald domein

Dit is een vraag die vaak voorkomt: Hoe verwijder ik bij alle mailboxen de mailadressen in één bepaald SMTP domein? Bijvoorbeeld nadat migratiesoftware voor iedere gebruiker een @target.local of @source.local adres heeft toegevoegd en de migratie al lang klaar is. Of om mailboxen voor te bereiden voor het verplaatsen naar Office 365 in een ‘hybrid’ opstelling. Of omdat een organisatie al langer geleden op een nieuwe domeinnaam is overgestapt.

Wanneer je hier informatie zoekt dan merk je onder andere dat er verschillende manier zijn om dit aan te pakken. Wat het complex maakt is dat alle mailadressen staan opgeslagen in de Exchange-eigenschap EmailAddresses of het AD attribuut proxyAddresses. Dit is een zogenaamde mutli-valued string. Dat betekent dus dat we in PowerShell eerst alle waardes die in deze string staan op een rijtje moeten zetten, alvorens we er één of meerdere kunnen verwijderen.

Dit kunnen we doen met het volgende script:

$mailbox = Get-Mailbox –ResultSize Unlimited
$mailbox | foreach `
    {
    for ($i=$_.EmailAddresses.Count;$i -ge 0; $i--)
        {
        $address = $_.EmailAddresses[$i]
        if ($address.SmtpAddress -like "*@source.local" )
            {
            Write-host("Dit adres wordt verwijderd: " + $address.AddressString.ToString() )
            $_.EmailAddresses.RemoveAt($i)
            }
        }
    $_ | set-mailbox -EmailAddresses $_.EmailAddresses
    }

In de eerste regel worden alle mailboxen in een variabele gestopt. In de daarop volgende lus wordt voor ieder mailadres van de mailbox gekeken of het voldoen aan het filter, in dit geval *@source.local. Zo ja, dan wordt deze verwijderd uit het lijstje met mailadressen. Aan het eind van het script wordt het aangepaste lijstje weer ingesteld op de mailbox.

Wanneer je dit script wilt gebruiken is het raadzaam om eerst op één mailbox te testen of het doet wat je verwacht. Bijvoorbeeld door de eerste regel te veranderen in:

$mailbox = Get-Mailbox TestGebruiker1

Een andere mogelijkheid om bijvoorbeeld je syntax te controleren is het script uitvoeren met de –whatif parameter in de regel waarbij de aanpassingen definitief worden gemaakt:

$_ | set-mailbox -EmailAddresses $_.EmailAddresses -Whatif

Ik denk dat het geen toelichting behoeft dat je in bovenstaand script source.local even moet aanpassen aan het domein waarvan jij alle adressen wilt verwijderen. En uiteraard is deze methode ook bruikbaar voor distributielijsten. Verder werkt dis script zowel met Exchange 2010 als met Exchange 2013.

Originele versie door Lasse Petterson en aanpassingen van anderen.

No comments: